系统运维人员有时候可能会遇到通过 root 用户都不能修改或者删除某个文件的情况,产生这种情况的大部分原因可能是这个文件被锁定了。在Linux下锁定文件的命令是chattr,通过这个命令可以修改 ext2、ext3、ext4 文件系统下文件属性,但是这个命令必须有超级用户 root 来执行。和这个命令对应的命令是 lsattr,这个命令用来查询文件属性。
chattr修改文件或目录属性:
chattr [-RV] [mode] 文件或目录
-R: 递归修改所有的文件及子目录
-V: 详细显示修改内容,并打印输出
+ 在原有的设定基础上,追加参数
- 在原有参数设定基础上,移除参数
= 更新为指定参数
a 即append,设定该参数后,只能向文件中添加数据,而不能删除。常用于服务器日志文件安全,只有root用户才能设置这个属性
i 即immutable,设定文件不能被修改、删除、重命名、设定链接等,同时不能写入或新增加内容。这个参数对于文件系统的安全设置有很大帮助
c 即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作
s 安全的删除文件或目录,即文件被删除后硬盘空间被全部收回
u 于s参数相反,当设定为u时,系统会保留其数据块便以后能够恢复删除这个文件。
这些参数中,最常用到的是a和i,a参数常用于服务器日志文件安全设定而i参数更为严格,不允许文件进行任何操作,即使是root用户
lsattr 用来查询文件或目录属性:
lsattr [-adRvV] 文件或目录
-a 列出目录中的所有文件,包括以. 开头的文件
-d 显示指定目录的属性
-R 以递归的方式列出目录下所有文件及子目录以及属性值
-v 显示文件或目录版本
chattr -R +i /bin /boot /lib /sbin
chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin
chattr +i /etc/passwd /etc/shadow /etc/hosts /etc/resolv.conf /etc/fstab /etc/sudoers
chattr +a /var/log/messages /var/log/wtmp
对重要的文件进行加锁,虽然能够提高服务器的安全性,但是也会带来一些不便,例如,在软件的安装、升级时可能需要去掉有关目录和文件的immutable属性和append-only属性,同时,对日志文件设置了 append-only 属性,可能会使日志轮换(logrotate)无法进行。因此,在使用 chattr 命令前,需要结合服务器的应用环境来权衡是否需要设置 immutable 属性和append-only 属性。
另外,虽然通过 chattr 命令修改文件属性能够提高文件系统的安全性,但是它并不适合所有的目录。chattr 命令不能保护/、/dev、/tmp、/var 等目录。
根目录不能有不可修改属性,因为如果根目录具有不可修改属性,那么系统根本无法工作:/dev 在启动时,syslog 需要删除并重新建立/dev/log 套接字设备,如果设置了不可修改属性,那么可能出问题;/tmp 目录会有很多应用程序和系统程序需要在这个目录下建立临时文件,也不能设置不可修改属性;/var 是系统和程序的日志目录,如果设置为不可修改属性,那么系统写日志将无法进行,所以也不能通过 chattr 命令保护。
虽然通过 chattr 命令无法保护/dev、/tmp 等目录的安全性,但是有另外的方法可以实现