第四章:操作系统基线(Linux)——SSH配置、PAM模块、umask设置、文件权限管理
各位好,我是老赵。今天咱们聊聊Linux基线里最核心的几个点。说实话,我见过太多“被黑”的案例,十有八九都是这几个地方没守住。SSH、PAM、umask、文件权限,这四个东西就像你家大门的四把锁。少一把,或者锁芯太差,黑客进来就跟逛自家后院一样。
咱们一个一个来拆解。我会把我在项目里踩过的坑、总结的经验,都揉进去。
4.1 SSH配置:别让大门形同虚设
SSH是Linux远程管理的命门。我接手过一个金融客户的案子,他们服务器被入侵了整整三个月才发现。怎么进来的?SSH端口是默认的22,root可以直接登录,密码还是“Admin@123”。你说这跟没锁门有啥区别?
所以,SSH基线配置,我建议你从这几个地方下手:
核心原则:最小化暴露面,强化认证手段。
4.1.1 禁用root直接登录
为什么?因为root是系统里权限最高的账号,黑客一旦拿到root密码,整个系统就完了。我习惯的做法是:先用普通用户登录,然后通过sudo或su切换到root。
配置方法很简单,修改 /etc/ssh/sshd_config 文件:
# 找到这行,确保是 no
PermitRootLogin no
# 如果你需要密钥登录,可以改成 prohibit-password
# PermitRootLogin prohibit-password
改完后记得重启服务:systemctl restart sshd。
注意:改这个之前,一定要确认你有一个普通用户能登录,并且有sudo权限。否则你把自己锁在外面,那就尴尬了。我曾经就见过一个运维兄弟,改完配置忘了测试,结果自己进不去了,最后只能去机房接显示器...
4.1.2 修改默认端口
把SSH端口从22改成别的,比如2222或10022。这虽然不能防住真正的黑客,但能挡住99%的自动化扫描脚本。你想想看,每天有多少脚本在扫22端口?改了之后,日志里那些暴力破解的尝试会少很多。
# 在 /etc/ssh/sshd_config 中
Port 2222
4.1.3 限制登录用户和IP
如果服务器只给特定几个人用,那就明确指定谁可以登录。我一般会加上 AllowUsers 或 AllowGroups。
# 只允许 user1 和 user2 登录
AllowUsers user1 user2
# 或者只允许 admin 组的用户登录
AllowGroups admin
更进一步,可以用 Match Address 限制来源IP。比如只允许公司VPN的IP段登录:
Match Address 192.168.1.0/24
PermitRootLogin no
4.1.4 使用密钥认证,禁用密码认证
密码认证太容易被暴力破解了。密钥认证才是正道。我建议你生成一对密钥,把公钥放到服务器的 ~/.ssh/authorized_keys 里,然后禁用密码登录。
# 在 /etc/ssh/sshd_config 中
PasswordAuthentication no
PubkeyAuthentication yes
小技巧:密钥文件一定要设置好权限。私钥(id_rsa)权限设为600,公钥(id_rsa.pub)权限设为644。否则SSH会直接忽略你的密钥。
4.2 PAM模块:认证的守门员
PAM(Pluggable Authentication Modules)是Linux的认证框架。说白了,它决定了用户怎么登录、密码怎么验证、登录失败怎么办。我把它比作“守门员”——你踢球技术再好,过不了守门员这关也白搭。
4.2.1 密码复杂度策略
很多系统默认的密码策略太松了。比如允许“123456”这种密码。我建议你通过PAM的 pam_pwquality.so 模块来加强。
修改 /etc/pam.d/system-auth 或 /etc/pam.d/password-auth(不同发行版路径略有不同):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
minlen=12 # 密码最小长度12位
dcredit=-1 # 至少包含1个数字
ucredit=-1 # 至少包含1个大写字母
lcredit=-1 # 至少包含1个小写字母
ocredit=-1 # 至少包含1个特殊字符
这样设置后,用户改密码时就必须满足这些要求。嗯,这里要注意:别设得太变态,否则用户记不住,会写在便签纸上贴在显示器上——我见过这种“安全漏洞”。
4.2.2 登录失败锁定策略
防止暴力破解的另一个手段是:登录失败几次后锁定账号。用 pam_tally2.so 或 pam_faillock.so 模块。
# 在 /etc/pam.d/system-auth 中添加
auth required pam_tally2.so deny=5 unlock_time=300
even_deny_root root_unlock_time=600
这段配置的意思是:连续输错5次密码,账号锁定5分钟。root账号锁定10分钟。
避坑指南:我曾经在一个生产环境上配了登录锁定,结果忘了设置 even_deny_root 参数。黑客尝试root登录失败后,root账号被锁了。最后我不得不重启服务器进单用户模式才解开。所以,配PAM一定要小心,先在测试环境试一遍。
4.3 umask设置:新文件的默认权限
umask决定了你新建文件或目录时,默认的权限是什么。很多人忽略这个,结果新创建的文件权限是777,谁都能改。
umask的计算公式很简单:
- 文件默认最大权限:666
- 目录默认最大权限:777
- 实际权限 = 最大权限 - umask值
举个例子:umask设为022,那么:
- 新文件权限:666 - 022 = 644(rw-r--r--)
- 新目录权限:777 - 022 = 755(rwxr-xr-x)
我建议的umask值:
| 场景 | 推荐umask | 文件权限 | 目录权限 |
|---|---|---|---|
| 普通用户 | 022 | 644 | 755 |
| Web服务器 | 027 | 640 | 750 |
| 高安全环境 | 077 | 600 | 700 |
设置方法:在 /etc/profile 或 /etc/bashrc 中加上:
umask 022
如果你只想对某个用户生效,可以写在 ~/.bashrc 或 ~/.profile 里。
我的习惯:我会在全局的 /etc/profile 里设一个保守的umask(比如027),然后在需要宽松权限的特定用户下覆盖它。这样既保证了安全,又不会影响业务。
4.4 文件权限管理:别给多了
文件权限管理,说白了就是“最小权限原则”。给用户或进程刚刚好的权限,多一分都不要。
4.4.1 SUID/SGID/SBIT 特殊权限
这三个东西很容易被滥用。SUID(Set User ID)允许用户以文件所有者的身份执行程序。比如 /usr/bin/passwd 就有SUID位,普通用户才能用它改密码。
但SUID也是黑客的最爱。他们找到一个有SUID的漏洞程序,就能提权到root。
检查系统中所有SUID文件:
find / -perm -4000 -type f 2>/dev/null
检查SGID文件:
find / -perm -2000 -type f 2>/dev/null
检查Sticky Bit目录(比如 /tmp):
find / -perm -1000 -type d 2>/dev/null
我建议你定期跑一遍这些命令,把结果和上一次的对比。如果多了不该有的SUID文件,那就要警惕了。
4.4.2 关键系统文件权限
有些文件是系统的命根子,权限必须严格:
| 文件/目录 | 推荐权限 | 说明 |
|---|---|---|
| /etc/shadow | 000 或 400 | 密码哈希文件,只有root能读 |
| /etc/passwd | 644 | 用户信息,所有人可读,但不可写 |
| /etc/ssh/sshd_config | 600 | SSH配置,只有root能读写 |
| /etc/sudoers | 440 | sudo配置,必须用visudo编辑 |
| /var/log | 750 | 日志目录,只有root和adm组能读 |
4.4.3 使用ACL实现精细控制
有时候传统的ugo权限不够用。比如你想让某个用户能读一个文件,但不想改文件的所有者。这时候ACL(Access Control List)就派上用场了。
# 给 user1 添加读权限
setfacl -m u:user1:r /path/to/file
# 查看ACL
getfacl /path/to/file
# 移除ACL
setfacl -x u:user1 /path/to/file
注意:ACL虽然灵活,但也会增加管理复杂度。我建议只在必要的时候用,不要滥用。否则审计的时候,你会被一堆ACL规则搞晕。
4.5 知识体系总览
说了这么多,咱们用一张图来总结一下这章的核心逻辑。你看,这四个模块是环环相扣的:
你看,这四个模块从“入口”到“认证”,再到“默认权限”和“存量权限”,形成了一个完整的闭环。任何一个环节出问题,整个安全防线就可能崩溃。
4.6 实战检查清单
最后,我整理了一个检查清单。你每次做基线合规检测时,可以照着这个来:
- SSH检查:
- 是否禁用root直接登录?
- 端口是否从22改成了其他?
- 是否限制了登录用户和IP?
- 是否启用了密钥认证并禁用了密码认证?
- PAM检查:
- 密码复杂度策略是否生效?
- 登录失败锁定策略是否配置?
- 是否有不必要的PAM模块被加载?
- umask检查:
- 全局umask是否设置(/etc/profile)?
- 关键用户的umask是否合理?
- 新创建的文件和目录权限是否符合预期?
- 文件权限检查:
- 是否有异常的SUID/SGID文件?
- 关键系统文件(/etc/shadow等)权限是否正确?
- 不必要的ACL规则是否清理?
嗯,这章内容就到这里。记住,安全基线不是配完就完事了。你得定期检查、持续改进。下次我可能会跟你聊聊日志审计和入侵检测——那又是另一个有意思的话题了。