zoukankan      html  css  js  c++  java
  • linux权限管理

    文件基本权限

    -rw-r--r--
    -:文件类型(-文件 d目录 l软链接文件)
    rw-: u所有者权限
    r--: g所属组权限
    r--: o其他人权限

    基本权限的修改

    chmod [选项] 模式 文件名
    选项:
    -R: 递归
    模式:
    [ugoa][+-=][rwx]
    mode=421

    chmod u+x 文件名
    chmod g+w,o+w 文件名
    chmod u=rwx,g=r 文件名
    chmod a=rwx 文件名
    # r --- 4
    # w --- 2
    # x --- 1
    chmod 755 文件名
    

    权限的作用
    r: 读取文件内容(cat more head tail
    w: 编辑、新增、修改文件内容(vi echo),但是不包含删除文件(需要对其所在目录有w权限才可删除,文件为目录的内容)
    x: 可执行

    权限对目录的作用
    r: 可以查询目录下文件名 (ls)
    w: 具有修改目录结构的权限。如新建文件和目录,删除此目录下文件夹和文件,重命名此目录下文件夹和文件,剪切 (touch rm mv cp
    x: 可以进入目录 (cd)

    对文件来讲: 最高权限是执行x
    对目录来讲: 最高权限是写w

    其他权限命令
    chown 用户名 文件名 改变文件所有者
    chgrp 用户组 用户名 改变用户所属组(如果没有组名,则创建与用户名同名的用户组)

    让用户对文件及目录拥有一定的权限
    要求:
    拥有一个test目录
    让user1拥有所有的权限(7)
    让user2有查看的权限(5)
    其他所有人不许查看这个目录(0)

    # root登录
    mkdir test
    useradd user1
    passwd user1
    groupadd user
    gpasswd -a user1 user
    useradd user2
    gpasswd -a user2 user
    chown user1:user test
    chmod 750 test
    

    分配文件基本权限的核心原则
    在最小权限情况下能够实现要求即可!

    文件默认权限

    window中是通过继承得来的默认权限

    linux中通过umask来查看默认权限

    # 查看默认权限
    umask
    # 0022
    # 第一位0:文件特殊权限
    # 022:文件默认权限
    

    文件的默认权限
    文件默认不能建立为执行文件(安全),必须手工赋予执行权限
    所以文件默认权限最大为666
    默认权限需要换算成字母再相减
    建立文件之后的默认权限,为666减去umask值
    示例1
    -rw-rw-rw(文件默认最大权限666) 减去 ----w--w-(umask值022) 等于 -rw-r--r--
    示例2
    -rw-rw-rw(文件默认最大权限666) 减去 ----wx-wx(umask值033) 等于 -rw-r--r--

    目录的默认权限
    目录默认权限最大为777
    默认权限需要换算成字母再相减
    建立文件之后的默认权限,为777减去umask值
    示例
    rwxrwxrwx(目录默认最大权限777) 减去 ----w--w-(umask值022) 等于 rwxr-xr-x

    修改umask值
    umask=022 临时修改
    vi /etc/profile 永久修改

    ACL权限

    drwxr-xr-x. 无ACL权限(使用setfacl赋予)
    drwxr-xr-x+ 有ACL权限(使用getfacl查看)

    ACL 权限简介与开启

    ACL权限(Access Control List):用于解决用户身份不够用的情况。如用户权限rwx,用户组权限rwx,其他人没有权限;但需要给特殊的user1只读的权限

    # 查看分区ACL权限是否开启
    dumpe2fs -h /dev/sda1 # dumpe2fs命令是查询指定分区详细文件系统信息的命令
    # -h 仅显示超级块中信息,而不显示磁盘块组的详细信息
    
    # 临时开启分区ACL权限
    mount -o remount,acl / # 重新挂载根分区,并挂载加入acl权限
    
    # 永久开启分区ACL权限
    vi /etc/fstab
    # UUID=c4976561-a3be-476d-8c77-f031a241e70d /                       ext4    defaults,acl        1 1
    mount -o remount / # 重新挂载文件系统或重启系统,使用修改生效
    

    查看与设定ACL权限

    # 查看ACL权限
    getfacl 文件名
    
    # 设定ACL权限
    setfacl 选项 文件名
    # -m 设定ACL权限
    # -x 删除指定的ACL权限
    # -b 删除所有的ACL权限
    # -d 设定默认ACL权限
    # -k 删除默认ACL权限
    # -R 递归设定ACL权限
    
    # root登录
    useradd teacher1
    groupadd student
    mkdir /home/test
    chown teacher1:student /home/test
    chmod 770 /home/test
    useradd user1
    setfacl -m u:user1:rx /home/test # 给用户user1赋予r-x权限,使用 "u:用户名:权限" 的格式
    groupadd tgroup2
    setfacl -m g:tgroup2:rwx /home/test # 为组分配ACL权限,使用 "g:组名:权限" 的格式 
    

    最大有效权限与删除ACL权限

    最大有效权限mask
    mask是用来指定最大有效权限的。如果给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限

    # 修改最大有效权限
    setfacl -m m:rx 文件名 # 设定mask权限为r-x。使用 "m:权限" 的格式
    

    删除ACL权限

    setfacl -x u:用户名 文件名   # 删除指定用户的ACL权限
    setfacl -x g:组名 文件名     # 删除指定用户组的ACL权限
    setfacl -b 文件名  # 删除该文件所有ACL权限
    

    ACL默认权限与递归权限

    # 递归赋予ACL权限
    setfacl -m u:user1:rx -R /home/test
    

    权限溢出:当对目录进行递归赋予ACL权限时,若这个目录有ACL执行x权限,则目录中的文件也会赋予x权限

    默认ACL权限
    set -m d:u:用户名:rx /home/test 以后在/home/test创建的文件,将有继承/home/test的ACL权限

    sudo权限

    root把本来只能超级用户执行的命令赋予普通用户执行。
    sudo的操作对象是系统命令

    文件基本权限、ACL权限、文件特殊权限、不可改变位权限:都是针对的文件
    sudo是针对系统命令的

    sudo使用

    # 修改sudo,注意visudo,没有空格
    visudo # 实际修改的是/etc/sudoers文件
    
    # 为用户赋予权限
    # 用户名  被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
    root ALL=(ALL) ALL
    # %组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
    %wheel ALL=(ALL) ALL
    

    示例1:授权普通用户chencye可以重启服务器

    visudo
    # 添加chencye ALL=(ALL) /sbin/shutdown -r now
    # 配置的是-r,所以user1用户只能执行重启(sudo /sbin/shutdown -r now),而不能执行关机
    
    # 普通用户执行sudo赋予的命令
    su - chencye
    sudo -l # 查看可用的sudo命令
    sudo /sbin/shutdown -r now
    

    示例2:授权普通用户可以添加其他用户,注意限制修改root用户密码

    # 查看添加用户命令绝对路径
    whereis useradd
    visudo
    # 添加新建用户授权,等号后不加(ALL)时,默认为root
    # chencye ALL=/usr/sbin/useradd
    # 添加修改密码权限,注意限制修改root用户密码
    # chencye ALL=/usr/sbin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
    

    分配sudo权限时,注意限制权限大小
    如1:/usr/sbin/passwd修改root密码
    如2: /bin/vi修改用户密码文件/etc/shadow

    文件特殊权限

    SetUIDSetGIDSticky BIT都是非常不安全的权限

    umask中的第一个值就是设定这个

    SetUID

    功能
    只有可以执行的二进制程序才能设定SUID权限
    命令执行者要对该程序拥有x执行权限
    命令执行者执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
    SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

    示例:/usr/bin/passwd
    普通用户拥有/usr/bin/passwd文件的执行权限
    普通用户在调用passwd命令修改密码时,在执行passwd过程中使用的是root的身份
    普通用户执行完passwd命令后,就不具有root身份了
    普通用户调用passwd命令时,后面不能跟着用户名

    cat命令没有SUID权限,所以普通用户不能查看/etc/shadow文件内容
    ll /bin/cat

    设定SetSUID方法

    # 4代表SUID
    chmod 4755 文件名
    # 所有者设定SUID
    chmod u+s 文件名
    # 所属组设定SUID
    chmod g+s 文件名
    # 其他人设定SUID
    chmod o+s 文件名
    

    取消SetSUID方法

    chmod 0755 文件名
    chmod u-s 文件名
    chmod g-s 文件名
    chmod o-s 文件名
    

    危险的SetSUID:太危险,不要新加任何SUID权限的
    关键目录就严格控制写权限。如//usr
    用户的密码设置要严格遵守密码三原则
    对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

    特殊权限检测脚本

    suid_check.sh

    #!/bin/bash
    
    # 搜索系统中所有拥有SUID和SGID权限的文件,并保存到临时目录中
    find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
    
    for i in $(cat /tmp/setuid.check)
    do
        # 与列表对比
        grep $i /root/suid.list > /dev/null
    
        if [[ $? != 0 ]]; then
            # 如果文件不在列表中,则输出日志到日志文件中
            echo "$i isn't in /root/suid.list!" >> /root/suid_log_$(date +%F)
        fi
    done
    rm -rf /tmp/setuid.check
    
    find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
    # 去除注释与空行 grep -v ^# list | grep -v ^$ 
    # 从标准输入读取作为pattern:-f /dev/stdin  或  -f -
    grep -v ^# /root/suid.list | grep -v ^$ | grep  -vf /dev/stdin /tmp/setuid.check
    rm -rf /tmp/setuid.check
    

    SetGID

    SGID可以针对文件也可以针对目录,SUID只能针对文件

    SGID针对文件的作用,与SUID比较相似
    只有可以执行的二进制程序才能设定SGID权限
    命令执行者要对该程序拥有x执行权限
    命令执行者执行该程序时,组身份升级为该程序文件的属组
    SetUID权限只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

    示例:/usr/bin/locate
    /usr/bin/locate是可执行二进制程序,可以赋予SGID
    执行用户user1对/usr/bin/locate命令拥有执行权限x
    执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库
    命令结束,user1用户的组身份返回为user1组

    SetGID针对目录的作用
    普通用户必须对目录拥有rx权限,才能进入目录
    普通用户在此目录的有效组(一个用户可以有多个组)会变成此目录的属组
    若普通用户对此目录拥有w权限时,新创建的文件的默认属组都是这个目录的属组

    示例

    
    # root操作
    mkdir /tmp/test
    chmod 777 /tmp/test
    su - chencye
    touch /tmp/test/test2
    # 观察test2属组
    ll /tmp/test
    exit
    # root操作
    chmod 2777 /tmp/test
    # 观察权限变化
    ll -d /tmp/test
    su - chencye
    touch /tmp/test/test3
    # 观察test2与test3属组
    ll /tmp/test
    exit
    rm -rf /tmp/test
    
    

    设定SetGID
    chmod 2755 文件名
    chmod g+s 文件名

    Sticky BIT

    SBIT粘着位权限的作用: 只对目录有作用
    普通用户对该目录拥有wx权限,即普通用户可以在此目录拥有写入权限
    如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件;一但赋予粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件
    不建议手工建立拥有粘着位权限的目录

    
    # root操作
    mkdir /home/chencye/sbit
    chmod 777 /home/chencye/sbit
    touch /home/chencye/sbit/test.txt
    su - chencye
    # 可以删除
    rm -rf /home/chencye/sbit/test.txt  && echo "删除成功"  || echo "删除失败"
    exit
    # root操作
    chmod o+t /home/chencye/sbit
    # 观察权限
    ll -d /home/chencye/sbit
    touch /home/chencye/sbit/test.txt
    su - chencye
    # 不能删除
    rm -rf /home/chencye/sbit/test.txt
    exit
    rm -rf /home/chencye/sbit
    
    

    示例: ll -d /tmp

    不可改变位权限

    chattr [+-=] [选项] 文件或目录名
    i: insert 如果是文件,则不允许对文件删除、改名,也不能添加或修改数据;如果是目录,则只能修改目录下文件数据,不允许建立和删除文件。root用户也有效
    a: append 如果是文件,则只能在文件增加数据,不能删除也不能修改数据;如果是目录,则只允许在目录中建立和修改文件,不允许删除

    lsattr 文件名
    lsattr -d 目录名

    pam与selinux

  • 相关阅读:
    vb 退出窗口提示
    游戏开发 简介
    gridview 缓存 优化
    Android中Bitmap和Drawable
    解析网络 xml 流程
    vb 检测是否突然断网
    进度条
    网站广告
    android 五大布局
    VB 读写文件
  • 原文地址:https://www.cnblogs.com/chencye/p/6220946.html
Copyright © 2011-2022 走看看