第三章 Linux文件系统安全
第二节 文件/目录访问权限管理
Linux系统中的每个文件和目录都有访问许可权限,决定谁可以通过何种方式对文件和目录进行访问和操作。本节将对文件/目录访问的方法和命令进行介绍。
3.2.1 文件/目录访问权限
文件或目录的访问权限分为只读、只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其进行任何更改操作;只写权限允许对文件进行任何修改操作;可执行权限表示允许将该文件作为一个程序执行。文件在创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。
有三种类型的用户可对文件或目录进行访问:文件所有者、同组用户、其他用户。所有者一般是文件的创建者,它可以允许同组用户访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中的每一位用户都能访问该用户拥有的文件或目录。
每一个文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:
#ls -l sobsrc.tgz
-rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc.tgz
横线代表空许可(即表示不具有该权限)。r代表只读,w代表写,x代表可执行。注意:这里共有10个位置。第1个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第1个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。后面的9个字符每三个构成一组,依次表示文件主用户、组用户、其他用户对该文件的访问权限。
例如:
-rw-r--r-- sobsrc.tgz
表示文件sobsrc.tgz的访问权限,说明sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。
确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。
3.2.2 使用chmod改变文件/目录的访问权限
chmod命令用于改变文件或目录的访问权限,它是一条非常重要的系统命令。用户可用其控制文件或目录的访问权限。
该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
1.文字设定法
文字设定法的一般使用形式为:chmod [who] [+ | - | =] [mode] 文件名。
其中,操作对象who可以是下述字母中的任一个或各字母的组合:
u表示“用户(user)”,即文件或目录的所有者。
g表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o表示“其他(others)用户”。
a表示“所有(all)用户”。其为系统默认值。
操作符号可以是:
+添加某个权限。
取消某个权限。
=赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r:可读。
w:可写。
x:可执行。只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性。
s:在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t:将程序的文本保存到交换设备上。
u:与文件属主拥有一样的权限。
g:与和文件属主同组的用户拥有一样的权限。
o:与其他用户拥有一样的权限。
如果在一个命令行中可给出多个权限方式,其间用逗号隔开。
下面给出使用该设定法的例子:
(1)设定文件sort的属性为:文件属主(u)增加执行权限;与文件属主同组用户(g)增加执行权限;其他用户(o)增加执行权限。
#chmod a+x sort
(2)设定文件text的属性为:文件属主(u)增加写权限;与文件属主同组用户(g)增加写权限;其他用户(o)删除执行权限。
#chmod ug+w,o-x text
(3)对可执行文件sniffer添加s权限,使得执行该文件的用户暂时具有该文件拥有者的权限。
#chmod u+s sniffer
在上述例子中,当其他用户执行sniffer这个程序时,他的身份将由于这个程序而暂时变成该sniffer程序的拥有者(由于chmod命令中使用了s选项),所以他就能够读取sniffer.c文件(虽然这个文件被设定为其他人不具备任何权限),这就是s的功能。在整个系统中特别是root本身,最好不要过多地设置这种类型的文件(除非必要),这样可以保障系统的安全,避免因为某些程序的bug而使系统遭到入侵。例如:
//以下命令都是将文件readme.txt的执行权限删除
#chmod a–x readme.txt
#chmod –x readme.txt
2.数字设定法
数字设定法是与文字设定法功能等价的设定方法,只不过比文字设定法更加简便。数字表示的属性的含义为:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)、(g)、(o)。其他的与文字设定法基本一致。
如果想让某个文件的属主有“读/写”二种权限,须要设置4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:chmod [mode] 文件名。
下面给出使用该数字设定法的例子:
(1)设定文件mm.txt的属性为:文件属主(u)拥有读、写权限;与文件属主同组用户(g)拥有读权限;其他人(o)拥有读权限。
#chmo d 644 mm.txt
(2)设定fib.c这个文件的属性为:文件主本人(u)具有可读/可写/可执行权限;与文件主同组人(g)可读/可执行权;其他人(o)没有任何权限。
#chmod 750 fib.c
#ls –l //使用ls查看执行结果
-rwxr-x--- 1 inin users 44137 Oct 12 9:18 fib.c
3.2.3使用命令chown更改文件/目录的所有权
该命令用来更改某个文件或目录的属主和属组。举个例子,root用户把自己的一个文件复制给用户xu,为了让用户xu能够存取这个文件,root用户应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件。
该命令的使用形式为:chown [选项] 用户或组 文件。
chown的功能是将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。
该命令的选项为:
-R:递归地改变指定目录及其下面的所有子目录和文件的拥有者。
-v:显示chown命令所做的工作。
下面给出使用该命令的例子:
(1)把文件shiyan.c的所有者改为wang。
#chown wang shiyan.c
(2)把目录/his及其下面的所有文件和子目录的属主改成wang,属组改成users。
#chown -R wang.users /his
3.2.4 使用setuid/setgid改变执行权限
通过前面的介绍用户已知道,Linux系统中的每一个文件都有一个所有者,表示该文件是谁创建的。同时,该文件还有一个组编号,表示该文件所属的组,一般为文件所有者所属的组。并且,在一般情况下,用户也可以通过设定对文件的权限来控制对其的相关操作。
在此情况下,如果是一个可执行文件,那么在执行时,一般该文件只拥有调用该文件的用户具有的权限。而setuid/setgid则可以改变这种设置。
setuid:设置使文件在执行阶段具有文件所有者的权限。典型的文件是/usr/bin/passwd。如果一般用户执行该文件,则在执行过程中,该文件可以获得root权限,从而可以更改用户的密码。
setgid:该权限只对目录有效。目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。
sticky bit:该位可以理解为防删除位。一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件但同时不能删除文件。则可以对文件使用sticky位。设置该位后,即便用户对目录具有写权限,也不能删除该文件。
前面讨论了通过文字设定和数字设定的方法来设定文件/目录的访问权限问题,下面通过这两种方法来介绍如何操作以上标志。操作这些标志与操作文件权限的命令是一样的,都要使用chmod命令来进行。
1.文字设定法
chmod u+s filename:为文件filename加上setuid标志。
chmod g+s dirname:为dirname目录加上setgid标志。
chmod o+t filename:为文件filename加上sticky标志。
2.数字设定法
对一般文件通过三组八进制数字来置标志,如444、777、644等。如果设置这些特殊标志,则在这组数字之前外加一组八进制数字。如4666、4777等。这一组八进制数字三位的意义如下:
setuid位:如果该位为1,显示为“S”,则表示设置setuid,其显示在原来的x标志位上。
setgid位:如果该位为1,显示为“S”,则表示设置setgid,其显示在原来的x标志位上。
sticky位:如果该位为1,显示为“T”,则表示设置sticky,其显示在原来的x标志位上。
设置完这些标志后,可以用ls –l命令来查看。如果有这些标志,则会在原来的执行标志位置上显示。如下所示:
r-srw-r--:表示有setuid标志;
rwxrwsrw-:表示有setgid标志;
rwxrw-rwt:表示有sticky标志。
如果本来在该位上有x,则这些特殊标志显示为小写字母(s,s,t)。否则,显示为大写字母(S,S,T)。
另外,读者应注意,虽然setuid/setgid机制非常方便实用,但是由于提升了执行者的权限,因而不可避免地存在许多安全隐患和风险,所以作者并不太赞成广大读者广泛使用。在实际的系统管理过程中,用户还经常需要找出设置了这些标志的文件,并对它们进行检查和清理。一般用户可以使用如下命令来寻找系统中的具有特殊标志的文件:
#find -perm +6000 –type f –exec ls –ld {}\; > setuid.txt&