《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》——1.3 文件系统安全

简介:

本节书摘来自华章计算机《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》一书中的第1章,第1.3节,作者:高俊峰著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.3 文件系统安全

1.3.1 锁定系统重要文件
系统运维人员有时候可能会遇到通过root用户都不能修改或者删除某个文件的情况,产生这种情况的大部分原因可能是这个文件被锁定了。在Linux下锁定文件的命令是chattr,通过这个命令可以修改ext2、ext3、ext4文件系统下文件属性,但是这个命令必须由超级用户root来执行。和这个命令对应的命令是lsattr,后者用来查询文件属性。
通过chattr命令修改文件或者目录的文件属性能够提高系统的安全性,下面简单介绍下chattr和lsattr两个命令的用法。
chattr命令的语法格式如下:

chattr [-RV] [-v version] [mode] 文件或目录

主要参数含义如下:
-R:递归修改所有的文件及子目录。
-V:详细显示修改内容,并打印输出。
其中mode部分用来控制文件的属性,常用参数如表1-2所示。
image

这些参数中,最常用到的是a和i,a参数常用于服务器日志文件安全设定,而i参数更为严格,不允许对文件进行任何操作,即使是root用户。
lsattr用来查询文件属性,用法比较简单,其语法格式如下:

lsattr [-adlRvV] 文件或目录

常用参数如表1-3所示。
image

在Linux系统中,如果一个用户以root的权限登录或者某个进程以root的权限运行,那么它的使用权限就不再有任何的限制了。因此,攻击者通过远程或者本地攻击手段获得了系统的root权限将是一场灾难。在这种情况下,文件系统将是保护系统安全的最后一道防线,合理的属性设置可以最大限度地降低攻击者对系统的破坏程度,通过chattr命令锁定系统一些重要的文件或目录,是保护文件系统安全最直接、最有效的手段。
对一些重要的目录和文件可以加上“i”属性,常见的文件和目录有:

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

对一些重要的日志文件可以加上“a”属性,常见的有:

chattr +a /var/log/messages
chattr +a /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命令保护。
虽然保护/dev、/tmp等目录的安全性无法通过chattr命令实现,但是可以通过另外的方法实现,这些将在下一小节详细介绍。
1.3.2 文件权限检查和修改
不正确的权限设置直接威胁系统的安全,因此运维人员应该能及时发现这些不正确的权限设置,并立刻修正,防患于未然。下面列举几种查找系统不安全权限的方法。
(1)查找系统中任何用户都有写权限的文件或目录
查找文件:find / -type f -perm -2 -o -perm -20 |xargs ls -al
查找目录:find / -type d -perm -2 -o -perm -20 |xargs ls –ld
(2)查找系统中所有含“s”位的程序

find / -type f -perm -4000 -o -perm -2000 -print | xargs ls –al

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

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

将检查的结果保存到文件中,可在以后的系统检查中作为参考。
(4)检查系统中没有属主的文件

find / -nouser -o –nogroup

没有属主的孤儿文件比较危险,往往成为黑客利用的工具,因此在找到这些文件后,要么删除,要么修改文件的属主,使其处于安全状态。
1.3.3 /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的软连接即可。也就是执行如下操作:

[root@server ~]# mv /var/tmp/* /tmp
[root@server ~]# ln -s  /tmp /var/tmp

如果/tmp是根目录下的一个目录,那么设置稍微复杂,可以通过创建一个loopback文件系统来利用Linux内核的loopback特性将文件系统挂载到/tmp下,然后在挂载时指定限制加载选项即可。一个简单的操作示例如下:

[root@server ~]# dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000
[root@server ~]# mke2fs -j /dev/tmpfs
[root@server ~]# cp -av /tmp /tmp.old
[root@server ~]# mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp
[root@server ~]# chmod 1777 /tmp
[root@server ~]# mv -f /tmp.old/* /tmp/
[root@server ~]# rm -rf /tmp.old

最后,编辑/etc/fstab,添加如下内容,以便系统在启动时自动加载loopback文件系统:

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

为了验证挂载时指定限制加载选项是否生效,可以在/tmp分区创建一个shell文件,操作如下:

[root@tc193 tmp]# ls -al|grep shell
-rwxr-xr-x   1 root root    22 Oct  6 14:58 shell-test.sh
[root@server ~]# pwd
/tmp
[root@tc193 tmp]# ./shell-test.sh 
-bash: ./shell-test.sh: Permission denied

可以看出,虽然文件有可执行属性,但是在/tmp分区已经无法执行任何文件了。
最后介绍如何修改/dev/shm的安全设置。由于/dev/shm是一个共享内存设备,因此也可以通过修改/etc/fstab文件设置而实现,在默认情况下,/dev/shm通过defaults选项来加载,这样保证其安全性是不够的,需要修改/dev/shm的挂载属性,操作如下:

tmpfs   /dev/shm    tmpfs   defaults,nosuid,noexec,rw  0 0

通过这种方式限制了任何suid程序,同时也限制了/dev/shm的可执行权限,系统安全性得到进一步提升。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
8月前
|
人工智能 安全 Cloud Native
Nacos 3.0 架构升级,AI 时代更安全的 Registry
随着Nacos3.0的发布,定位由“更易于构建云原生应用的动态服务发现、配置管理和服务管理平台”升级至“ 一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台 ”。
|
8月前
|
存储 设计模式 人工智能
AI Agent安全架构实战:基于LangGraph的Human-in-the-Loop系统设计​
本文深入解析Human-in-the-Loop(HIL)架构在AI Agent中的核心应用,探讨其在高风险场景下的断点控制、状态恢复与安全管控机制,并结合LangGraph的创新设计与金融交易实战案例,展示如何实现效率与安全的平衡。
1339 0
|
8月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
897 0
|
5月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
|
6月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
5月前
|
传感器 人工智能 运维
拔俗AI巡检系统:让设备“会说话”,让隐患“早发现”,打造更安全高效的智能运维
AI巡检系统融合AI、物联网与大数据,实现设备7×24小时智能监测,自动识别隐患并预警,支持预测性维护,提升巡检效率5倍以上,准确率超95%。广泛应用于工厂、电力、交通等领域,推动运维从“被动响应”转向“主动预防”,降本增效,保障安全,助力数字化转型。(238字)
744 0