文件权限其实就是用户和用户组对文件或目录进行操作的权力。

文件的属性

     

    上图中显示详细信息文件的详细属性,以最后一行为例从左向右依次说明:

    1、drwxr-xr-x.  

        左起第一位:表示文件的类型,其中包括以下类型:

            -:普通文件

            d:目录

            l:符号链接文件(软链接)

            c:字符设备

            b:块设备

            p:命令管道

            s:套接字文件

        后面的9位:表示权限

        . :表示文件有隐藏属性;

            可以使用命令lsattr来进行查看;

    2、数字(2)

        表示此文件被硬链接的次数;

    3、第一个root

        表示文件或目录属主;

    4、第二个root

        表示文件或目录属组;

    5、数字(4096)

        表示文件的大小,以字节为单位;

    6、Feb 3 20:54

        表示文件最近一次的修改时间;

    7、最后一项(Downloads)

        表示文件名;


文件的基本权限

    文件的权限    
        

        上面这一串字符中,第一位是文件的类型,后面的9位是文件的权限,一共包括4种不同的权限,分别为:

             r:表示读权限;

             w:表示写权限;

             x:表示执行权限;

             -:表示没有权限。

        这9位的权限以三位为一组,共分成三组,分别代表属主、属组和其它用户的权限;                  

                   d           rwx    r-x     r-x

                 文件类型     属主   属组   其它用户

            属主:表示文件或目录的所有者;

            属组:表示文件或目录的所有组;

            其它用户:表示既不是属主,也不是属组成员的用户;

            注意:root用户不受权限的限制。

            上例表示文件的属主拥有读写执行的权限;文件的属组和其它用户拥有读和执行的权限。

    权限对于目录和文件的不同意义

        权限对于文件的影响

            r:可读取文件的内容;

            w:可以编辑、修改文件的内容,但不能删除文件本身;

            x:可以被执行的权限,通常用于脚本。

            对于文件来说,权限主要是针对文件的内容而定义的,直接影响的是文件内的数据,如果想要删除文件则需要定义文件所在目录的权限。

        权限对于目录的影响

            r:可以浏览目录下的文件名,也就是说可以使用ls命令来查看目录中的内容;

            w:可以更改目录中的内容,其中包括以下操作:

                新建文件和目录;

                删除文件和目录;

                重命名文件和目录;

                移动文件和目录。

            x:表示用户是否可以进入目录作为工作目录,也就是说是否能够使用cd命令进入到目录中。

            下面举例进行说明:

            

            虽然test文件是用户rot所拥有,但由于只有r权限,依然不能修改文件的内容;

            

             这是test文件所在的目录的权限,可以看到rot用户对此目录拥有读、写、执行的权限;

            

             在test目录中删除test文件,可以正常删除,说明文件写(w)权限并不对文件本身的存在与否生效,如果我们将目录的(w)权限去掉,看下是否可以删除目录中的文件;

             

            现在目录中的w权限已经全部去除;

            

            再来删除目录中的文件,已经不能成功操作了。

            我们将test目录的r权限去除,如下图:

            

            可以查看目录本身属性,但是目录的内容却不能浏览了;此目录拥有了x权限,也就是说可能切换到test目录中,如下图:

            

            

            虽然已经进入了目录,而且由于拥有了w权限,还可以在目录中对文件进行操作,但还是无法浏览目录中文件列表。

            现在我们去掉x权限来看一下效果;

            

            我们给予了除了x的所有权限,目录已经无法进入了。

        注意:如果要开放目录给任何人浏览时,应用至少开放r和x权限,否则目录将无法正常查看。

    权限的匹配顺序

        当一个用户访问文件或目录时,是依照以下顺序进行权限匹配的:

            1、如果此用户为访问文件或目录的属主,则匹配属主的权限;否则

            2、如果此用户为属组的组成呗,则匹配属组的权限;否则

            3、匹配其他用户的权限。

    修改文件的属性与权限

        通过以下命令来进行文件的属主、属组修改以及权限的修改。

        chgrp:改变文件的属组;

            格式:chgrp [-R] 属组名 文件名/目录名

                -R:递归修改;

                

                

        chown:改变文件的属主;

            格式:chown [-R] 属主名:属组名 文件名/目录名

            此命令即可以单独修改属主或属组,也可以同时修改属主和属组;

                

                

                

                

        chmod:修改文件的权限;

            文件权限的表现方法有两种,一种是用字符表示(-rwxrwxrwx),另一种是使用数字来表示(777)。

                格式:chmod [-R] 文件权限 文件名/目录名

            使用字符改变文件权限的方法:

                权限共有9位,每3位为一组,共分为3组,分别表示属主、属组和其它用户;使用字符来代表不同的用户:

                    u:属主

                    g:属组

                    o:其他用户

                    a:所有用户

                 权限的操作符:

                    +:增加权限

                    -:去除权限

                    =:设置权限

                

            使用数字改变权限的方法

                权限还可以使用数字表示,分别对应为:

                    r:4

                    w:2

                    x:1

                    -:0

                 例如:-rwxr-xr-x所对应的数字为[4+2+1][4+1][4+1]=755

                      

    上面介绍的三个命令在进行设置时,还可以参考其它文件的属性或权限进行设置。

        –reference :参考其它文件的已有设置对文件进行设置。

        格式:chgrp/chown/chmod –reference 源文件 目标文件

            

            上例中是参考文件b的属组来设置文件a的属组。

            

            上例则是参考文件b的属主和属组来设置文件a。

            

            参考文件b的权限来设置文件a。    


修改默认权限

    当我们新建文件和目录时,会发现文件和目录的权限是不一样的,如下图

    

     创建后并没有做任何的修改,但文件的权限为644,而目录的权限为755,这是什么原因造成的呢?

     其实Linux系统默认情况下新建文件的默认权限为666,而目录的默认权限为777,而我们创建文件和目录的权限是经过默认权限与权限掩码计算的结果;我们可通过命令来修改掩码,调整默认权限。

     umask:修改掩码

        此命令不带参数使用时,直接以数字方式显示出掩码值

        

        使用-S参数时,则会以字符形式显示出权限

        

         使用umask命令查看掩码值为0022,我们只看后三位,即002,第一位的含义将在后面进行说明;文件和目录的权限是通过默认权限减去掩码值的结果,如文件的权限:666-022=644;目录的权限:777-022=755

        我们可以直接使用umask命令来修改掩码值,如下图:

            

        不过在命令行使用umask命令进行的修改是临时的设置,如果想要永久生效可以将umask命令可写到/etc/bashrc或者~/.bashrc;

            /etc/bashrc:全局配置,作用范围为所有用户;

            ~/.bashrc:用户配置,作用范围为当前用户。

        root用户的默认umask值与普通用户的umask不同,root用户默认为022,而普通用户默认为002。

        注意:如果文件权限666-umask的值中了现执行权限,则对应的权限会被加1,并生成有效权限。

            例如:umask=0003,那么新建的文件权限为663,此时系统会将663+1,即文件权限为664。

                


文件的特殊权限

    SUID:Set UID

        文件具有SUID的权限,那么此文件做为进程运行时,进程的有效身份不是发起者,而是文件自身的属主;

        下面举例说明:

        我们知道任何用户都可以使用passwd命令来修改自己的密码,先来看一下passwd命令的权限;

            

            上图中的"s”就表示此文件拥有SUID权限

        用户的密码都是存储在/etc/shadow文件中,来看一下这个文件的权限;

            

            可以看到此文件没有任何开放的权限;

            

            使用普通用户连查看的权限都没有,而使用passwd命令却可以修改密码,这是因为当普通用户使用passwd命令的时候,运行命令的身份并不是普通用户本身,而是passwd文件的属主root,而root用户不受文件权限的限制,所以任何用户都可以获得root的身份来修改自己的密码。

        修改SUID权限

            chmod u+s  FILE

                

    SGID:Set GID

        将目录的属组设置SGID后,属组中的组成员在此目录中所创建的文件的属组不要是用户的基本组,而是目录的属组。

        新建一个组t1,并将目录test的属组更改为t1;

        

        将rot用户加入到t1组中;

         

        在不添加SGID权限时,用户rot在目录test中创建文件,可以看到文件的属组为rot;

        

        添加SGID权限后,再次创建文件发现属组为t1。

        

        

        修改SGID权限

            chmod g+s  FILE  

                格式与用法同SUID相同,不再给出实例。

        SGID也可以针对文件来设置,其用法与SUID类似,设置了SGID的程序,在运行时获得文件属组的权限。

        SGID通常使用在多人同时合作一个项目工作时,将项目组成员加入到同一个附加组中,这样任何组成员创建的文件组内其他成员也同时具有访问和修改的权限,但同时也会出现一个问题,由于SGID是设置在目录上的权限,那么要在目录中创建和修改文件就必须分配写(w)权限,这样删除文件的权限也同时被授予的了组成员,造成安全隐患;我们可以通过设置沾滞位来解决这个问题。

    SBIT:Sticky Bit

        对目录设置此权限后,用户在目录中只能删除自己创建的文件和目录,而无权删除其它用户所创建的文件和目录。

            对目录test设置SBIT权限;

        

            使用rot用户在目录test中创建文件;

        

            目录test的权限为777,所以任何用户都可以在目录中内容做添加、删除操作,但是使用t4用户却无法删除a1文件。

        

            修改SBIT权限

            格式:chmod o+t  FILE

    使用数字来表示特殊权限

        在查看umask值时有4位数字,后三位为属主、属组、其它用户的权限,第一位就是特殊权限位,其对应的数字如下:

            SUID:4

            SGID:2

            SBIT:1

         例如:权限为-rwsr-xr-x用数字表示为:4755

     有一种情况,我们有时会看到特殊权限位使用大写的S和T来表示,这是因为其缺少相对应的执行权限,如:

        

        文件a 没有任何的执行权限,那么此时加上特殊权限的话,会出现以下情况:

        

     特殊权限的作用对象

        SUID:文件

        SGID:目录和文件

        SBIT:目录 


文件的隐藏属性

    上面我们在介绍文件属性时,9位权限位后面有一个“.”表示文件有隐藏属性,下面我们就来了解一下文件的隐藏属性。

    使用lsattr命令来查看文件的隐藏属性;

        

    使用chattr命令来修改文件的隐藏属性;

        chattr +属性 文件名

        常用属性:

            a:只能追加内容;

            i:不可以修改;

            u:不可以删除;

            A:不更改访问时间戳。

        下面举例说明:

             给文件a添加属性a,如下图:

            

            向文件a中追加内容;

            

            将文件a中的内容进行覆盖;

            

            修改文件中的内容是不被允许的。

            此功能可用于设置日志文件,既可以保证日志的安全,又能够满足持续向日志文件进行写操作的需求。

            其它属性此处不再进行演示,可以自行进行实验查看效果。


FACL:文件访问控制列表

    用于提供除属主、属组、其它用户的读、写、执行权限以外的具体权限的设置。可以针对单一用户、单一文件或目录来进行读、写、执行的权限设置,对于有特殊要求的权限设置非常有帮助。

    设置ACL

        getfacl 文件名

            查看文件或目录的ACL信息。

            

            上图的显示的了ACL的详细信息,其中包括文件名、属主、属组、特殊权限(上图中为SUID)、以及对应的权限。

        setfacl [-bkRd] [ {-m|-x} acl参数 文件名

            参数:

                -b:删除所有的ACL参数;

                -k:删除默认的ACL参数;

                -R:递归设置;

                -d:设置默认ACL参数;

                -m:设定ACL参数;

                -x:取消设定ACL参数。

            acl的设定格式:

                用户:u:[用户列表]:[rwx-]

                    设置用户rot对于文件a有读写权限;         

                    

                    设置ACL后可以看到在权限位后出现一个“+”;

                    

                     查看文件a的acl权限

                    

                    测试acl权限

                    50.png

                    从上图可以看到用户rot在other权限为只读的情况下依然可以向文件a中写入数据;

                    51.png

                    而使用用户t5只没有写权限

                组:g:[组列表]:[rwx-]

                    52.png

                    53.png

                    用户组与用户的设置基本相同,此处不再详述。

                mask:m:[rwx-]

                    mask表示用户或用户组的权限必须要在mask的权限范围内才能生效;

                    54.png

                    上图中用户和组都具有读和写的权限,但mask规定只能有读的权限;

                    55.png

                    此时用户rot再向文件a中写入数据时就会提示没有权限了。

                    不过在设置时为了避免造成混乱umask一般都设置为rwx。

                设置默认acl:d:[ug]:用户列表:[rwx-]

                    只能作用于目录;

                    56.png

                    在test目录中新建文件夹t5并查看acl,可以看到用户t5的权限已被加到文件夹中。

                    57.png

            -R参数:

                对目录rot进行递归授权,则不但目录rot的权限被改变;

                58.png

               目录中的文件的权限也被同时改变了。

                59.png

            递归授权与设置默认权限操作的区别在于,递归授权是对目录中现有的文件或目录进行操作,而对于新增的文件或目录则没有影响;默认权限则是对于目录中新增的文件或目录进行权限设置,而对于在设置默认权限时目录中已经存在的文件或目录没有影响。

            -x参数:

                删除指定的权限设置

                62.png

                删除t4用户的权限;

                63.png            

            -k参数:

                删除默认权限的设置

                60.png

                61.png

            -b参数:

                删除所有acl的权限设置;

                64.png

                65.png

                66.png

    应用ACL后权限的匹配模型:

        1、访问文件或目录的用户是否为文件的属主,是则匹配属主的权限,否则;

        2、查找ACL中是否有此用户的权限设定,有则匹配ACL中的权限,否则;

        3、用户是否为文件属组的组成员,是则匹配属组的权限,否则;

        4、查找ACL中是否有用户组的权限设定,有则查找用户是否属于此用户组,有则匹配ACL中的权限,否则;

        5、匹配其它用户的权限。