4. 操作系统基线(Linux):账号权限、SSH配置、日志审计、内核参数加固
各位好,欢迎来到第四章。这一章我们聊聊Linux操作系统的基线。
说实话,我见过太多“裸奔”的Linux服务器了。默认配置直接上线,密码策略形同虚设,SSH端口暴露在公网上,日志审计根本没开。嗯,这就像你家大门没锁,窗户大开,还贴了张纸条说“欢迎光临”。
所以,基线就是给系统穿上一件防弹衣。今天我们从四个维度来搞定它:账号权限、SSH配置、日志审计、内核参数加固。这四个点,基本覆盖了Linux服务器90%的安全风险。
核心思路:最小权限原则 + 最小暴露面原则。能不给的权限,坚决不给;能不开的服务,坚决不开。
4.1 账号权限:谁该有什么,一清二楚
账号权限这块,说白了就是搞清楚两件事:谁在用,以及他能干什么。
我建议你从下面几个点入手:
- 清理僵尸账号:离职员工的账号、测试账号、共享账号,统统禁用或删除。用
awk -F: '($3==0){print $1}' /etc/passwd检查UID为0的账号,理论上只有root一个。 - 密码策略:别让用户设“123456”这种密码。修改
/etc/login.defs和/etc/pam.d/system-auth,设置密码长度、复杂度、过期时间。 - sudo权限:谁有root权限?用
visudo管理,别直接改文件。我见过有人把sudoers文件权限改成777,结果sudo直接罢工。 - umask设置:默认文件权限别太宽松。建议
umask 027,新文件默认只有属主有写权限。
我的习惯:每季度做一次账号审计。写个脚本跑一遍,把超过90天未登录的账号列出来,发给业务方确认。没人认领的,直接禁用。
这里给一个密码策略的参考配置:
# /etc/login.defs 关键参数
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_MIN_LEN 12
PASS_WARN_AGE 7
# /etc/pam.d/system-auth 添加
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
4.2 SSH配置:把大门看紧了
SSH是Linux服务器的“大门”。门没锁好,黑客分分钟进来串门。
我个人习惯,拿到一台新服务器,第一件事就是改SSH配置。核心就几条:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Port | 非22端口(如 2222) | 避开自动化扫描 |
| PermitRootLogin | no | 禁止root直接登录 |
| PasswordAuthentication | no | 禁用密码登录,只用密钥 |
| PubkeyAuthentication | yes | 启用密钥认证 |
| AllowUsers | 指定用户列表 | 白名单机制 |
| MaxAuthTries | 3 | 限制认证尝试次数 |
| ClientAliveInterval | 300 | 空闲超时断开 |
我曾经踩过的坑:有一次改SSH端口后,忘了在防火墙放行新端口。结果自己也被关在外面了。还好有带外管理卡(iLO/iDRAC)才进去。所以,改SSH配置前,一定确保你有备用通道。
修改完配置,记得重启服务:systemctl restart sshd。但别急着关当前会话,另开一个窗口测试新配置。确认能连上再退出。
4.3 日志审计:出了事,得有据可查
日志审计,说白了就是“留痕”。系统被入侵了,你怎么知道攻击者干了什么?靠日志。
Linux的日志系统主要靠 rsyslog 或 syslog-ng。我建议你关注这几个日志文件:
/var/log/secure:认证日志,谁登录了、谁认证失败了,都在这里。/var/log/messages:系统通用日志,各种服务的信息。/var/log/audit/audit.log:auditd审计日志,记录系统调用和文件访问。/var/log/cron:计划任务执行日志。
光有日志还不够,你得让它“有用”。我建议做三件事:
- 日志轮转:用
logrotate配置,别让日志撑爆磁盘。保留90天,压缩归档。 - 集中收集:把日志发到中央日志服务器(如ELK、Graylog)。单机日志容易被攻击者清理。
- 关键事件告警:比如SSH登录失败超过5次,立刻告警。用
auditd监控敏感文件变更。
核心配置:启用 auditd 并监控 /etc/passwd、/etc/shadow、/etc/ssh/sshd_config 等关键文件。一旦被修改,立刻记录并告警。
auditd 规则示例:
# 监控 /etc/passwd 文件写操作
-w /etc/passwd -p wa -k passwd_changes
# 监控 /etc/shadow 文件写操作
-w /etc/shadow -p wa -k shadow_changes
# 监控 SSH 配置修改
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes
4.4 内核参数加固:系统底层的硬功夫
内核参数加固,听起来高大上,其实就几个关键点。说白了,就是通过 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的文件,调整内核行为,增强安全性。
我重点推荐这几个参数:
| 参数 | 推荐值 | 作用 |
|---|---|---|
| net.ipv4.ip_forward | 0 | 禁止IP转发,防止被用作跳板 |
| net.ipv4.conf.all.rp_filter | 1 | 启用反向路径过滤,防IP欺骗 |
| net.ipv4.tcp_syncookies | 1 | 启用SYN Cookie,防SYN Flood攻击 |
| net.ipv4.conf.all.accept_source_route | 0 | 禁用源路由,防路由欺骗 |
| kernel.exec-shield | 1 | 启用执行保护,防缓冲区溢出 |
| kernel.randomize_va_space | 2 | 启用ASLR,地址空间随机化 |
一个小技巧:修改 sysctl.conf 后,用 sysctl -p 立即生效,不用重启。但建议先在测试环境验证,有些参数(比如网络相关的)改错了可能导致服务异常。
完整的配置片段:
# /etc/sysctl.d/99-security.conf
# 网络层防护
net.ipv4.ip_forward = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 内存保护
kernel.exec-shield = 1
kernel.randomize_va_space = 2
# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
嗯,到这里,Linux基线的四个核心模块就讲完了。你可能会问,这些配置手动做一遍太麻烦了。没错,所以下一节我们会讲如何用自动化脚本批量搞定这些事。但今天,先把这些概念吃透。
记住一句话:基线不是一次性的工作,而是持续的过程。系统在变,业务在变,基线也要跟着迭代。