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

(0)
上一篇 2016-08-04 14:39
下一篇 2016-08-04 14:40

相关推荐

  • 磁盘文件挂载与卸载

    挂载(mount)何为挂载?挂载指将文件系统与根文件系统的某个现存的目录建立起来的关联关系,这样我们就可以将目录作为访问磁盘文件的入口,进行存取交互。挂载点:挂载点指的是被挂载的对象,通常挂载点是一个目录,不过有时候也有文件作为挂载点格式:mount 设备 挂载点 ;此挂载方法味临时挂载,只在当前的shell中有效,退出则清除挂载关联设备文件在/dev/sd…

    Linux干货 2017-04-24
  • 简单shell脚本编程示例

    1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。 脚本内容: 执行结果: 2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中 脚本内容: 执行结果: 3、编写脚本/roo…

    Linux干货 2016-08-15
  • shell脚本编写-4

    1、while 循环的特殊用法(遍历文件的每一行) while read line; do 循环体 done < /PATH/FROM/SOMEFILE 依次读取/PATH/FROM/SOMEFILE 文件中的每一行,且将行赋值给变量line 练习:扫描/etc/passwd 文件每一行,如发现GECOS 字段为空,则填充用户名和单位电话为629856…

    Linux干货 2016-09-01
  • 分区块基本知识点及侧重点 — 上

        我们需要熟练了解磁盘分区原理。元数据及块设备对应inode是最重要也是最基本的原理。后面分区很多地方都和inode有关系。    一个磁盘片有63扇区,1024存储位,256个磁头,每个扇区只有前512字节是有效存储单元。所以后面磁盘清零都是跟512这个数字有关。    数据分数据区和元数据…

    Linux干货 2016-08-24
  • 马哥教育网络22期+第四周作业博客

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。    [root@centos-rpi3 skel]# cp -r /etc/skel /home/tuser1 && chmod -R g-rwx,o-rwx /home/tuser1 …

    Linux干货 2016-09-08

评论列表(1条)

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

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