1、ext3中的额外属性
从Linux的1.1系列内核开始,ext2文件系统就开始支持一些针对文件和目录的额外标记或者叫作属性(attribute)。在2.2和2.4系列及其高版本的内核中,ext3文件系统支持以下属性的设置和查询(如表1所示):
▲表1.ext3文件系统支持的属性含义
虽然文件系统能够接受并保留指示每个属性的标志,但是这些属性不一定有效,这依赖于内核和各种应用程序的版本。表2显示了Linux每个版本内核支持的属性标志的具体情况,其中:
OK:表示允许设置这个标志并使设置生效;
POK:允许设置这个标志但忽略其值;
——:表示完全忽略这个标志。
▲表2.Linux各内核版本对属性的支持情况
从上述表格可以看出:虽然早期的内核版本支持安全删除特征,但是从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+Sifilename:给文件添加同步和不可变属性。
chattr-aifilename:把文件的只扩展(append-only)属性和不可变属性去掉。
chattr=aiAfilenamet:使文件只有a、i和A属性。
最后,每个命令都支持-R选项,用于递归地对目录和其子目录进行操作。
3、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属性文件进行修改,除非国旗动到单用户状态。但是,由于引入了更为灵活的内核能力特征(kernelcapabilities),以后的内核不再支持安全层。使用内核能力,也可以实现类似的限制。工具lcap用来查询和调整内核能力约束集(kernelcapabilitiesboundingset)。在启动脚本中加入以下命令,就可以实现对具有i属性和a属性文件的保护:
第一个命令删除任何用户(包括超级用户)对i标志的修改能力。第二个命令删除任何用户(主要针对超级用户)对块设备的原始访问(rawaccess)能力,防止一些技术高超的攻击者直接修改文件系统索引节点的immutable域。BTW,在系统启动时,CAP_SYS_RAWIO能力应该直接删除,这个能力是一个非常大的潜在威胁。高明的攻击者获得了超级用户权限之后,通过/dev/kmem设备可以直接修改内核内存。通过这种方式,可以破坏系统的内核能力约束集(kernelcapabilitiesbounding)。如果没有任何参数,会列出内核支持的能力和目前生效的内核能力。一旦一个内核能力被删除,就只有在系统重新启动,进入到单用户模式才能删除能力限制。
使用chattr
Linux主机直接暴露在Internet或者位于其它危险的环境,有很多shell帐户或者提供HTTP和FTP等网络服务,一般应该在安装配置完成后使用如下命令:
如果很少对帐户进行添加、变更或者删除,把/home本身设置为immutable属性也不会造成什么问题。在很多情况下,整个/usr目录树也应该具有不可改变属性。实际上,除了对/usr目录使用chattr-R+ii/usr/命令外,还可以在/etc/fstab文件中使用ro选项,使/usr目录所在的分区以只读的方式加载。另外,把系统日志文件设置为只能添加属性(append-only),将使入侵者无法擦除自己的踪迹。当然,如果使用这种安全措施,需要系统管理员修改管理方式。
由于软件管理程序需要加入和删除某些文件和目录,因此在进行软件安装和升级之前需要删除某些目录和文件的immutable和append-only属性。对于Linux系统,一般使用rpm管理软件包,用户可以使用以下命令查看要安装或者升级的软件包都有哪些文件:
然后去掉有关目录和文件的immutable和append-only属性。大多数软件包需要rpm命令对以下目录的一个或者多个进行写操作
值得注意的是:如果用户需要升级/usr/sbin/someprogram,应该去掉someprogram文件以及目录/usr/sbin的immutable属性。
(责任编辑:闫小琪)