英皇声乐考级教师培训:利用chattr保护文件系统的安全

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 22:40:02

利用chattr保护文件系统的安全

  众所周知,Linux内核中有大量安全特征,其中有很多特征有着广泛的应用,但是绝大多数的系统管理员(包括一些资深系统管理员)都忽略了ext2文件系统的属性(attribute)。Linux的这种安全特征甚至远没有Lids和Tripwire等外部安全工具受关注。本文将详细介绍ext2文件系统的属性,以及如何使用这个特征保护系统的安全。
什么是ext2文件系统的属性(attribute)?从Linux的1.1系列内核开始,ext2文件系统就开始支持一些针对文件和目录的额外标记或者叫作属性(attribute)。在2.2和2.4系列的内核中,ext2文件系统支持以下属性的设置和查询(见表1):
虽然文件系统能够接受并保留表示每个属性的标志,但是这些属性却不一定有效,这要看内核的版本。表2是每个版本支持的属性:
在这些属性中,最为重要的是a(Append Only)属性和不可修改(immutable)属性,它们对于提高文件系统的安全性和保障文件系统的完整性(尤其对于系统日志文件)有很大的作用。
另外,由于ext3文件系统是以ext2文件系统为基础的,因此所有ext2文件系统支持的属性,ext3文件系统也都支持。

管理工具

标准的系统命令,例如:ls、chmod并不支持对文件属性的查询和修改。要查看或者修改文件或者目录的属性,需要使用ext2文件系统工具包(e2fsprogs)中的两个工具:chattr和lsattr。
lsattr命令的使用非常简单,它支持以下命令行选项(见表3):

 

 

 

chattr的用法和命令chmod命令的用法极为相似,例如:
◆ 给test.txt文件添加同步(S)和不可修改(i)属性:
[root@LinuxAid nixe0n]# chattr +Si test.txt
◆ 把文件的只扩展(a)属性和不可变属性(i)去掉:
[root@LinuxAid nixe0n]# chattr -ai test.txt
◆ 把test.txt文件的属性设置为a、i和A:
[root@LinuxAid nixe0n]# chattr =aiA test.txt
◆ 递归地改变test目录下所有文件和目录的属性:
[root@LinuxAid nixe0n]# chattr -R +i test/
属性和权限的区别
几乎所有使用Unix系统的用户都理解文件/目录权限和所有者的概念,对ls命令就更熟悉不过了。下面,我们使用具体的例子来看属性和权限的区别:
[nixe0n@LinuxAid nixe0n]$ ls -al test*
-rw-rw-r--    1 nixe0n  users           0 Oct 17 17:02 test.conf
-rw-rw-r--    1 nixe0n  users           0 Oct 17 17:02 test.log
-rw-rw-r--    1 nixe0n  users           0 Oct 16 19:41 test.txt
从ls的输出可以得到这些信息:这些文件属于用户nixe0n、nixe0n所在的用户组是users、用户nixe0n本人、users用户组的成员具有对文件的修改权限、其他的用户只有读取文件的权限。
下面再看lsattr命令的输出:
[nixe0n@LinuxAid nixe0n]$ lsattr -a test*
---i-------- test.conf
----a------- test.log
------------ test.txt
输出结果显示,test.log只能被添加,而test.conf文件不准任何修改。

利用chattr提高系统的安全

在Unix及Linux系统中,如果一个用户以root的权限登录或者某个进程是以root的权限运行的,使用权限就不再有任何的限制了。因此,攻击者通过远程或者本地攻击手段获得系统的root权限将是一个灾难。
在这种情况下,文件系统将是系统的最后一道防线,合理的属性设置可以最大限度地减小对系统的破坏程度,保存攻击者的行踪。在内核中,属性是由sys_open()和sys_truncate()等系统调用检查和修改的,不受用户识别号的影响。因此在任何情况下,试图对具有不可修改(immutable)属性的文件进行任何修改都会失败,而不管是否是root用户。例如:
[root@LinuxAid nixe0n]# chattr +i test.conf
[root@LinuxAid nixe0n]# rm -f test.conf
rm: can't unlink 'test.conf': Operation not permitted
不过,到目前为止防护只不过给攻击者加了一点小麻烦罢了。只要获得了root权限,他可以使用chattr命令把文件的i属性去掉。因此,系统的安全性并没有根本性的提高,我们还需要和其他的方法结合使用才能真正提供系统的安全性。
在Linux2.1之前的内核版本中,存在一个安全层(secure level)的概念。如果系统的安全层大于0,内核将不允许对任何文件的i属性进行修改。这些版本的内核由sysctl命令的“kernel.securelevel”变量进行控制。如果在启动时,这个变量的值被设置为1或者更大的值,内核将不允许对具有i属性和a属性的文件进行修改,除非启动到单用户状态。
但是,在2.2版及以后的版本中,Linux内核引入了更为灵活的能力(capability)的概念。修改能力约束集(capabilities bounding set),使内核放弃CAP_LINUX_不可修改(immutable)属性和CAP_SYS_RAWIO能力,才能使属性的保护生效。直接修改能力约束集(capabilities bounding set)比较麻烦,工具lcap(作者的个人主页已经关闭,可以使用google找一下)可以帮助您方便地放弃内核的能力:
lcap CAP_LINUX_IMMUTABLE
lcap CAP_SYS_RAWIO
上面的第一个命令删除任何用户(包括超级用户)对i标志的修改能力;第二个命令删除任何用户(主要针对超级用户)对块设备直接访问的能力,防止一些技术高超的攻击者直接修改文件系统索引节点的不可修改(immutable)属性域。一旦一个内核能力被删除,就只有在系统重新启动,才能恢复被删除能力。
如果主机直接暴露在Internet或者位于其他危险的环境,而且有很多shell账户或者提供HTTP和FTP等网络服务,一般应该在安装配置完成后对一些重要的目录和文件加上i属性,以及给一些重要的日志文件加上a属性:
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目录树也应该具有不可改变属性。除此之外,为了系统的安全,还可以修改/etc/fstab使/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/share
因此,如果您需要升级/usr/sbin/someprogram,您应该去掉someprogram文件本身以及目录/usr/sbin的不可修改(immutable)属性。

用户和用户组的管理

如果要修改用户和用户组,需要读写以下的目录和文件:
/etc
/etc/.pwd.lock
/etc/passwd
/etc/passwd-
/etc/shadow
/etc/shadow-
/etc/group
/etc/group-
/etc/gshadow
/etc/gshadow-
在修改过程中,passwd(1)、 chsh(1)、chfn(1)、vipw(8)、vigr(8)和useradd(8)等命令需要在/etc目录下建立临时文件,修改这个文件,然后删除原始文件,最后把新文件复制为被修改的系统文件。

不能滥用属性的目录

虽然属性能够提高系统的安全性,但是它并不适合所有的目录。如果在系统中滥用chattr,可能造成很多问题,甚至使系统无法工作。表4是使用chattr时应该注意的一些问题。

表1
属性                                      含义
A               Atime。告诉系统不要修改对这个文件的最后访问时间。
S               Sync。一旦应用程序对这个文件执行了写操作,系统  立刻把修改的结果写到磁盘。
a               Append Only。系统只允许在这个文件之后追加数据,不  允许任何进程覆盖或者截断这个文件。如果目录具有  这个属性,系统将只允许在这个目录下建立和修改文  件,而不允许删除任何文件。
i 不可修改(immutable)属性。系统不允许对这个文件进行  任何的修改。如果目录具有这个属性,那么任何的进  程只能修改目录之下的文件,不允许建立和删除文件。

d               No dump。在进行文件系统备份时,dump程序将忽略这  个文件。
c Compress。系统以透明的方式压缩这个文件。从这个文  件读取时,返回的是解压之后的数据;而向这个文件  中写入数据时,数据被压缩之后,才写入磁盘。
s                   Secure Delete。让系统在删除这个文件时,使用0填充  文件所在的区域。
u Undelete。当一个应用程序请求删除这个文件,系统会  保留其数据块以便以后能够恢复这个文件。

表2
属性           1.0版         1.2版       2 .0版            2.2版             2.4版
A                   N/A          N/A          A                   A                   A
S                     A            A             A                   A                   A
a                    N/A          A             A                   A                   A
i                     N/A         A              A                   A                   A
d                   N/A          A              A                   A                   A
c                   I              I                I                   I                     I
s                   A             A               I                   I                     I
u                   I              I                I                   I                     I
表中:A:内核支持,I:可以设置,但是会被忽略,N/A:内核不支持。

表3
-a   列出目录中的所有文件,包括隐藏文件(以点开头)。
-d   以和文件相同的方式列出目录,并显示其包含的内容。
-R   以递归的方式列出目录的属性及其内容。
-v   列出网络文件系统(Network File System)的文件版本。

表4
/ 很显然,根目录不能有不可修改(immutable)属性。如果  根目录具有不可修改(immutable)属性,系统根本无法工  作。
/dev 在启动时,syslog需要删除并重新建立/dev/log套接  字设备。如果对/dev/目录设置了不可修改(immutable)  属性和append-only属性,就可能出现问题,除非在启  动syslogd时使用-p选项指定其它的套接字,例如:/  var/run/syslog.sock。即使这样也还存在一些问题,  syslog客户程序需要/dev/log套接字设备,因此需要  建立一个到真正套接字的符号连接。总而言之,为了  减少麻烦,这个目录还是不要设置不可修改(immutable)  属性和append-only属性。
/tmp 有很多应用程序和系统程序需要在这个目录下建立临  时文件,因此这个目录也不能设置为不可修改   (immutable)属性和append-only属性。
/var 这个目录不能设置成不可修改(immutable)属性。对  append-only属性的使用也要根据实际情况。例如,如  果为var/log目录下的日志文件设置了append-only属  性,会使日志轮换(logrotate)无法进行,但不会造成太  大问题,您需要权衡是否使用日志轮换的利弊,以决  定是否对日志文件设置append-only属性。再比如,  sendmail程序会定时地截断或者覆盖/var/log/   sendmail.st文件,因此也不能设置append-only属性。