linux之权限
ACL
  • acl启用

        acl(access control list),用于灵活控制权限
    
            要使用acl功能首先要启用此功能,acl功能在挂载磁盘时启用,CentOS7上挂载时会自动开启此功能.
    
            查看默认挂载选项
            #  tune2fs -l  /dev/sda1 |grep acl
            Default mount options:    user_xattr acl
    
            手动挂载时开启
            # mount -o acl /dev/DEVICE /MOUNT_DIR
    
            ACL生效顺序:
                owner --> acl_owner --> group,acl_group(谁的权限大就使用谁的权限位) --> other
  • acl设置和查看(setfacl,getfacl)

    • setfacl,getfacl命令

          setfacl 
              设置文件ACL
      
              setfacl [options] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
              setfacl --restore=file
      
                  options:
                      -b 清空ACL规则及结构
                      -k 删除默认ACL
                      -R 递归操作
                      --set-file=-|FILE  '-'表示标准输出,根据stdin或文件内容设置acl规则
                              例:getfacl file1 | setfacl --set-file=- file2
      
                  -m|-x : '-m'设置acl规则,'-x'删除指定acl规则(从命令行获取acl_spec)
                  -M|-X : 同'-m'和'-x',从文件或标准输出获取acl_spec
      
                  acl_spec:
                      [d:] [u:]uid|username [:perms]    
                      [d:] g:gid|groupname [:perms]
                      [d:] m[:] [:perms]
                      [d:] o[:] [:perms]
      
                      u:  设置对象为owner
                      g:  设置对象为group
                      o:  设置对象为other
                      d:  设置默认acl
                      m:  设置mask
                      perms  权限位 
      
          getfacl 
              显示文件acl规则
      
              getfacl [options] file ...
      
                      -R 递归查看
    • 权限生效顺序

      - 1 验证owner与acl_owner顺序
      
          分别设置owner与acl_onwer权限为400,000.实验其结果,再将权限设置交换,再次验证其结果.
      
          1.1 owner 400 acl_owner 000
      
              设置相关环境
              # echo 123 > /tmp/a
              # cd /tmp
              # chmod 400  a
              # chown liubei a
              # ll a
              -r--------. 1 liubei root 4 Aug 31 09:44 a
              # setfacl -m u:liubei:--- a
              # getfacl a|grep user
              user::r--
              user:liubei:---
      
              进入liubei用户查看文件:
              # su - liubei
              $ cat /tmp/a
              123
      
          1.2 owner 000 acl_owner 400
               # chmod 000 a
               # setfacl -m u:liubei:r-- a
               # getfacl a|grep user
               user::---
               user:liubei:r--
      
               进入liubei用户查看文件:
               # su - liubei
               # cat /tmp/a
               cat: a: Permission denied
      
          结论:
              owner优先于acl_owner
      
      - 2 验证group与acl_group顺序
      
          实验说明:
              分别设置group,acl_group权限为050,040,查看结果.再将权限设置交换,查看结果.
      
          2.1 group 050 acl_group 040
      
              设置相关环境
              # vim /tmp/a.sh
                  #!/bin/bash
                  echo hello
              # cd /tmp
              # chmod 050 a.sh
              # chgrp liubei a.sh
              # setfacl -m g:liubei:r-- 
              # getfacl a.sh |grep group
                  # group: liubei
                  group::r-x
                  group:liubei:r--
      
              切换liubei验证结果
              # su - liubei
              $ cd /tmp
              $ cat a.sh
                  #!/bin/bash
                  echo hello
              $ ./a.sh
              hello
      
          2.2 group 040 acl_group 050
      
              设置相关环境
              # chmod 040 a.sh
              # setfacl -m g:liubei:r-x a.sh
              # getfacl a.sh |grep group
                  # group: liubei
                  group::r-x
                  group:liubei:r-x
      
              切换liubei验证结果
              # su - liubei
              $ cd /tmp
              $ cat a.sh
                  #!/bin/bash
                  echo hello
              $ ./a.sh
              hello
      
          结论:
              group和acl_group根据权限大小来决定谁生效.
      
      - 3 结果
      
          owner > acl_owner > group,acl_group(权限大小) > other
      
          此处不证明other与acl_other
    • acl中的mask作用

          acl中mask代表了acl的最高权限上限.
          其mask影响acl_user,group,acl_group,acl_other的权限位.
          其权限必须在mask权限范围内才可生效.
      
          mask在设定其它类型的acl规则时,会根据所有权限进行逻辑与后的值进行更新.
              例:
                  设置acl_owner为-w-,再将mask值修改为rwx.
                  现在添加一个acl_group为r--,再次查看mask.
      
                  # touch a
                  # chmod 700 a
                  # setfacl -m u:liubei:-w- a
                  # setfacl -m m:rwx a
                  # getfacl a |grep -E 'user|group|mask'
                      # group: root
                      user::rwx
                      user:liubei:-w-
                      group::---
                      mask::rwx      此时mask值为rwx
                  # setfacl -m g:liubei:r-- a
                  # getfacl a|grep -E 'user|group|mask'
                      # group: root
                      user::rwx
                      user:liubei:-w-
                      group::---
                      group:liubei:r--
                      mask::rw-       此时mask值变为rw-
      
          大于mask的无效acl示例:
      
              # echo 123 > /tmp/a ;cd /tmp
              # chmod 000 a
              # chgrp liubei a
              # ll a
              total 0
              ----------. 1 root root 0 Aug 31 10:54 a
              # setfacl -m g:liubei:r-- a
      
              此时用liubei用户查看a
              # su - liubei
              $ cat /tmp/a
              123
      
              接着修改mask值为---
              # setfacl -m m:--- a
              # getfacl a|grep group
                  # group: liubei
                  group::---
                  group:liubei:r--    #effective:--- 
      
              此时再次使用liubei用户查看a
              # su - liubei
              $ cat /tmp/a
              cat: a: Permission denied
      
          注意:
              #effective:--- 表示的是权限大于mask的权限位会失效,当其他小于的权限位依然会有效.
              如 #effective:-w-   表示只生效了w权限
      
          建议:
              mask最后设置
              临时将所有用户都设为0权限,直接将mask设为---
    • default作用

          默认acl的设置是为了能够在目录下创建的文件继承其acl规则.
      
              默认acl规则只对未来创建的文件生效,不对当前已存在文件生效.
      
              示例:
      
                  # cd /tmp
                  # mkdir a
                  # touch a/b
                  # chgrp -R  liubei a
                  # setfacl -Rm d:g:liubei:rwx a
      
                  # getfacl -R a
                      # file: a/
                      # owner: root
                      # group: liubei
                      user::rwx
                      group::r-x
                      other::r-x
                      default:user::rwx
                      default:group::r-x
                      default:group:liubei:rwx
                      default:mask::rwx
                      default:other::r-x
      
                      # file: a//b
                      # owner: root
                      # group: liubei
                      user::rw-
                      group::r--
                      other::r--     没有默认acl
                  # touch a/c
                      # getfacl a/c 
                      # file: a/c
                      # owner: root
                      # group: root
                      user::rw-
                      group::r-x          #effective:r--
                      group:liubei:rwx        #effective:rw-    默认acl生成
                      mask::rw-
                      other::r--
  • acl备份和恢复

        主要的文件操作命令cp和mv都支持ACL,只是cp命令需要 加上-p 参数.
        但是tar等常见的备份工具是不会保留目录 和文件的ACL信息
    
            导出规则
            getfacl -R /tmp/dir1 > acl.txt
            清空规则
            setfacl -R -b /tmp/dir1 
            恢复规则
            setfacl -R  --set-file=acl.txt  /tmp/dir1
            setfacl --restore acl.txt 
            查看规则
            getfacl -R /tmp/dir1
    
        总结:
            备份的规则只能在原目录中生效
命令总结:
chmod,chown,chgrp,umask,chattr,lsattr,setfacl,getfacl