Linux 服务器安全基线:七项检查与对应命令
不做一次性脚本,而是按 SSH、账户、防火墙、补丁、审计、暴露面、日志七项逐条核对,附可直接执行的检查命令。
安全基线不是装一个脚本就完事。下面七项按“能被远程利用的程度”排序,每项都给出检查命令;建议先在测试机跑一遍,再动生产。
| 检查项 | 重点 | 常用命令 |
|---|---|---|
| SSH | 密钥登录、禁用密码 | sshd -t |
| 账户 | 空密码、sudo 范围 | getent passwd |
| 防火墙 | 只开必要端口 | ss -tulpn |
| 补丁 | 安全更新、重启窗口 | dnf update --security |
| 登录审计 | 失败尝试、封禁 | lastb |
| 审计 | 敏感文件变更 | auditctl -l |
| 日志与时间 | 容量、chrony | timedatectl |
一、SSH:先保住自己的登录方式
改 SSH 配置最怕把自己关在门外。顺序应该是:先确认密钥登录可用,再开新会话验证,最后才关闭密码登录。配置写在 /etc/ssh/sshd_config.d/ 下的独立文件里,避免覆盖发行版默认值:
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 20
改完先 sshd -t 校验语法,再 systemctl reload sshd。reload 不会断开现有会话,这是你的安全绳。确认新开的密钥会话能登录后,再关闭旧会话。
二、账户与 sudo
日常用普通账户加 sudo,不要所有操作都用 root。检查空密码账户和可登录 shell:
awk -F: '($2 == "") { print $1 }' /etc/shadow
getent passwd | awk -F: '($7 !~ /(nologin|false)$/) { print $1 }'
sudo -l -U deploy
离职账户、测试账户、默认服务账户都要清理或锁定。sudo 规则用 visudo 编辑,保存时会做语法检查;不要直接改 /etc/sudoers,一次手误就可能让所有人失去提权能力。
三、防火墙与安全组
云主机有两层:云平台安全组和系统防火墙。只开业务需要的端口,SSH 尽量限制来源 IP。改防火墙之前,先确认当前 SSH 来源已被放行,再重载规则;云安全组同理,先放行新规则再保存,避免把自己锁在外面。检查本机监听:
ss -tulpn
firewall-cmd --list-all
nft list ruleset
看到 0.0.0.0:2375 这类 Docker API 端口要立刻处理:它等于把 root 权限暴露在公网上。数据库、Redis 只监听 127.0.0.1 或内网地址,不要图省事开公网。
四、补丁与内核
Alibaba Cloud Linux 3 使用 dnf,安全更新可以每天自动安装,但内核更新需要安排重启窗口:
dnf check-update --security
dnf update --security
dnf install -y dnf-automatic
systemctl enable --now dnf-automatic.timer
自动更新只装安全补丁,不要开全量自动升级,避免业务组件被意外升级。重启前确认服务有开机自启,并尽量安排在低峰期。
五、暴力尝试与登录审计
公网 SSH 每天都会收到大量尝试,这是常态。除了禁用密码登录,可以用 fail2ban 对多次失败的来源做短期封禁;封禁时间不要设太长,避免误伤自己。查看失败记录:
lastb | head -20
journalctl -u sshd --since "24 hours ago" | grep -i "failed"
如果某个 IP 持续尝试,直接在安全组层面封掉更彻底。不要把 fail2ban 当成唯一防线,密钥认证才是根本。
六、审计与关键文件权限
auditd 可以记录对敏感文件的修改。最小规则集先覆盖账户和 sudo:
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
权限方面:/etc/shadow 应为 000 或 640,~/.ssh 为 700,authorized_keys 为 600。权限过宽时 sshd 会直接拒绝密钥登录,这也是常见的“密钥没问题却登不上”的原因。
七、日志、时间与暴露面
最后三项经常被忽略:chrony 保证时间同步,否则日志时间线和证书校验都会出问题;journald 设置容量上限,避免日志把磁盘写满;定期检查新增的监听端口和 systemd 服务,确认没有多余组件被装上来。
timedatectl
journalctl --disk-usage
systemctl list-unit-files --state=enabled
安全基线是持续动作:每次上线新服务,都重新过一遍监听端口和防火墙;每次人员变动,都复查账户和密钥。把它写成清单,比写成一次性脚本更可靠。建议每季度完整复查一次,并在变更记录里写清楚改了哪一项、为什么改、如何回滚。