一、概述
Linux 支持的文件系统种类繁多,他们为用户的数据存储和管理提供了良好的操作和使用界面。在文件系统中,存在着文件 / 目录访问权限管理和控制、加密文件系统等的安全机制和问题需要考虑,本章节将详细介绍保证 Linux 文件系统安全的技术和方法。
随着 Linux 的不断发展,其所能支持的文件格式系统也在迅速扩充。特别是 Linux2.6 内核正式推出后,出现了大量新的文件系统,其中包括日志文件系统 Ext4、Ext3、ReiserFS、XFS、JFS 和其他文件系统。Linux 系统核心可以支持十多种文件系统类型:JFS、ReiserFS、Ext、Ext2、Ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC 等。
1、文件系统安全性对比
从自动修复损坏的文件系统来看,ext2、ext3 都能自动修复损坏的文件系统,也都是在开机时进行。ext2 和 ext3 文件系统在默认的情况下是“每间隔 21 次挂载文件系统或每 180 天,就要自动检测一次。通过实践来看 ext2 和 ext3 在自动检测上是存在风险,有时文件系统开机后就进入单用户模式,并且把整个系统“扔”进 lost+found 目录,如果要恢复系统,就得用 fsck 来进行修复;当然 fsck 也同样存在风险;所以对 ext2 和 ext3 文件系统的使用,对新手来说的确需要心里准备;毕竟修复已经损坏的 ext2 和 ext3 文件系统是有困难的;另外 ext2 和 ext3 文件系统对于意外关机和断电,也可能导致文件系统损坏,所以我们在使用过程中,必须是合法关机;比如执行 poweroff 指令来关掉机器。
从文件系统的反删除来看,ext2 支持反删除,对于一般使用者来说应该是安全的,但对于保密单位来说可能意味着不安全。从反删除角度来说明文件系统的安全性,也是有两方面。如果用户的工作是从事比较机密的,用 ext3 比较好,因为 ext3 一旦删除文件,是不可恢复的,因为反删除能恢复相应的绝秘资料的泄秘,所以 ext3 可能更适合从事机密工作的用户。
2、新型的 Ext4 文件系统
Ext4 是 Linux 内核版本 2.6.28 的重要部分。它是 Linux 文件系统的一次革命。在很多方面,Ext4 相对于 Ext3 的进步要远超过 Ext3 相对于 Ext2 的进步。Ext3 相对于 Ext2 的改进主要在于日志方面,但是 Ext4 相对于 Ext3 的的改进是更深层次的,是文件系统数据结构方面的优化。一个高效的、优秀的、可靠的和极具特点的文件系统就此诞生。目前,该文件系统并未在所有的 Linux 发行套件中完全普及使用,还处于初期的测试阶段。
二、安全设定文件 / 目录访问权限
1、基本命令设定和基本知识
查看Linux文件的权限:ls -l 文件名称
查看linux文件夹的权限:ls -ld 文件夹名称(所在目录)
例如
- drwxr-xr-x 2 root root 4096 2009-01-14 17:34 bin
第一个字符代表文件类型。[d]–目录、[-]–文件、[l]–链接、[b]–可储存周边设备、[c]–序列设备、[s]-套接字。例子中是d,代表是一个目录。
接下来每三个字符为一组权限,分为三组,依次代表所有者权限,同组用户权限,其它用户权限。
每组权限的三个字符依次代表是否可读,是否可写,是否可执行,[r]–可读、[w]–可写、[x]–可执行、[-]-相应的权限还没有被授予。其中,rwx也可以用数字来代替,[r]=4,[w]=2,[x]=1,[-]=0。
第一组rwx :表示拥有人(user)所有者的权限 (这里rwx:代表拥有人有可读,可写,可执行的权限)
第二组r-x:表示同组群(group)使用者权限(这里r-x代表同组群使用者有可读,可执行权限)
第三组r-x:表示其他(other)使用者权限(这里r-x代表其他使用者有可读,可执行权限)
修改文件及文件夹权限:
- sudo chmod -(代表类型)×××(所有者)×××(组用户)×××(其他用户)
常用修改权限的命令:
- sudo chmod 600 ××× (只有所有者有读和写的权限[-rw-------])
- sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限[-rw-r--r--])
- sudo chmod 666 ××× (每个人都有读和写的权限[-rw-rw-rw-])
- sudo chmod 700 ××× (只有所有者有读和写以及执行的权限[-rwx-----])
- sudo chmod 777 ××× (每个人都有读和写以及执行的权限[-rwxrwxrwx])
- sudo chmod o+w xxx.xxx (表示给其他人授予写xxx.xxx这个文件的权限)
- sudo chmod go-rw xxx.xxx (表示删除xxx.xxx中组群和其他人的读和写的权限)
Linux 系统中的每个文件和目录都有访问许可权限,通过其确定谁可以通过何种方式对文件和目录进行访问和操作。下面将对文件 / 目录访问的方法和命令进行介绍。
文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作;只写权限允许对文件进行任何的修改操作;可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。
有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。它可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中的每一位用户都能访问该用户拥有的文件或目录。
每一个文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限(如图 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 命令来更改某个文件或目录的所有者。
图 1. 文件 / 目录访问权限示意图

2、改变文件 / 目录的访问权限
chmod 命令用于改变文件或目录的访问权限,它是一条非常重要的系统命令。用户可用其控制文件或目录的访问权限。
该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
文字设定法
文字设定法的一般使用形式为: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:与其他用户拥有一样的权限。
如果在一个命令行中可给出多个权限方式,其间用逗号隔开。图 2 给出了使用该设定法的例子:
图 2. chmod 命令文字设定法使用示例

首先,设定文件 test1 的属性为:文件属主(u)增加执行权限 ; 与文件属主同组用户(g)增加执行权限;其他用户(o)增加执行权限,其命令为:
- #chmod a+x test1
接着,设定文件 test2 的属性为:文件属主(u)增加写权限 ; 与文件属主同组用户(g)增加写权限;其他用户(o)删除执行权限,其命令为:
- #chmod ug+w,o-x test2
最后,对可执行文件 test3 添加 s 权限,使得执行该文件的用户暂时具有该文件拥有者的权限:
- #chmod u+s test3
在上述例子中,当其他用户执行 test3 这个程序时,他的身份将由于这个程序而暂时变成该 test3 程序的拥有者(由于 chmod 命令中使用了 s 选项),所以他就能够读取 test3.c 文件(虽然这个文件被设定为其他人不具备任何权限),这就是 s 的功能。在整个系统中特别是 root 本身,最好不要过多地设置这种类型的文件(除非必要),这样可以保障系统的安全,避免因为某些程序的 bug 而使系统遭到入侵。
数字设定法
数字设定法是与文字设定法功能等价的设定方法,只不过比文字设定法更加简便。数字表示的属性的含义为:0 表示没有权限,1 表示可执行权限,2 表示可写权限,4 表示可读权限,然后将其相加。所以数字属性的格式应为 3 个从 0 到 7 的八进制数,其顺序是(u)、(g)、(o)。其他的与文字设定法基本一致。
如果想让某个文件的属主有“读 / 写”二种权限,须要把 4(可读)+2(可写)=6(读 / 写)。
数字设定法的一般形式为:chmod [mode] 文件名。图 3 给出使用该数字设定法的例子:
图 3. chmod 命令数字设定法示意

可以看到,图 3 中设定文件 test1 的属性为:文件属主(u)拥有读、写权限 ; 与文件属主同组人用户(g)拥有读权限;其他人(o)拥有读权限,而设定 test2 这个文件的属性为:文件主本人(u)具有可读 / 可写 / 可执行权限;与文件主同组人(g)可读 / 可执行权;其他人(o)没有任何权限。
3、chmod 命令详解
chmod 用于改变文件或目录以及所有子目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
1. 文字设定法
- chmod [who] [+|-|=] [mode] 文件名
2. 数字设定法
- chmod[mode]文件名
改变一个文件的权限:
- chmod mode file|dir
改变所有子目录的权限(注意后面加了个-R参数):
- chmod mode dir -R
参数就是权限模式,数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o),mode=777 or 752 or 666,mode的三个数字,分别表示owner,group,others所具有的权限。1=x执行,2=w写,4=r读,比如owner具有所有权限,1+2+4=7, 又比如group 具有读 和执行权限 1+4=5。
命令中各选项的含义如下:
1)、操作对象who可是下述字母中的任一个或者它们的组合:
- u 表示”用户(user),也就是所有者”,即文件或目录的所有者。
- g 表示”同组(group)用户,也就是所有者所在的组群”,即与文件属主有相同组ID的所有用户。
- o 表示”其他(others)用户,但不是u和g”。
- a 表示”所有(all)用户,也就是包括u,g和o”。它是系统默认值。
2)、设置mode所表示的权限可用下述字母的任意组合:
- - 没有权限,即相应的权限还没有被授予,对应数字0。
- r 可读,对应数字4。
- w 可写,对应数字2。
- x 可执行,对应数字1。
- t 保存程序的文本到交换设备上。
- X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
- s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式”u+s”设置文件的用户ID位,”g+s”设置组ID位。
行动:
- + 表示添加某个权限
- - 表示删除某个权限
- = 表示使之成为唯一的权限,即赋予给定权限并取消其他所有权限(如果有的话)
文件名:
以空格分开的要改变权限的文件列表,支持通配符。
例如:把目录/his及其下的所有文件和子目录的属主改成wang,属组改成users:
- chown -R wang.users /his
chmod 改变文件的权限,改变是对三种权限的累加,例如,r=4,w=2,x=1
own 4+2+1=7
group 4+2+1=7
other 4+2+1=7
命令为:
- chmod 777 文件名字
使用符号改变文件权限,chmod a+w 名字,chomod a-w 文件名,chomod u=rw,go=rw等用法,例如: -rw-r–r–
普通文件,文件主组用户其他用户是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。
确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。
在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r 使同组和其他用户对文件example 有读权限。
例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
1)、文字设定法:
- $ chmod a+x sort
上例即设定文件sort 的属性为:文件属主(u)增加执行权限;与文件属主同组用户(g)增加执行权限;其他用户(o)增加执行权限。
- $ chmod ug+w,o-x text
上例即设定文件text的属性为: 文件属主(u)增加写权限;与文件属主同组用户(g)增加写权限;其他用户(o)删除执行权限。
- $ chmod u+s a.out
上例假设执行chmod后a.out 的权限为(可以用ls –l a.out命令来看): -rws–x–x 1 inin users 7192 Nov 4 14:22 a.out并且这个执行文件要用到一个文本文件shiyan1.c,其文件存取权限为”-rw——-”,即该文件只有其属主具有读写权限。当其他用户执行a.out这个程序时,他的身份因这个程序暂时变成inin(由于chmod命令中使用了s选项),所以他就能够读取shiyan1.c这个文件(虽然这个文件被设定为其他人不具备任何权限),这就是s 的功能。
因此,在整个系统中特别是root本身,最好不要过多的设置这种类型的文件(除非必要)这样可以保障系统的安全,避免因为某些程序的bug而使系统遭到入侵。
- $ chmod a-x mm.txt
- $ chmod -x mm.txt
- $ chmod ugo-x mm.txt
以上这三个命令都是将文件mm.txt 的执行权限删除,它设定的对象为所有使用者。
2)、数字设定法:
- $ chmod 644 mm.txt
- $ ls -l
上例即设定文件mm.txt的属性为:
- -rw-r–r–1 inin users 1155 Nov 5 11:22 mm.txt
文件属主(u)inin 拥有读、写权限,与文件属主同组人用户(g)拥有读权限,其他人(o)拥有读权限。
- $ chmod 750 wch.txt
- $ ls -l
- -rwxr-x— 1 inin users 44137 Nov 12 9:22 wchtxt
上例即设定wchtxt这个文件的属性为:文件主本人(u)inin 可读/可写/可执行权,与文件主同组人(g)可读/可执行权,其他人(o)没有任何权限。
4、更改文件 / 目录的所有权
该命令用来更改某个文件或目录的属主和属组。举个例子,root 用户把自己的一个文件拷贝给用户 xu,为了让用户 xu 能够存取这个文件,root 用户应该把这个文件的属主设为 xu,否则,用户 xu 无法存取这个文件。
该命令的使用形式为:chown [ 选项 ] 用户或组 文件。
Chown 的功能是将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户 ID。组可以是组名或组 ID。文件是以空格分开的要改变权限的文件列表,支持通配符。该命令的选项为:
-R:递归地改变指定目录及其下面的所有子目录和文件的拥有者。
-v:显示 chown 命令所做的工作。
图 4 给出了使用该命令的例子,笔者把文件 test1 的所有者改为 super,把目录 ./test_dir 及其下面的所有文件和子目录的属主改成 super,属组改成 super。
图 4. chown 命令使用示意

5、改变文件的执行权限
通过前面的介绍我们知道,Linux 系统中的每一个文件都有一个所有者,表示该文件是谁创建的。同时,该文件还有一个组编号,表示该文件所属的组,一般为文件所有者所属的组。并且,在一般情况下,我们也可以通过设定对文件的权限来控制对其的相关操作。
在此情况中,如果是一个可执行文件,那么在执行时,一般该文件只拥有调用该文件的用户具有的权限。而 setuid/setgid 则可以来改变这种设置:
- setuid:设置使文件在执行阶段具有文件所有者的权限。典型的文件是 /usr/bin/passwd。如果一般用户执行该文件,则在执行过程中,该文件可以获得 root 权限,从而可以更改用户的密码
- setgid:该权限只对目录有效。目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。
- sticky bit:该位可以理解为防删除位。一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件但同时不能删除文件。则可以对文件使用 sticky bit 位。设置该位后,j 即便用户对目录具有写权限,也不能删除该文件。
在前面我们讨论了通过文字设定和数字设定的方法来设定文件 / 目录的访问权限问题,同样的道理,下面我们通过这两种方法来介绍如何操作这些标志。操作这些标志与操作文件权限的命令是一样的,都是使用 chmod 命令来进行:
文字设定法
chmod u+s filename:为文件 filename 加上 setuid 标志。
chmod g+s dirname:为目录 dirname 目录加上 setgid 标志。
chmod o+t filename:为文件 filename 加上 sticky 标志。
数字设定法
对一般文件通过三组八进制数字来置标志,如 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&
5、Linux下Web 目录和文件安全权限设置
在Linux下,web 目录和文件权限必须从整体上考虑系统的安全。一般情况下,对目录,需要设置r(读取)和x(执行)权限,有的目录同时还需要w(写入权限);对文件,需要r(读取),有的文件需要w(写入)权限或x(执行)权限。
在Linux系统中,使用命令umask设置创建文件或目录的默认rwx权限,系统默认的umask设置是022,这个权限的计算相当于文件、目录权限的掩码,例如此时创建的目录权限755(rwxr-xr-x),那么其umask权限相当于相对777的掩码022;而此时创建的文件权限为644 (rw-r–r–),其umask权限相当于相对666的掩码022。
当然,这样的权限设置很不安全,同一台server上的不同用户(可能相同也可能不同用户组)/虚拟主机用户能够互相窥探到对方的源码,umask值必须修改的比较严格,以使得除root权限之外,不能随意互相窥探其他人的源码、数据库资料等。
设置方法是:去掉同用户组和其他用户组的 r(读取)权限,具体做法是设置目录权限为500(读取+执行)同时文件权限为400(读取),此时umask应设置为277,设置目录权限为700(读取+写入+执行)同时文件权限为500(读取+执行),此时umask应设置为177。
例如对于后者,我们可以使用命令 umask 177 设置当前对话下的默认目录、文件创建权限,如果要永久设置,就要修改/root/.bash_profile 以及所有用户home 的录下的.bash_profile文件,将其中的umask 022改为umask 177。
从以上可以看出,如果要设置较为安全的目录、文件权限,几个基本原则就是:
1、尽可能减少web路径下可写入目录的数量。
2、文件的写入和执行权限只能选择其一,避免同时出现写入和执行权限。
6、网站文件最小权限设置方法
1、假如web服务器是apache,那么用户访问web页面的时候,就是通过apache服务(httpd)的所有者的身份进行访问,所以要将 apache也就是httpd服务的所有者和所有组设为apache或者自定用户,不要用root,这个一般安装的时候就会有默认设置。
、网站程序的所有者不要和apache服务的所有者一样,如果一样就相当于给了普通访问者对web文件的所有操作权!一旦web程序有漏洞,那就 over了!默认一般是root,尽量改为其他用户,比如自己建立一个daemon,切记不要和apache服务的所有者一样。
3、对于网站根目录权限,按照最小权限的原则,应设置为755。
4、对于缓存目录或者上传目录例如缓存目录:caches目录,由于此目录必须要有写权限,也就是目录同是有rwx三个权限,这时候可以直接建立一个 caches空目录,然后chown daemon.daemon ./caches,就是把caches所有者、所有组改为自定义的daemon就ok了,这样如果访问web页面,就会以apache的身份进入 caches建立缓存目录及文件,默认系统都是以最小权限建立!
5、对于普通目录,最小权限为755,普通用户不给写权限。
6、对于普通文件,最小权限为644,普通用户不给执行权限。总而言之,言而总之就是:目录不要给写权限,文件不要给执行权限(除非特殊情况,如目录要上传)。
7、网站目录文件权限的基本设定
我们假设http服务器运行的用户和用户组是www,网站用户为centos,网站根目录是/home/centos/web。
1、我们首先设定网站目录和文件的所有者和所有组为centos,www,如下命令:chown -R centos:www /home/centos/web
2、设置网站目录权限为750,750是centos用户对目录拥有读写执行的权限,这样centos用户可以在任何目录下创建文件,用户组有有读执行权限,这样才能进入目录,其它用户没有任何权限。 find -type d -exec chmod 750 {} \;
3、设置网站文件权限为640,640指只有centos用户对网站文件有更改的权限,http服务器只有读取文件的权限,无法更改文件,其它用户无任何权限。 find -not -type d -exec chmod 640 {} \;
4、针对个别目录设置可写权限。比如网站的一些缓存目录就需要给http服务有写入权限。例如discuz x2的/data/目录就必须要写入权限。find data -type d -exec chmod 770 {} \;
三、使用额外属性保护 ext3 文件系统安全
1、ext3 中的额外属性
从 Linux 的 1.1 系列内核开始,ext2 文件系统就开始支持一些针对文件和目录的额外标记或者叫作属性(attribute)。在 2.2 和 2.4 系列及其高版本的内核中,ext3 文件系统支持以下属性的设置和查询(如表 1 所示):
表 1. ext3 文件系统支持的属性含义
属性名 | 含 义 |
---|---|
A | Atime。告诉系统不要修改对这个文件的最后访问时间 |
S | Sync。一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 |
a | Append Only。系统只允许在这个文件之后追加数据,不允许任何进程覆盖或者截断这个文件。如果目录具有这个属性,系统将 只允许在这个目录下建立和修改文件,而不允许删除任何文件 |
i | Immutable。系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。 |
d | No dump。在进行文件系统备份时,dump程序将忽略这个文件 |
c | Compress。系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后,才写入磁盘 |
s | Secure Delete。让系统在删除这个文件时,使用0填充文件所在的区域 |
u | Undelete。当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件 |
虽然文件系统能够接受并保留指示每个属性的标志,但是这些属性不一定有效,这依赖于内核和各种应用程序的版本。表 2 显示了 Linux 每个版本内核支持的属性标志的具体情况,其中:
- OK:表示允许设置这个标志并使设置生效;
- POK:允许设置这个标志但忽略其值;
- ——:表示完全忽略这个标志。
表 2. Linux 各内核版本对属性的支持情况
属性名 内核版本 | Kernel 1.0 | Kernel 1.2 | Kernel 2.0 | Kernel 2.2 | Kernel 2.4 | Kernel 2.6 |
---|---|---|---|---|---|---|
A | —— | —— | OK | OK | OK | OK |
S | OK | OK | OK | OK | OK | OK |
a | —— | OK | OK | OK | OK | OK |
i | —— | OK | OK | OK | OK | OK |
d | —— | OK | OK | OK | OK | OK |
c | POK | POK | POK | POK | POK | POK |
s | OK | OK | POK | POK | POK | POK |
u | OK | OK | OK | OK | OK | OK |
从上述表格可以看出:虽然早期的内核版本支持安全删除特征,但是从 1.3 系列的内核开始,开发者抛弃的对这个特征的实现,因为它似乎只能够提高一点点的安全性,而糟糕的是它会给不熟悉安全删除继承问题的用户造成安全的假象。在对具有 A 属性的文件进行操作时,A 属性可以提高一定的性能。而 S 属性能够最大限度的保障文件的完整性。
因此,我们将主要讨论 a 属性和 i 属性,因为这两个属性对于提高文件系统的安全性和保障文件系统的完整性有很大的好处。同样,一些开放源码的 BSD 系统(比如 FreeBSD 和 OpenBSD),在其 UFS 或者 FFS 实现中也支持类似的特征。
2、使用 ext3 文件系统的属性
在任何情况下,标准的 ls 命令都不会一个文件或者目录的扩展属性。ext3 文件系统工具包中有两个工具:chattr 和 lsattr。它们被专门用来设置和查询文件属性。因为 ext3 是标准的 Linux 文件系统,因此几乎所有的发布都有 e2fsprogs 工具包。如果由于某些原因,系统中没有这个工具,用户可以从以下地址下载这个工具包的源代码编译并安装:http://sourceforge.net/projects/e2fsprogs。
Lsattr 命令
lsattr 命令只支持很少的选项,其选项如下:
- -a:列出目录中的所有文件,包括以 . 开头的文件。
- -d:以和文件相同的方式列出目录,并显示其包含的内容。
- -R:以递归的方式列出目录的属性及其内容。
- -v:列出文件版本(用于网络文件系统 NFS)。
Chattr 命令
chattr 命令可以通过以下三种方式执行:
- chattr +Si filename:给文件添加同步和不可变属性。
- chattr -ai filename:把文件的只扩展(append-only)属性和不可变属性去掉。
- chattr =aiA filename t:使文件只有 a、i 和 A 属性。
最后,每个命令都支持 -R 选项,用于递归地对目录和其子目录进行操作。
ext3 属性和文件权限的区别
几乎所有的系统管理员都理解 Linux 风格文件系统的权限和所有者以及 ls 命令的显示,如图 5 所示:
图 5. ls 显示结果

从 ls 的输出结果看,这些文件属于用户 super,而 super 所在的用户组是 super。用户 super 本人和 super 用户组的成员对 test2 和 test3 具有对文件的修改权限,而其他的用户对 test1、test2、test3 均只有读取文件的权限。图 6 给出了与图 5 对比的 lsattr 命令的输出:
图 6. lsattr 显示结果

输出结果显示,test2 只能被添加,而 test1 文件不准修改。在 Linux 系统中,如果一个用户以 root 的权限登录,文件系统的权限控制将无法对 root 用户和以 root 权限运行的进程进行任何的限制。这样对于 Linux 类的操作系统,如果攻击者通过远程或者本地攻击获得 root 权限将可能对系统造成严重的破坏。而 ext3 文件系统可以作为最后一道防线,最大限度地减小系统被破坏的程度,并保存攻击者的行踪。ext3 属性是由 sys_open() 和 sys_truncate() 等系统调用检查和赋予的,不受用户识别号和其他因素的影响,在任何情况下,对具有不可修改(immutable)属性的文件的进行任何修改都会失败,不管是否是 root 用户进行的修改。
但是,还有一个问题是 root 权限的用户可以通过删除 i 属性实现对文件的修改。这种防护只不过给获得 root 权限的攻击者加了一点小麻烦罢了,系统的安全性并没有根本性的提高。
在 2.1 之前的内核版本中,存在一个安全层(securelevel)的特征。使用安全层可以解决上述问题,因为如果系统的安全层大于 0,内核将 不允许对任何文件的 i 属性进行修改。这些版本的内核由 sysctl 命令的"kernel.securelevel"变量进行控制。如果在启动时,这个变量的值被设置为 1 或者更大的值,内核将不允许对具有 i 属性和 a 属性文件进行修改,除非国旗动到单用户状态。但是,由于引入了更为灵活的内核能力特征(kernel capabilities),以后的内核不再支持安全层。使用内核能力,也可以实现类似的 限制。工具 lcap 用来查询和调整内核能力约束集(kernel capabilities bounding set)。在启动脚本中加入以下命令,就可以实现对具有 i 属性和 a 属性文件的保护:
- lcap CAP_LINUX_IMMUTABLE
- lcap CAP_SYS_RAWIO
第一个命令删除任何用户(包括超级用户)对 i 标志的修改能力。第二个命令删除任何用户(主要针对超级用户)对块设备的原始访问 (raw access) 能力,防止一些技术高超的攻击者直接修改文件系统索引节点的 immutable 域。BTW,在系统启动时,CAP_SYS_RAWIO 能 力应该直接删除,这个能力是一个非常大的潜在威胁。高明的攻击者获得了超级用户权限之后,通过 /dev/kmem 设备可以直接修改内核 内存。通过这种方式,可以破坏系统的内核能力约束集 (kernel capabilities bounding)。如果没有任何参数,会列出内核支持的能力和目 前生效的内核能力。一旦一个内核能力被删除,就只有在系统重新启动,进入到单用户模式才能删除能力限制。
使用 chattr
Linux 主机直接暴露在 Internet 或者位于其它危险的环境,有很多 shell 帐户或者提供 HTTP 和 FTP 等网络服务,一般应该在安装配置完成后使用如下命令:
- chattr -R +i /bin /boot /etc /lib /sbin
- chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin
- chattr +a /var/log/messages /var/log/secure (...)
如果很少对帐户进行添加、变更或者删除,把 /home 本身设置为 immutable 属性也不会造成什么问题。在很多情况下,整个 /usr 目录树也应该具有不可改变属性。实际上,除了对 /usr 目录使用 chattr -R +ii /usr/ 命令外,还可以在 /etc/fstab 文件中使用 ro 选项,使 /usr 目录所在的分区以只读的方式加载。另外,把系统日志文件设置为只能添加属性(append-only),将使入侵者无法擦除自己的踪迹。当然,如果使用这种安全措施,需要系统管理员修改管理方式。
由于软件管理程序需要加入和删除某些文件和目录,因此在进行软件安装和升级之前需要删除某些目录和文件的 immutable 和 append-only 属性。对于 Linux 系统,一般使用 rpm 管理软件包,用户可以使用以下命令查看要安装或者升级的软件包都有哪些文件:
- #rpm -qipl foopackage.rpm
然后去掉有关目录和文件的 immutable 和 append-only 属性。大多数软件包需要 rpm 命令对以下目录的一个或者多个进行写操作:
- /bin
- /sbin
- /usr/bin
- /usr/sbin
- /usr/man
- /lib
- /etc
值得注意的是:如果用户需要升级 /usr/sbin/someprogram,应该去掉 someprogram 文件以及目录 /usr/sbin 的 immutable 属性。
四、使用加密文件系统(EFS)
下面将详细介绍利用 dm-crypt 来创建加密文件系统的方法。与其它创建加密文件系统的方法相比,dm-crypt 系统有着无可比拟的优越性:它的速度更快,易用性更强。除此之外,它的适用面也很广,能够运行在各种块设备上,即使这些设备使用了 RAID 和 LVM 也毫无障碍。dm-crypt 系统之所以具有这些优点,主要得益于该技术是建立在 2.6 版本内核的 device-mapper 特性之上的。device-mapper 是设计用来为在实际的块设备之上添加虚拟层提供一种通用灵活的方法,以方便开发人员实现镜像、快照、级联和加密等处理。此外,dm-crypt 使用了内核密码应用编程接口实现了透明的加密,并且兼容 cryptloop 系统。
1、内核准备
dm -crypt 利用内核的密码应用编程接口来完成密码操作。一般说来,内核通常将各种加密程序以模块的形式加载。对于 AES 来说,其安全强度已经非常之高,即便用来保护绝密级的数据也足够了。为了保证用户的内核已经加载 AES 密码模块,请根据图 7 所示命令进行检查:
图 7. 检查 AES 模块是否成功加载

否则,可以使用 modprobe 来手工加载 AES 模块,命令如下所示:
- #modprobe aes
接下来,用户安装 dmsetup 软件包,该软件包含有配置 device-mapper 所需的工具,如下命令所示:
- #yum install dmsetup cryptsetup
为检查 dmsetup 软件包是否已经建立了设备映象程序,键入下列命令进行:
- #ls -l /dev/mapper/control
然后,需要使用如下命令加载 dm-crypt 内核模块:
- #modprobe dm-crypt
dm-crypt 加载后,它会用 evice-mapper 自动注册。如果再次检验的话,device-mapper 已能识别 dm-crypt,并且把 crypt 添加为可用的对象。执行完上述步骤后,用户应该可以根据如下命令看到 crypt 的下列输出,如图 8 所示:
- #dmsetup targets
图 8. 成功做好装载加密设备的显示

这说明系统已经为装载加密设备做好了准备。下面,我们先来建立一个加密设备。
2、创建加密设备
要创建作为加密设备装载的文件系统,有两种选择:一是建立一个磁盘映像,然后作为回送设备加载;二是使用物理设备。无论那种情况,除了在建立和捆绑回送设备外,其它操作过程都是相似的。
建立回送磁盘映象
如果用户没有用来加密的物理设备(比如存储棒或另外的磁盘分区),作为替换,你可以利用命令 dd 来建立一个空磁盘映象,然后将该映象作为回送设备来装载,照样能用。下面我们以实例来加以介绍:
- #dd if=/dev/zero of=/virtual.img bs=1M count=100
这里我们新建了一个大小为 100 MB 的磁盘映象,该映象名字为 virtual.img。要想改变其大小,可以改变 count 的值。
接下来,我们利用 losetup 命令将该映象和一个回送设备联系起来:
- #losetup /dev/loop0 /virtual.img
现在,我们已经得到了一个虚拟的块设备,其位于 /dev/loop0,并且我们能够如同使用其它设备那样来使用它。
设置块设备
准备好了物理块设备(例如 /dev/hda1),或者是虚拟块设备(像前面那样建立了回送映象,并利用 device-mapper 将其作为加密的逻辑卷加载),我们就可以进行块设备配置了。
下面我们使用 cryptsetup 来建立逻辑卷,并将其与块设备捆绑:
#cryptsetup -y create ly_EFS device_name
其中,ly_EFS 是新建的逻辑卷的名称。并且最后一个参数 device_name 必须是将用作加密卷的块设备。所以,如果要使用前面建立的回送映象作为虚拟块设备的话,应当运行以下命令:
#cryptsetup -y create ly_EFS /dev/loop0
无论是使用物理块设备还是虚拟块设备,程序都会要求输入逻辑卷的口令,-y 的作用在于要你输入两次口令以确保无误。这一点很重要,因为一旦口令弄错,就会把自己的数据锁住,如图 9 所示:
图 9. 为 EFS 输入密码

为了确认逻辑卷是否已经建立,可以使用下列命令进行检查一下:
- #dmsetup ls
只要该命令列出了逻辑卷,就说明已经成功建立了逻辑卷。不过根据机器的不同,设备号可能有所不同,如图 10 所示:
图 10. 显示成功建立的逻辑卷

device-mapper 会把它的虚拟设备装载到 /dev/mapper 下面,所以,你的虚拟块设备应该是 /dev/mapper/ly_EFS ,尽管用起来它和其它块设备没什么不同,实际上它却是经过透明加密的。
如同物理设备一样,用户也可以在虚拟设备上创建文件系统:
- #mkfs.ext3 /dev/mapper/ly_EFS
现在为新的虚拟块设备建立一个装载点,然后将其装载。命令如下所示:
- #mkdir /mnt/ly_EFS
- #mount /dev/mapper/ly_EFS /mnt/ly_EFS
用户能够利用下面的命令查看其装载后的情况,如图 11 所示:
- #df -h /mnt/ly_EFS
图 11. EFS 成功装载后的显示

通过上述的步骤后,用户看到装载的文件系统,尽管看起来与其它文件系统无异,但实际上写到 /mnt/ly_EFS/ 下的所有数据,在数据写入之前都是经过透明的加密处理后才写入磁盘的,因此,从该处读取的数据都是些密文。
卸载加密设备
要卸载加密文件系统,和平常的方法没什么两样:
- #umount /mnt/ly_EFS
即便已经卸载了块设备,在 dm-crypt 中仍然视为一个虚拟设备。如若不信,用户可以再次运行如图 10 所示的命令 dmsetup ls 来验证一下,将会看到该设备依然会被列出。因为 dm-crypt 缓存了口令,所以机器上的其它用户不需要知道口令就能重新装载该设备。为了避免这种情况发生,用户必须在卸载设备后从 dm-crypt 中显式的删除该设备。命令具体如下所示:
- #cryptsetup remove ly_EFS
此后,它将彻底清除,要想再次装载的话,用户必须再次输入口令。
重新装载加密设备
在卸载加密设备后,用户很可能还需作为普通用户来装载它们。为了简化该工作,需要在 /etc/fstab 文件中添加下列内容:
- /dev/mapper/ly_EFS /mnt/ly_EFS ext3 noauto,noatime 0 0
此外,用户也可以通过建立脚本来替我们完成 dm-crypt 设备的创建和卷的装载工作,方法是用实际设备的名称或文件路径来替换 /dev/DEVICENAME:
- #!/bin/sh
- cryptsetup create ly_EFS /dev/DEVICENAME
- mount /dev/mapper/ly_EFS /mnt/ly_EFS
如果用户使用的是回送设备的话,用户还可以利用脚本来捆绑设备,脚本如下所示:
- #!/bin/sh
- losetup /dev/loop0 ~/virtual.img
- cryptsetup create ly_EFS /dev/loop0
- mount /dev/mapper/ly_EFS /mnt/ly_EFS
在 Linux 系统安装时使用 EFS
上面介绍了使用 dm-crypt 来创建加密文件系统的方法,对于初级用户来说,可能这个过程有些繁杂和不好理解。那么,本节将介绍一个非常简单的方法来使用 EFS 文件系统。以 Fedora 10 的安装步骤为例子,选择相关选项进行安装就可以方便地进行使用了。
用户可以在空闲空间新建分区,也可以选择某个分区进行编辑,还可以删除某些分区。在图 12 中,需要选中 [ 加密文件系统 ] 选项,并且,根据系统要求,输入访问 EFS 所需要的密码,如图 13 所示。然后,根据第 3 章的介绍接下来一步一步按照系统的提示进行系统安装即可。那么,在成功安装系统后,用户就拥有了一个安全的加密文件系统,并且,在每次登录系统的时候,系统都会要求用户输入在图 13 所示步骤中设定的密码来进行安全访问。
图 12. 安装时选中 [ 加密系统 (E)] 选项
![图 12. 安装时选中 [ 加密系统 (E)] 选项](/img/up/2018-1-22/image012.jpg)
图 13. 输入 EFS 所需的密码

五、Linux安全性模型总结
1、Linux安全性模型
- 使用User和Group(角色)控制使用者对文件的操作权限
- 用户使用账号和口令登录Linux
- 每个文件都有owner,且owner属于某个Group
- 每个程序都有owner和Group
2、用户User
- 每个用户都有一个唯一的UserID
- User信息存放在/etc/passwd中,/etc/shadow存放用户密码
- 每个User都有一个home目录
- User未经授权将禁止读写/执行其它User的文件
- root超级管理员账号:具有至高无上的权限。一般情况下不随便使用root登录,防止误操作破坏系统
3、群组Group
- 每个用户都属于一个Group,Group具有唯一的标识符gid
- Group信息存储在/etc/group,/ect/gshadow存放Group的密码,极少情况下为Group设密码
- 系统会为每个User关联一个和User同名的Group,每个User至少存在于自己同名的Group中,User也可以加入其它的Group
- 在同一个Group中的成员可以共享其它成员文件
4、Linux权限种类
- 只读r权限read
- 可写w权限write,可以写/删除文件/目录
- 可执行x权限execute,可执行可执行文件,可进入目录并使用cd切换进入目录
- 没有权限,-表示
5、Linux权限验证机制
当User操作文件时,Linux验证并授权流程:- 判断是否为root;是直接授权访问,否则下一步
- 判断是否与操作文件的owner UID相同;若是则验证U权限,否则下一步
- 判断是否属于操作文件的Group;若是则验证G权限,否则下一步
- 验证O权限
6、Linux文件/目录特殊权限
SUID
基本权限,与设置对象U/G/O形成的基本权限系统设置无法满足系统运行和管理上的需求。如:普通用户需要修改密码,必须修改/etc/shadow系统文件,为了安全又不能直接授予普通用户对该文件的write权限。
SUID,Set User ID.授予可运行文件SUID权限,使得所有用户运行它时都以它的所有者owner的权限运行。
查看文件是否有SUID:
- #ll /etc/passwd
- -rwsr-xr-x 1 root root 47032 7月 16 03:29 /usr/bin/passwd*
- //第一列第4位为s,表示文件有SUID权限
设置文件SUID权限:
- #chmod 4754 fileName
- //在基本三位数权限前加4
GUID
与SUID类似,具有该权限的文件,在所有用户运行它时均拥有它的group权限。它表示为权限字符串表示法中的第7位,为s表示具有权限的数字表示法中,在基本三位权限前加2。
sticky bit
黏着位。若文件被设置了sticky bit,除了该文件的Owner外,任何人都无法变更该文件(即使给予write权限)。它保证文件由原创建者修改或删除,其他人只能读取。例如:
- #ls -dl /tmp
- drwxrwxrwt 9 root root 4096 9月 19 17:48 /tmp
- //权限最后一位为t,表示该目录设置了sticky bit。
- //表明该文件夹公开可擦写,所有账号都可在此新建/删除/修改文件,但都只能变动自己创建的。
- #chmod -R 1777 test/ //给test目录设置sticky bit,基础3位权限前加1
本章节参考:https://www.ibm.com/developerworks/cn/linux/l-cn-filesystem-sec/
https://www.cnblogs.com/sochishun/p/7413572.html
http://blog.csdn.net/u010093364/article/details/49046891
转载本站内容时,请务必注明来自W3xue,违者必究。