本文最后更新于 2019-11-19【23 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!

锁定系统重要文件

系统运维人员有时候可能会遇到通过 root 用户都不能修改或者删除某个文件的情况,产生这种情况的大部分原因可能是这个文件被锁定了。在Linux下锁定文件的命令是 chattr,通过这个命令可以修改 ext2、ext3、ext4 文件系统下文件属性,但是这个命令必须有超级用户root来执行。和这个命令对应的命令是 lsattr,这个命令用来查询文件属性。

对重要的文件进行加锁,虽然能够提高服务器的安全性,但是也会带来一些不便。

例如:在软件的安装、升级时可能需要去掉有关目录和文件的 immutable 属性和 append-only 属性,同时,对日志文件设置了append-only 属性,可能会使日志轮换(logrotate)无法进行。因此,在使用 chattr 命令前,需要结合服务器的应用环境来权衡是否需要设置 immutable 属性和 append-only 属性。

另外,虽然通过 chattr 命令修改文件属性能够提高文件系统的安全性,但是它并不适合所有的目录。chattr 命令不能保护 /、/dev、/tmp、/var 等目录。

根目录不能有不可修改属性,因为如果根目录具有不可修改属性,那么系统根本无法工作

  • /dev 在启动时,syslog 需要删除并重新建立 /dev/log 套接字设备,如果设置了不可修改属性,那么可能出问题;
  • /tmp 目录会有很多应用程序和系统程序需要在这个目录下建立临时文件,也不能设置不可修改属性;
  • /var 是系统和程序的日志目录,如果设置为不可修改属性,那么系统写日志将无法进行,所以也不能通过 chattr 命令保护。

文件权限检查和修改

不正确的权限设置直接威胁着系统的安全,因此运维人员应该能及时发现这些不正确的权限设置,并立刻修正,防患于未然。下面列举几种查找系统不安全权限的方法。

查找系统中任何用户都有写权限的文件或目录

查找文件: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

含有“s”位权限的程序对系统安全威胁很大,通过查找系统中所有具有“s”位权限的程序,可以把某些不必要的“s”位程序去掉,这样可以防止用户滥用权限或提升权限的可能性。

检查系统中所有 suid 及 sgid 文件

find / -user root -perm -2000 -print -exec md5sum {} ;
find / -user root -perm -4000 -print -exec md5sum {} ;

将检查的结果保存到文件中,可在以后的系统检查中作为参考。

检查系统中没有属主的文件

find / -nouser -o –nogroup

没有属主的孤儿文件比较危险,往往成为黑客利用的工具,因此找到这些文件后,要么删除掉,要么修改文件的属主,使其处于安全状态。

/tmp、/var/tmp、/dev/shm安全设定

在 Linux 系统中,主要有两个目录或分区用来存放临时文件,分别是 /tmp 和 /var/tmp。

存储临时文件的目录或分区有个共同点就是所有用户可读写、可执行,这就为系统留下了安全隐患。攻击者可以将病毒或者木马脚本放到临时文件的目录下进行信息收集或伪装,严重影响服务器的安全,此时,如果修改临时目录的读写执行权限,还有可能影响系统上应用程序的正常运行,因此,如果要兼顾两者,就需要对这两个目录或分区就行特殊的设置。

/dev/shm 是 Linux 下的一个共享内存设备,在Linux启动的时候系统默认会加载 /dev/shm,被加载的 /dev/shm 使用的是 tmpfs 文件系统,而 tmpfs 是一个内存文件系统,存储到 tmpfs 文件系统的数据会完全驻留在 RAM 中,这样通过 /dev/shm 就可以直接操控系统内存,这将非常危险,因此如何保证 /dev/shm 安全也至关重要。

对于 /tmp 的安全设置,需要看 /tmp 是一个独立磁盘分区,还是一个根分区下的文件夹,如果 /tmp 是一个独立的磁盘分区,那么设置非常简单,修改 /etc/fstab 文件中 /tmp 分区对应的挂载属性,加上 nosuid、noexec、nodev 三个选项即可,修改后的 /tmp 分区挂载属性类似如下:

LABEL=/tmp  /tmp ext3 rw,nosuid,noexec,nodev 0 0

其中,nosuid、noexec、nodev 选项,表示不允许任何 suid 程序,并且在这个分区不能执行任何脚本等程序,并且不存在设备文件。

在挂载属性设置完成后,重新挂载 /tmp 分区,保证设置生效。

对于 /var/tmp,如果是独立分区,安装 /tmp 的设置方法是修改 /etc/fstab 文件即可;如果是 /var 分区下的一个目录,那么可以将 /var/tmp 目录下所有数据移动到 /tmp 分区下,然后在 /var 下做一个指向 /tmp 的软连接即可。也就是执行如下操作:

mv /var/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,添加如下内容,以便系统在启动时自动加载 loopback 文件系统:

/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0

其他未尽事项

Linux 安全运维系列文章:

本系列文章系转载

  • 来自:马哥 Linux 运维,
  • 作者:高俊峰,Linux 资深技术专家,畅销书籍《循序渐进 Linux 》、《高性能 Linux 服务器构建实战》作者

推荐使用:阿里云 云翼计划学生优惠、ECS、轻量应用等产品与服务【 点击注册

本文作者:Quanyin Tang

本文链接:Linux 安全运维系列之三:文件系统安全 - https://www.imtqy.com/linux-safe-file-system.html

版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 Quanyin 所有,未经允许禁止转载,经授权转载请注明出处!