Linux之权限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之权限相关的知识,希望对你有一定的参考价值。

基础权限
  • 文件权限修改工具(chmod)
    • chmod
          修改文件权限位
      
          chmod [OPTIONS] MODE[,MODE] FILES
      
              OPTIONS:
                  -R 递归更新
                  --reference=RFILE 引用指定文件的权限位
      
              MODE表示方法:
                  字母表示法
                      rwxrwxrwx
                  数字表示法
                      777
              作用对象:
                  属主,使用‘u‘表示
                  属组,使用‘g‘表示
                  其他人,使用‘o‘表示
                  所有人,使用‘a‘表示
              操作符号:
                  + 添加权限位
                  - 删除权限位
                  = 左侧作用对象,右侧指定MODE(两侧留空为000)
      
              示例:
                  设置权限
                      chmod 644 FILE
                      chmod u=rw,g=r,o=r FILE
                  修改权限
                      chmod a+w FILE   
      
  • 文件属主属组管理工具(chown,chgrp)
    • chown
          change file owner and group
      
          chown [OPTIONS] [OWNER[:GROUP]] FILES
          chown [OPTIONS] [OWNER[.GROUP]] FILES
      
              options:
                  -R 递归修改
                  --reference=RFILE 引用文件的属主属组
      
              示例:
                  修改属主
                      chown sadan FILE
                      chown -R sadan  DIR
                  修改属组
                      chown .sadan FILE
                      chown  -R .sadan DIR
                  修改属主属组 
                      chown sadan:sadan FILE
                      chown sadan:sadan DIR
      
      
    • chgrp
          修改文件属组
              常用于当作用对象无用户
      
          chgrp [options] GROUP FILE
      
              OPTIONS:
                  -R 递归修改
                  --reference=RFILE 引用文件属组
      
              示例:
                  设置属组
                      chgrp sadan FILE
                      chgrp -R sadan FILE
      
  • 遮罩码信息
    • 权限位的计算方式
          linux权限位有默认值,文件和目录的默认值不同.
              为了防止文件有执行权限,文件的默认值为666.
              目录的默认值为777.
      
          新创建文件的权限位是由默认值与umask值直接的逻辑运算求得.
          简单理解为:
              新文件权限=默认权限-mask
      
      
    • umask
          mask是权限遮罩码,用于挡掉指定的权限位.而当原文件要挡掉的权限位不存在时,需要将其重新加回原文件权限位.
      
          umask 
              显示或设置mask值
      
              umask 显示当前shell的mask值
              umask MODE 设置mask权限
      
          root和普通用户的umask默认值不同,其设置的文件为/etc/bashrc,有效脚本为:
              UID大于199且用户名和主要组名相同的用户设置为002,其它设置为022.
                if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
                     umask 002
                  else
                     umask 022
                  fi
      
          示例1:
      
              # umask 025
              # umask 
              0025
              # touch a
              # ll a
              -rw-r---w-. 1 root root 0 Aug 31 07:52 a
      
              以上结果642,正常计算666-025=641
              rw-rw-rw-  默认权限
              ----w-r-x  umask值
              rw-r---w-  结果
      
              默认权限中没有x权限,umask中有x权限,由于umask目的是为了遮住某些权限位,
              因此减去没有的x时,需要重新将其添加回去.即6-5+1=2,得642.
      
          示例2:
      
              # umask 025
              # ll /etc/fstab
              -rw-r--r--. 1 root root 899 Aug 28  2017 /etc/fstab
              # cp /etc/fstab /tmp
              # ll /tmp/fstab
              -rw-r-----. 1 root root 899 Aug 31 07:57 fstab
      
              正常计算,默认权限-umask为644-025=620,实际显示结果为640.
              原因,使用cp复制文件时,默认权限不为666,而是文件自身的权限.
      
          总结:
              权限位的计算由默认权限-mask值
              当默认权限中遮去不存在的权限位时,减去后需要再加回来
              使用cp命令复制文件时,默认权限位是文件自身的权限位
      
特殊权限
  • SUID
         SUID是linux特殊权限位之一,作用位置owner的权限位,使用‘u‘设置.SUID的表示方法为s,或4xxx.
    
         当用户使用带有此权限的工具去对文件进行操作时,临时使用工具自身的属主去操作文件.
    
         如下:
             sadan --> cat(sadan) --> /etc/shadow
                此过程使用sadan为属主去访问shadow文件     
             sadan --> cat(root) --> /etc/shadow
                此cat添加suid权限,cat自身的属主为root,因此最后是以root为属主去访问shadow文件
    
         注意:
            SUID只对二进制的可执行文件有效.可以对任何文件设置其权限,但无效.
    
  • SGID
        SGID是linux特殊权限位之一,作用位置group的权限位,使用‘g‘设置.SGID的表示方法为s,或2xxx.
    
        作用对象为二进制的可执行文件
            当用户使用带有此权限的工具去对文件进行操作时,临时使用工具自身的属组去操作文件.
        作用对象为目录
            用户在此目录下创建的所有文件的属组都为此目录的属组
    
  • Sticky
        Sticky是linux特殊权限位之一,作用位置other的权限位,使用‘t‘设置.Sticky的表示方法为t,或1xxx.
    
        作用对象为目录
            此目录下的所创建的文件只有文件的属主能够删除,其他人无法删除.
    
  • 特殊权限的修改
        添加suid,设置suid
            chmod u+s FILE
            chmod 4xxx FILE
        删除suid
            chmod u-s FILE
        添加sgid,设置sgid
            chmod g+s FILE
            chmod 2xxx FILE
        删除sgid
            chmod g-s FILE
        添加sticky,设置sticky
            chmod o+t FILE
            chmod 1xxx FILE
        删除sticky
            chmod o-t FILE
    
  • 特殊权限的显示
    示例:
        # ll
        total 0
        ----------. 1 root root 0 Aug 31 06:29 file1
        ---x--x--x. 1 root root 0 Aug 31 06:29 file2
        # chmod u+s file1 file2
        # chmod g+s file1 file2
        # chmod o+t file1 file2
        # ll
        total 0
        ---S--S--T. 1 root root 0 Aug 31 06:29 file1
        ---s--s--t. 1 root root 0 Aug 31 06:29 file2
    
    以上总结:
        当原文件有x权限时,特殊权限位显示为小写.无x权限时,则显示为大写.
    
文件属性权限
  • 设置文件属性(chattr)
        修改文件属性
    
        chattr [options] +|- ATTR FILE
    
            options:
                -R 递归设置
            ATTR:
                i  设置此权限后,文件只读(不能删除,修改)
                a  设置此权限后,文件不能删除,修改,可附加内容
    
  • 显示文件属性(lsattr)
        显示文件属性信息
        lsattr [OPTIONS] FILE
            -R 递归显示
    
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

本文出自 “12064120” 博客,请务必保留此出处http://12074120.blog.51cto.com/12064120/1962907

以上是关于Linux之权限的主要内容,如果未能解决你的问题,请参考以下文章

Linux之创建777权限的文件

Linux之acl库的安装与使用(限制Linux某用户的访问权限)

Linux之acl库的安装与使用(限制Linux某用户的访问权限)

linux之权限之隐藏权限

Linux学习笔记之权限的管理

Linux系列教程(十六)——Linux权限管理之ACL权限