Linux基础之权限管理(含SUID\SGID\STICKY和ACL)

概述

    Linux系统是一个多人多任务的操作系统,系统上同时可能有很多人登录,每个人都会利用系统上的各类资源完成一定的操作。那么如何合理的规范这些用户的行为,保证资源的合理分配,则就需要用到权限管理的相关内容了。权限管理是Linux系统上最基础,也是最重要的一部分内容,本章就简要说明下权限管理的相关内容。内容主要包含以下几个部分:

    1、权限管理的一些基础概念理解

    2、普通权限管理的相关命令详解

    3、特殊权限管理SUID、SGID、STICKY

    4、ACL相关内容

    5、chattr特殊权限简介

    本章涉及到的命令有:chmod、chown、chgrp、umask、setfacl、getfacl、chattr、lsattr

第一部分    权限管理的一些基础概念理解

    1、权限位介绍

        在Linux系统上,普通权限分为三类:读(r)、写(w)、执行(x)

        文件的从属关系也分为三类:

            属主(u):标明这个文件是谁的

            属组(g):标明该文件属于哪个用户组

            other(o):除开文件属主和属组之外的所有人

        利用命令:ls -l /etc/passwd

        可以看到:-rw-r–r– 1 root root 1701 8月   1 20:12 /etc/passwd

        其中-rw-r–r–这部分就显示了该文件权限相关的定义

        最前面一位,代表该文件的类型,主要有-、d、l、s、p、c、b等类型具体后期在进行说明。

        剩下的9位,每3位分成一个组,共3组,其中:

            左3位:代表文件的属主的权限,3位的顺序固定格式,rwx,分别代表读写执行,如果某位上为-,代表无该权限

            中3位:代表文件的属组的权限

            右3位:代表除开属主和属组之外的其他人对该文件的权限

        针对上面提到的rw-r–r–这个权限表示文件的属主,也就是对该文件有读、写权限,属组对该文件具有读权限,其他人对该文件具有读权限

    2、各权限位对文件和目录的意义

        在Linux系统上,读写执行三个权限针对文件和目录是具有不同的效果的,具体的功能如下:

        对文件而言:

            r:表示可获取文件的数据;cat、nano文件内容

            w:表示可修改文件的数据;可修改内容,不能删除文件本身,但文件内容可以删

            x:表示可将此文件发起运行为进程;针对可执行程序文件或脚本,一般的文件不需要加x权限

        对目录而言:

            r:表示可使用ls命令获取其下的所有文件列表信息,但是获取不到ls -l的详细信息

            w:表示可修改此目录下的文件列表,即创建或删除文件

            x:表示可cd至目录中,且可使用ls -l来获取所有文件的详细属性信息

        除了以上三种常见的权限表示外,还有一个权限表示:

            X:功能是递归赋权时,会自动检测是目录还是文件,目录的话,会自动加上x权限,如果是文件,就看文件之前有没有x权限,有的话,就+x权限,如果文件之前没有x权限,就不加x权限

    3、权限表示法

       针对各个权限的表示,除了常规的r、w、x之外,还有一种方法进行表示(利用二进制数字)

           001:代表执行x

           010:代表写w

           100:代表读r

       换算成十进制就是:

           r:4

           w:2

           x:1

       0-7的数字可代表—、–x、-w-、-wx、r–、r-x、rw-、rwx

           常见的权限:

           664  rw-rw-r–

           640  rw-r—–

           600 rw——-

           755  rwxr-xr-x

           750  rwxr-x—

           775  rwxrwxr-x

        

    4、UMASK介绍

        在我们创建文件或目录时,系统会自动为我们分配一些权限,这些权限是怎么得来的,这就是依赖于umask值了

        umask:文件的权限反向掩码

            能够实现在创建文件时的默认权限为:666-umask

            能够实现在创建目录时的默认权限为:777-umask

            注意:之所以文件用666去减,表示文件默认不能拥有执行权限;如果得到的结果中,仍然有执行权限,这需要将其+1

        

        系统上默认的umask值为:

            root:默认umask是022

            普通用户:默认umask是002

        

        查看umask值可以直接在命令行下:umask

        指定umask值可以直接在命令行下:umask 数字  来指定umask值,值只能是3位数字,不大于777

        umask -S 显示以权限直观方式显示创建目录时的umask,显示结果类似这种格式:u=rwx,g=rx,o=rx

        umask -p  显示uamsk本身和其值,显示结果类似这种格式:umask 0022

        

        注意:在命令行里设置的umask只对当前shell有效,退出登录后失效

        想永久生效,对当前用户生效,可放在家目录的.bashrc里面

        如果要对所有用户都生效,全局设置在/etc/profile和/etc/bashrc里面定义了关于默认umask的定义

        umask.png

       

 

    5、安全上下文

        安全上下文:

         1、进程以某用户的身份运行,进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;

         2、权限匹配模型

         a) 判断进程的属主(谁发起的进程谁就是该进程的属主),是否为被访问文件的属主;如果是,则应用属主的权限;否则进入第2步;

         b) 判断进程的属主,是否属于被访问文件的属组;如果是,则应用属组权限;否则进入第3步;

         c) 应用other的权限;

        

        通俗的理解就是:

        当A用户运行某个程序文件,例如cat,由于cat命令本身就是一个二进制程序文件,那么此时就对cat文件的权限进行判断,A属不属于cat文件的属主,如果属于,查看cat文件上关于属主的权限的定义,根据权限的定义来判断A能对cat文件进行哪些操作;然后如果A不属于cat的属主,就判断A是不是cat文件的属组,如果属于属组,那就根据属组权限定义的权限,对cat文件能执行哪些操作,如果既不属于cat的属主,又不属于文件的属组,那么就执行cat文件上关于其他用户的权限定义,根据定义的权限,执行相应的操作。那么通过查看,我们发现A既不属于cat文件的属主,也不属于文件的属组,就执行了关于其他人的权限,其他人的权限具有x权限,就是执行,故A可以运行cat命令。

        当A执行cat命令时,如果cat程序需要调用一个文件,例如我们执行cat /etc/passwd  此时,一旦cat程序运行起来,那么A就是cat进程的属主,该进程是发起此进程的用户的代理,也就是说,cat进程调用的一些资源,当请求/etc/passwd时,请求的身份是cat进程的身份,此时,cat进程的身份是A,那么就判断A用户对/etc/passwd文件的权限是什么,就对应的可以进行哪些操作

第二部分    普通权限管理的相关命令详解

    1、chmod命令

         格式:

         chmod [OPTION]… MODE[,MODE]… FILE…

                chmod [OPTION]… OCTAL-MODE FILE…

              chmod [OPTION]… –reference=RFILE FILE…

          三类用户:

          u:属主

          g:属组

          o:其他

          a:所有

          选项:

              -R  表示递归修改目录及其子目录和文件的权限

    

        用法一、chmod [OPTION]… MODE[,MODE]… FILE…

            MODE表示法

                赋权表示法(直接操作一类用户的所有权限位):u=、g=、o=、a=、ug=、uo=、…..

                    如:chmod g=rx /test/11.xx

                    chmod uo=rx /test/11.xx

                    chmod u=rx,g=w /test/11.xx

                授权表示法:直接操作一类用户的一个权限位:u+、u-、g+…..

                    如:chmod u-x /test/11.xx

                    chmod o+r /test/11.xx

                    chmod ug+x /test/11.xx

                    chmod ug-rx /test/11.xx

                    chmod u-r,g+x /test/11.xx

        chmod2.png

                

        用法二、chmod [OPTION]… OCTAL-MODE FILE…(八进制权限表示)

          例如:chmod 660 /test/11.xx

        chmod2.png

        用法三、chmod [OPTION]… –reference=RFILE FILE…(依照别的文件权限,给指定文件赋权)

          例如:chmod –reference=/etc/issue  /test/11.xx

        chmod3.png        

       

         注意:普通用户仅能够修改属主为自己的文件的权限

       

     2、chown命令

         语法:chown [OPTION]… [OWNER][:[GROUP]] FILE…

                  chown [OPTION]… –reference=RFILE FILE…

            选项:

         -R:表示递归修改

         例如:chown -R nwc:newbee /test/

               chown newbee  /test/11.xx

               chown nwc.newbee /test/11.xx

        chown1.png

         第二种用法:

             chown –reference=/etc/issue /test/11.xx

        chown2.png

    3、chgrp命令

        具体用法与chown类似,但是chgrp只能用来更改文件或目录的所属组

        chgrp.png

   

 

第三部分    特殊权限管理SUID、SGID、STICKY

    1、SUID

        功能:设置了SUID权限后,当用户运行某二进制程序文件时,该进程的属主不是进程发起者,而是进程二进制程序文件本身的属主

        作用对象:二进制可执行程序文件

        前提条件:执行二进制程序的用户必须要对该二进制程序具有执行权限

        展示位置:属主的x位,如果属主有x,则显示为s,如果属主没有x,则显示为S

        设置方法:

            chmod u+s FILE

            chmod 4XXX FILE

        取消方法:

            chmod u-s FLIE

        suid1.png

        suid3.png

    2、SGID

        功能:

            针对二进制程序文件而言:

                对二进制程序文件设置了SGID权限,则进程的属组不是发起进程的用户的主组,而是会变成程序文件本身的属组

            针对目录而言:      

                当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;

                可理解为:一般是一个小组协同工作时,创建一个协同目录,让这个目录拥有SGID权限,然后小组内的人都在同一个属组内,让此属组对该目录有写权限,这样,小组内的人在这个目录下创建文件时,文件的属组就变成了该目录的属组,这样组内的其他人就对文件具有写权限了,实现了小组工作的协同,但此时组内的人也能删出其他人创建的文件,为了防止这种情况发生,就有了STICKY权限

        作用对象:二进制程序文件和目录

        前提条件:对二进制程序文件有x权限,对目录而言有w和x权限

        展示位置:文件或目录的属组的执行权限位,如果属组有x,则显示为s,如果属组没有x,则显示为S

        设置方法:

            chmod g+s FILE|DIR

            chmod 2XXX FILE|DIR

        取消方法:

            chmod g-s FILE|DIR

        

        例如:在对二进制程序执行SGID权限时:

        sgid1.png

        

        在对目录执行二进制权限时:

        sgid11.png

        sgid22.png

        sgid33.png

        

    3、STICKY

        功能:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户,在此目录中都能创建新文件或删除所有的已有文件;如果为此目录设置了Sticky权限,则每个用户能创建新文件,只能删除自己的文件,无法删除组内其他用户创建的文件

        作用对象:目录

        前提条件:属组或全局可写的目录,目录有执行权限

        展示位置:other的执行权限位,如果other原本有执行权限,显示为小写t,否则,显示为大写T

        设置方法:

            chmod o+t DIR

            chmod 1XXX  DIR

        取消方法:

            chmod o-t  DIR

        sticky.png

第四部分    ACL相关内容

    1、ACL基础介绍

        假设一种情况,针对某文件,我们不希望个别人访问,这个问题如何解决。如果改掉原文件本身的权限,这样势必造成影响范围过大,原本只是不希望某一个人不能访问的,改掉文件本身的权限之后,可能造成大部分人都访问不了,这样,势必就不利于资源的合理规划和利用。那么为了解决这种情况,就有了ACL访问控制列表这种权限控制机制。

        ACL提供了除了文件的属主、属组、其他人之外的另外一种灵活控制文件权限的机制。支持对个别的人,或组设置单独的策略。

        但是ACL的实现,要基于文件系统支持,可以在文件系统创建的时候,利用-o acl指明默认支持acl挂载选项,如:

            mke2fs -t ext4 -b 1024 -m 2 -L TEST -o acl /dev/sdb5

        或者在挂载的时候利用-o acl 指明支持acl挂载选项

            mount -o acl,remount /dev/sdb5

    2、查看ACL

        在设置了ACL权限的文件或目录上,能够通过查看文件的详细信息ls -l FILE来查看,权限位后面如果有+加号,则表示该文件有ACL权限

        在知道该文件有ACL权限之后,可以利用getfacl FILENAME来获取相应ACL权限的详细信息。例如:

        get1.png

        

        # file: scripts/    标识了文件名

        # owner: root       标识了文件属主

        # group: root       标识了文件属组        

        user::rwx           标识了文件自身属主拥有的权限

        user:nwc:rwx        标识了nwc用户对文件拥有的权限

        group::r-x          标识了文件自身属组的权限

        mask::rwx           标识了该文件的各个用户的最高权限基准

        other::r-x          标识了文件自身other的权限

        

    3、设置ACL

        想要实现设置ACL规则,需要利用setfacl命令来实现,setfacl的用法如下:

        语法:setfacl [选项] -m|-x 权限表达式 FILE…

              setfacl [选项] -M|-X 权限表达式文件 FILE …

        选项:

            -b FILE|DIR:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留

            -k DIR:删除默认的acl规则 

            -R,–recursive:递归的对所有文件及目录进行操作 

            -m  表示设置ACL规则

            -x  表示取消ACL规则

            -M FILE  表示从指定的文件中读取规则,并以此为模板,设置指定文件中的规则

                    FILE格式为:u:username:mode

                                g:groupname:mode

                                ……

            -X FILE  表示从指定的文件中读取规则,并以此为模板,删除指定文件上的规则

                    FILE格式为:u:username

                                g:groupname

                                ……

            -n,–no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。 

            –mask:重新计算有效权限,即使ACL mask被明确指定

            –set 表示重新设置ACL的权限,用新的代替,需要注意的是,新的ACL规则中必须要包含文件自身的权限定义,也就是类似:

                    u::rwx     g::r-x    o:: 这三种,中间没有指明任何用户的规则

                   –set的用法:setfacl –set u::rwx,g::r,o::,u:nwc:rwx – FILE

            –set-file 以文件为模板,创建指定文件的ACL。如:

                    getfacl FILE1 | setfacl –set-file=-  FILE2表示复制FILE1的ACL权限给FILE2

                     

        权限表达式:

            [d:] u:username:mode 指定用户的权限,如果username为空,表示设置文件所有者的权限。加d:表示设置的是默认规则

            [d:] g:groupname:mode 指定群组的权限,如果groupname为空,表示设置文件所有群组的权限。加d:表示设置的是默认规则

            [d:] m: :mode 指定mask权限, 加d:表示设置的是默认规则

            加上d:设置了默认规则之后,表示在此之后在该目录下新建的文件或目录都默认具有的ACL权限,但现有文件和目录本身还是要另外单独设置ACL规则

        示例:

            环境Centos6.8,管理员为root,测试普通用户为nwc、nwc2;测试组为testgroup1(组内有普通用户test1user1、test1user2)、testdir2(组内有普通用户test2user1、test2user2);测试目录为/testdir/acl_dir,测试文件为/testdir/file

        <1>在没有设置任何acl权限之前,所有的普通用户、组均不为目录或文件的属主或属组,且对文件和目录均没有任何访问权限

        acl2.png

        

        <2>对/testdir/file1设置acl权限,让nwc用户具有rwx权限,让testgroup1组具有rx权限

        acl3.png

        

        <3>通过-M FILE和-X FILE批量增加或删除acl权限

        acl11.png

        acl22.png

        <4>通过 -R对/testdir/acl_dir设置递归权限,让该目录下已经存在的文件或目录自动按照递归acl设置的权限继承

        acl33.png

        acl44.png

        <5>通过对/testdir/acl_dir设置目录的默认权限,让在该目录中的新建的文件或目录自动继承默认权限

        acl1.png

        acl2.png

    4、ACL中mask

        在getfacl获取详细acl权限列表中,我们可以看到有mask这个权限的相关信息,在linux系统里面大家都知道比如对于r–rw-r–来说, 中3位那个rw-是指文件属组的权限, 但是一旦该文件设置了ACL权限,那么当中那个rw-代表的就是mask值而不再是文件属组的权限了
        acl3.png

        可以看到初始尚未设置acl之前,属组的权限位就是代表属组本身的权限,当一旦设置了acl权限之后,在查看属组的权限位,就变成了跟mask一致的权限

        接下来,我们设置testgroup1的acl权限为rwx,然后更改mask的设置,通过比对,我们查看文件权限发生的变化

        acl4.png

        acl5.png

        可以发现,一旦设置设置了mask之后,发现之前设置的权限,如果权限超过mask权限,后方都会显示一个#effective的条目,代表真正生效的权限,其实,mask就是起到限定设置acl的最高权限的作用,如果此时查看该文件本身的权限信息,发现属组权限位的信息也随着mask的修改而改变了:

        acl6.png 

          

    5、备份和恢复ACL

        在日常备份文件目录时,通常的cp命令,通过-a或者-p选项都可以保留acl属性进行复制,但是如果要用tar等压缩文件就无法保留文件的acl属性信息了,这样就需要利用其它方式进行acl备份了

        备份:

            获取文件或目录的acl权限列表,然后保存到文件中:

            getfacl -R /DIR >ACL_BAK_FILE

        恢复:

            将之前备份的权限文件恢复到文件中

            setfacl -R –set-file=ACL_BAK_FILE  /DIR

        acl1.png

        acl2.png

第五部分    chattr特殊权限管理(对管理员依然有效)

        chattr +A FILE   可以禁止访问时更改访问时间atime

        chattr +i FILE   表示只能读,不能删除,修改内容,改名

        chattr +a FILE   表示只能读,能修改内容,不能删除,改名,移动

        取消对应的权限可以将+改为-

        查看附加的权限有哪些可以用lsattr

        chattr1.png

        chattr2.png

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/28030

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-07 23:02

    文章整体思路清晰,每一个命令用法都有了详尽的总结与操作。