安全运维之文件系统保护
在linux系统中,如果一个进程以root权限运行或者一个用户以root用户身份登录,那么它的权限就不再有任何限制,因此如果一旦root权限被黑客掌握,对于系统来说将会是一场灾难,在这种情况下,文件系统保护将会成为系统的最后一道防线,合理的设置文件系统保护可以最大限度的降低攻击对系统造成的破坏。
锁定重要文件
如果系统中存在一些非常重要的文件,可以通过chattr
命令将其锁定,这样即使是root用户也没法对文件进行修改和删除。该命令可以修改ext2、ext3、ext4文件系统下的文件属性,而且这个命令只能由root用户执行。对应的,lsattr
可以用来查询文件属性。
chattr命令的语法如下:
chattr [-rv] [-v version] [mode] /路径/文件
主要参数如下:
- -r:递归修改所有文件及子目录
- -v:详细显示修改内容,并打印输出
- mode:
- +:追加参数
- -:移除参数
- =:更新为指定参数
- a:append,设定后只能添加数据,而不能删除数据,只有root用户可以设置这个属性。
- c:compress,设定文件是否压缩后再储存。读取时需要自动解压。
- i:immutable,设定文件不能被写入、修改、删除、重命名、设定软硬链接。
- s:安全删除,文件被删除后全部收回硬盘空间。
- u:保留删除,系统会保留其数据块,以便恢复数据。
lsattr命令的语法如下:
lsattr [-adirvv] /路径/文件
主要参数如下:
- -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 $ chattr +i /etc/shadow $ chattr +i /etc/hosts $ chattr +i /etc/resolv.conf $ chattr +i /etc/fstab $ chattr +i /etc/sudoers $ chattr +s /var/log/messages $ chattr +s /var/log/stmp
为文件系统进行保护虽然可以提高系统安全性,但是也会在一些情况下造成不便,例如在一些软件的安装与升级时,可能需要去掉相关目录的immutable属性和append-only属性,对日志文件设置了append-only属性也可能会导致日志轮换(logrotate)无法进行。
所以在使用chattr前,需要结合服务器的应用环境来权衡如何设置保护。
而且chattr命令不能保护/、/dev、/tmp、/var等目录:
- 根目录如果设置的不可修改属性,那么系统会无法工作
- /dev在工作时,syslog需要删除并重新建立/dev/log下的套接字设备
- /tmp会有很多程序和系统程序在这个目录下建立临时文件
- /var是系统和程序的日志目录,如果将其设置为不可修改,系统将无法记录日志
文件权限检查
不正确的设置文件权限会造成安全隐患,及时发现这些隐患可以防范于未然。
以下是一些查找不安全权限的方法:
- 查找系统中任何用户都有写权限的文件和目录:
#对文件: $ find / -type f -perm -2 -o -perm -20 |xargs ls -al #对目录: $ find / -type d -perm -2 -o -perm -20 |xargs ls -ld
- 查找系统中含有“s”位的程序:
$ find / -type f -perm -4000 -o -perm -2000 -print |xargs ls -al
- 查找系统中所有suid及sgid文件
#suid $ find / -user root -perm -2000 -print -exec md5sum () \; #sgid $ find / -user root -perm -4000 -print -exec md5sum () \;
- 检查系统中没有属主的文件
$ find / -nouser -o -nogroup
/tmp、/var/tmp、/dev/shm安全保护
在linux系统中,/tmp
和/var/tmp
目录用于存放临时文件,但临时文件对所有用户来说都可读可写可执行,这就为系统安全留下了安全隐患,这些目录可能被攻击者留下恶意脚本进行信息收集或伪装。但如果修改临时文件的读写权限,就有可能影响系统和程序的正常运行。因此,这些目录需要通过特殊设置来保护。
而/dev/shm
是一个内存共享设备,在linux启动时会默认加载/dev/shm
,/dev/shm
在加载时,使用的是tmpfs文件系统,而tmpfs文件系统是一个内存文件系统,会将该文件系统中的文件全部主流进内存中。这样通过/dev/shm
就可以直接操控系统内存。
保护/tmp
的方法:
- 如果
/tmp
是独立磁盘分区的话,将/etc/fstab
中的/tmp
挂载属性修改为如下:
label=/tmp /tmp ext3 rw,nosuid,noexec,nodey 0 0
其中,
* nosuid:不允许任何suid程序
* noexec:不允许执行脚本程序
* nodev:不存在设备文件
- 如果是
/var
分区下的一个目录,那么可以先将/var/tmp
中的数据移动到/tmp
分区下,然后在/var
做一个指向/tmp
的软连接即可:
$ mv /vat/tmp/* /tmp $ ln -s /tmp /var/tmp
- 如果
/tmp
是根目录下的一个目录,可以通过创建一个loopback文件系统利用linux内核中的loopback特性将文件系统挂载到/tmp
下,然后在挂载时设定挂载选项:
$ dd if=/dev/zero of=/dev/tmpfs bs=1m count=10000 $ mke2fs -j /dev/tmpfs $ cp -av /tmp /tmp.old $ mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp $ chmod 1777 /tmp $ mv -f /tmp.old/* /tmp/ $ rm -rf /tmp.old
然后编辑/etc/fstab
,添加如下内容:
/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0
完成后,建议验证一下配置是否生效,在tmp文件夹下建立一个shell文件尝试执行。
保护/dev/shm
的方法:
- /dev/shm是一个设备文件,所以也可以通过修改
/etc/fstab
实现,将/etc/fstab
中挂载属性修改为如下所示:
tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0