作为系统管理员,我经常遇到这样的场景:某天突然发现服务器上的用户账户莫名其妙多了几个,或者重要系统文件被人篡改过。这种时候往往意味着系统已经遭到入侵,而攻击者通常就是从修改/etc/passwd、/etc/shadow这些关键文件开始的。
Linux系统的核心配置文件就像是大楼的承重墙,一旦被破坏整个系统就会面临崩溃风险。比如:
在实际运维中,我发现很多管理员只注重防火墙、杀毒软件这些外围防护,却忽视了最基础的文件保护。这就好比给大门装了十道锁,却忘了关窗户。攻击者一旦获取root权限,就能随意修改这些文件,比如:
去年我们公司就发生过一起真实案例:某台测试服务器因为使用了弱密码被入侵,攻击者修改了passwd文件添加后门账户,三个月后这个账户被用来发起内网渗透。如果当时用chattr锁定了这些文件,至少能增加攻击者的操作难度,为我们争取发现和响应的时间。
chattr这个命令名字很有意思,它是"change attribute"的缩写,但很多新手会误以为是"chat attribute"。我第一次使用时也闹过这个笑话。实际上它是用来修改文件在ext2/ext3/ext4文件系统上的特殊属性的,这些属性比常规的rwx权限更底层。
最常用的就是+i参数,它能让文件变成"不可变"(immutable)状态。我把它理解为给文件上了把物理锁——即使你有root权限也无法修改或删除。具体效果包括:
设置方法非常简单:
bash复制chattr +i /etc/passwd
chattr +i /etc/shadow
但要注意几个关键细节:
我建议把常用操作封装成脚本,比如创建一个secure_files.sh:
bash复制#!/bin/bash
FILES="/etc/passwd /etc/shadow /etc/group /etc/sudoers"
for file in $FILES; do
[ -f "$file" ] && chattr +i "$file"
done
让我们模拟一次完整的安全加固过程。假设我们刚部署了一台新的CentOS服务器,现在要锁定关键配置文件。
首先用lsattr查看文件现有属性:
bash复制lsattr /etc/passwd /etc/shadow /etc/group /etc/sudoers
正常输出应该类似:
code复制-------------e-- /etc/passwd
-------------e-- /etc/shadow
-------------e-- /etc/group
-------------e-- /etc/sudoers
这里的'e'表示文件使用extents方式存储,是正常现象。
执行保护命令:
bash复制for file in /etc/passwd /etc/shadow /etc/group /etc/sudoers; do
chattr +i $file
done
尝试修改受保护的文件:
bash复制echo "test" >> /etc/passwd
你会看到报错:
code复制bash: /etc/passwd: Operation not permitted
再尝试删除:
bash复制rm -f /etc/passwd
报错:
code复制rm: cannot remove '/etc/passwd': Operation not permitted
比如要添加新用户:
bash复制chattr -i /etc/passwd /etc/shadow
useradd testuser
passwd testuser
chattr +i /etc/passwd /etc/shadow
如果需要保护整个目录,可以加-R参数:
bash复制chattr -R +i /etc/ssh/
但要注意这会影响该目录下所有文件的正常使用,比如导致sshd无法更新known_hosts文件。更好的做法是只保护关键配置文件:
bash复制chattr +i /etc/ssh/sshd_config
对于需要持续写入的日志文件,可以用+a属性:
bash复制chattr +a /var/log/secure
这样日志仍可追加,但无法删除或清空文件。
如果发现chattr命令不生效,检查:
可以将文件属性检查纳入日常安全审计:
bash复制#!/bin/bash
CHECK_FILES="/etc/passwd /etc/shadow /etc/sudoers"
for file in $CHECK_FILES; do
if ! lsattr $file | grep -q "i"; then
echo "WARNING: $file is not immutable!"
fi
done
很多人会问:既然有chattr,为什么还需要文件权限、SELinux等其他机制?其实它们各有所长:
| 保护机制 | 作用层级 | 防护重点 | 绕过难度 |
|---|---|---|---|
| 文件权限 | 用户/组 | 常规读写控制 | 低 |
| chattr | 文件系统 | 防删除/修改 | 中 |
| SELinux | 内核 | 进程访问控制 | 高 |
| 文件完整性监控 | 审计 | 变更检测 | - |
在实际项目中,我通常会采用分层防御策略:
这种组合方案能有效提高攻击者的入侵成本。记得有次我们的监控系统发现有人尝试修改/etc/passwd,但由于chattr的保护,攻击者虽然拿到了root权限却无法完成操作,最终触发了警报被我们发现。
在金融行业的生产环境中,我们有套严格的操作规范:
有几点特别实用的经验想分享:
曾经踩过一个坑:某次紧急修复时直接对受保护的文件用了vim,修改后无法保存才发现忘了先取消i属性。现在我的习惯是,在需要编辑受保护文件时,先用脚本检查并临时解除保护,操作完成后再自动恢复。