第四章 文件权限

发布时间 2023-10-27 18:43:38作者: Wybzyx

一、基本权限UGO

       权限的意义在于允许某一个用户或某个用户组以规定的方式去访问某个文件。例如,Apache服务进程默认由Apache用户访问,除了root用户以外,其他用户均不能访问相关进程,这样就能通过在文件上设置用户或用户组的访问方式达到限制目的。

首先介绍U、G、O这三个字母所代表的含义。

U:owner,属主。G:group,属组。O:other,其他用户。

Linux系统通过U、G、O将用户分为三类,并对这三类用户分别设置三种基本权限,这种设置权限的方式称作UGO方式,如图4.2所示。

使用ll命令查看文件属性,第1行的第2~10个字符每3个字符为一组,左边3个字符表示属主的权限,中间3个字符表示属组的权限,右边3个字符是其他用户的权限。

每组的3个字符的具体含义如下所示。

r:read(读取),数字设定为4。

w:write(写入),数字设定为2。

x:execute(执行),数字设定为1。

例如,创建一个文件file1,使用ll查看文件属性信息。

其中,owner的权限为“rw-”(读取与写入),数字可表示为4+2=6;group的权限为“r--”(读取),数字可表示为4;other的权限也为“r--”(读取),数字可表示为4。

1.1 设置文件属性与权限

       为了数据的安全,系统需要给予不同身份的用户、用户组对应的文件权限。下面讲解三个常用的修改权限命令,具体如下所示。chown:修改文件属主、属组。chgrp:修改文件属组。chmod:修改文件权限。

例如,创建文件file2,查看文件当前的属主,使用chown命令修改文件的属主,将文件属主root改为wybzyx,具体如下所示。

 修改属主的同时也可以修改属组,只需在属主与属组之间加入“。”或“。”即可。一般建议使用“。”,以免因属主名称含有“。”造成系统误判。具体如下所示。

 若只需要更改文件的属组而不需要更改属主,使用chgrp命令即可,具体如下所示。

 若要将某目录下的所有子目录或文件同时修改属主或属组,只需在chown与chgrp命令后添加“-R”参数即可,具体如下所示。

 修改文件权限使用chmod命令,设置权限的方式有两种,一种为符号,一种为数字。符号修改权限是使用u、o、g这3个符号代表属主、属组、其他用户这3种身份,a代表全部身份,r、w、x符号代表读、写、执行,通过赋值符增加、删除、覆盖文件权限,如表4.1所示。

 例如,创建文件file,给该文件的属主增加执行权限,当查看属主权限字符位出现“x”符号时,说明增加执行权成功,具体如下所示。

同时给所有对象删除某一个权限,具体如下所示。

同时给所有对象增加读、写、执行权限,在chmod命令后加“a”符号,然后覆盖掉当前全部权限,具体如下所示。

 一次分别给不同对象增加或删除不同的权限,具体如下所示。

 使用递归参数“-R”,具体如下所示。

chown:Linux系统中用来改变某个文件属性的命令。

chmod:Linux系统中用来改变某个文件的访问模式的命令。

1.2 UGO权限设置案例

 下面以一些具体实例加以说明。我们针对hr部门的访问目录/home/hr设置权限,要求如下。

(1)root用户和hr组的员工可以读、写、执行。

(2)其他用户没有任何权限。

具体如下所示。

 【例4-1】 r、w、x对文件的影响。要在file01.txt文件中写入“date”,查看文件权限为644,普通用户alice只有读取权限。在root用户下,使用chmod命令给other身份增加执行权限“x”与写入权限“w”,具体如下所示。

 【例4-2】 r、w、x对目录的影响。创建dir10目录,在该目录下创建file01文件,使用chmod命令给dir10/file01增加777权限,查看目录/dir10权限为755,/dir10/file01权限为777。切换到普通用户alice,使用“rm –rf”命令不能删除该文件,因为alice用户对目录没有写入权限。具体如下所示。

 【例4-3】 文件与目录的权限区别。在root用户下,修改目录/dir10权限为777,修改文件/dir10/file01权限为000。切换到普通用户alice,alice对目录有写入权限,可以在目录中创建新文件,可以删除目录中的文件,对文件没有任何权限,具体如下所示。

 注意事项:文件:x权限小心给予。目录:w权限小心给予。

        存储在磁盘上的文件就像是一个链表,表头是文件的起始地址,整个文件并不一定是连续的,可能是多个节点连接而成的。要访问某个文件时,只要找到表头即可。删除文件时,其实只是把表头删除了,后面的数据并没有删除,直到下一次进行写磁盘操作需要占用节点所在位置时,才会把相应的数据覆盖掉。

二、基本权限ACL

       UGO权限只针对一个用户、一个组与其他用户,使用上有局限性,ACL(Access Control List)主要提供传统的UGO的r、w、x权限之外的具体权限设置,可以对单一用户、单一文件或目录进行权限设置。

2.1 ACL基本用法

创建一个文件,使用getfacl命令查看ACL权限,此时显示的内容与先前使用ll命令查看到的内容相差无几,具体如下所示。

 setfacl命令可以设置ACL权限,对每一个文件或目录进行更精确的权限设置,添加“-m”参数可以修改当前文件ACL权限。修改用户alice下的text.txt文件的读、写权限,当用ll查看文件时,权限字符位最后出现“+”,说明该文件含有ACL权限,具体如下所示。

 这时使用getfacl命令查看,用户alice的权限已修改为“rw-”,具体如下所示。

 为组hr增加“rw”权限,具体如下所示。

 当给用户alice增加“-”权限,如果使用ll查看,会错误地认为alice为其他用户,有读取权限,但使用getfacl命令查看发现alice并不属于其他用户,权限变成“对文件没有任何权限”,具体如下所示。

 添加“-x”参数可以删除用户对文件的所有权限,例如,对alice用户执行该操作后,alice将属于其他用户,因此便具有了读取权限,具体如下所示。

 添加“-b”参数可以删除所有扩展ACL权限,回到UGO的基本权限,具体如下所示。

2.2 ACL高级特性

mask用来指定最大有效权限。系统给用户赋予的ACL权限需要和mask的权限逻辑“相与”,“相与”之后的权限才是用户的真正权限。例如,将mask权限设置为“r”,用户权限与其“相与”之后,有效的权限为“r--”,用户真正的权限也就是“r--”,具体如下所示。

 例如,将mask的权限设置为“rw”,而alice用户的权限是“rx”,那么“相与”后的最终权限为“r--”,具体如下所示。

 要让alice对目录/home以及其下新建的文件有读、写、执行权限,可以添加“d”参数。创建目录dir01,使用setfacl命令给用户alice增加“rwx”权限,然后在dir01目录下创建dir02目录,切换到用户alice发现没有权限创建新文件,具体如下所示。

 此时使用default命令可以继承上一个目录的权限,先用getfacl命令查看dir01的ACL权限,具体如下所示。

三、高级权限

分析:以alice用户身份访问/usr/bin/cat进程产生的属主是alice,alice用户没有访问/root目录的权限,所以也没有读取root/file01.txt的权限。

3.1 SUID权限

任何用户在执行该文件时,其身份是该文件的属主,在进程文件(二进制,可执行)上增加SUID权限,让本来没有相应权限的用户也可以访问没有权限访问的资源。普通用户可通过SUID提权,使用chmod命令给user增加SUID权限,切换到alice用户下,即可查看/root/file01.txt,具体如下所示。

 

3.2 SGID权限

在一个程序上添加SGID,用户在执行过程中会获得该程序用户组的权限(相当于临时加入了程序的用户组)。在目录/home下创建一个目录hr,将hr组添加到该目录下,查看目录属组已修改为hr。在/home/hr目录下创建一个文件file02,该文件属组为root,并没有继承上级目录的hr组,具体如下所示。

在一个目录上添加SGID,该目录下新创建的文件会继承其属组,具体如下所示。

3.3 Sticky权限

 添加Sticky后,当用户对目录具有w、x权限,在该目录下建立的文件或目录,仅有自己与root才有权删除。在目录/home下创建目录dir01,并赋予其777权限,具体如下所示。

 添加“t”参数后,用户只能删除自己的文件,具体如下所示。

 系统中还存在一些目录(如tmp目录),为了保证该目录下文件的安全,系统自动为其增加了“t”权限,因此目录下的文件只有属主才可以删除。/tmp目录为全局可写,其权限只能为1777,否则会导致程序不能正常运行,具体如下所示。

权限的字符位只有9位,增加的特殊权限会占用“x”权限的位置。为了区分目录或文件是否含有“x”权限,系统会以特殊权限的大小写方式给予提示。当符号为大写时,表示不含有“x”权限;当符号为小写时,表示含有“x”权限。例如,给目录/home/dir01/去除“x”权限后,其中“t”权限变为大写;当给目录/home/dir01增加7777权限后删除“x”权限,特殊权限符号均变为大写。具体如下所示。

四、文件属性chattr

 为了保护系统文件,Linux系统会使用chattr命令改变文件的隐藏属性。chattr命令仅对EXT2/EXT3/EXT4文件系统完整有效,其他文件系统可能仅支持部分隐藏属性或者根本不支持隐藏属性。给file02文件增加“a”属性之后,便不能再使用Vim编辑器写入文本,需要使用echo命令以追加的方式写入。此属性一般用于日志文件,因为日志文件内容是在后面追加,前面的内容不能被覆盖,整个文件也不能被删除。当需要截取某段日志时,去除该属性即可。具体如下所示。

五、进程掩码umask

        当用户创建新目录或文件时,系统会赋予目录或文件一个默认的权限,umask的作用就是指定权限默认值。为系统设置一个合理的umask值,确保创建的文件或目录具有所希望的缺省权限,有利于保证数据安全。

六、总结

       在本章中,我们详细讨论了文件和目录权限的控制方式。首先,我们介绍了基本权限UGO(User、Group、Others)的使用方法。通过使用chmod命令,我们可以为文件或目录设置读、写和执行权限。UGO权限可以用数字(如4、2、1)或符号(如+r、-w、+x)来表示。通过将数字相加,我们可以得到相应的权限值。这种基本权限控制方式非常简单直观,可以满足大部分的权限需求。

       然而,有时候我们需要更为灵活的权限控制方式,这就引入了ACL(Access Control List)。ACL允许我们为单个用户或用户组设置特定的权限。使用setfacl命令,我们可以为文件或目录添加ACL权限。而使用getfacl命令,我们可以查看文件或目录的ACL权限。

       在ACL的高级特性方面,我们讨论了mask和default权限的作用。mask权限是指ACL权限中的最大权限。当ACL权限中的某个用户或用户组的权限超过了mask权限时,将会被限制在mask权限之内。这样可以确保不会出现过高的权限。另外,default权限是指在创建新文件或目录时,会自动继承父目录的default权限。这样可以方便地设置新文件或目录的默认权限。

       除了基本权限和ACL权限,我们还介绍了高级权限SUID(Set User ID)、SGID(Set Group ID)和Sticky的意义。SUID权限允许执行者在执行该文件时具有文件所有者的权限。这对于一些需要特殊权限的程序非常有用。SGID权限允许执行者在执行该文件时具有文件所属组的权限。这对于一些需要共享资源的程序非常有用。Sticky权限可以防止其他用户删除非自己创建的文件,这在共享目录中非常有用。

        最后,我们讨论了umask对文件属性的影响。umask是一种掩码,用来限制新建文件或目录的默认权限。umask的值会与默认权限进行按位与操作,从而得到实际的权限值。这样,我们可以通过设置umask来控制新建文件或目录的默认权限,以满足特定的安全需求。