1.9.7 安全加固实战清单与检查项
在实际运维中,安全加固应形成可执行的检查清单与复核机制,确保配置一致、可追溯、可验证。本节给出可落地的清单、命令、验证与排错步骤,并附练习与检查表。
1. 账户与权限#
检查项
- 禁用或锁定无用系统账户(games/ftp等)
- root 禁止远程登录
- 密码策略:长度、复杂度、过期、历史复用
- 仅开放必要 sudo 命令白名单
命令与示例
# 1) 锁定无用账户
sudo usermod -L games
sudo usermod -L ftp
# 2) 检查空密码账户
sudo awk -F: '($2==""){print $1}' /etc/shadow
# 3) 配置密码策略(RHEL/CentOS)
sudo grep -n "pam_pwquality" /etc/pam.d/system-auth
sudo sed -i 's/pam_pwquality.so.*/pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1/' \
/etc/pam.d/system-auth
# 4) sudo白名单(示例:只允许重启nginx)
sudo visudo
# 在文件中添加:
# %ops ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
验证与排错
# 验证账户是否锁定
sudo passwd -S games
# 验证sudo权限
sudo -l
练习
- 创建 ops 用户,仅允许其重启 nginx,验证其无法执行其他 systemctl 操作。
2. SSH与远程访问#
检查项
- 禁用密码登录,使用密钥认证
- 禁止 root 远程登录
- 限制登录尝试次数与连接数
- 配置空闲超时
配置示例
sudo tee /etc/ssh/sshd_config <<'EOF'
Port 22
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
MaxSessions 5
ClientAliveInterval 300
ClientAliveCountMax 2
EOF
sudo systemctl reload sshd
密钥部署
# 客户端生成密钥
ssh-keygen -t ed25519 -C "ops@company"
# 推送公钥
ssh-copy-id ops@server-ip
# 测试登录
ssh ops@server-ip
排错
# 连接失败查日志
sudo tail -f /var/log/secure
# 常见:权限过宽
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
练习
- 禁用密码登录后,验证仍可用密钥登录。
3. 系统服务与端口#
检查项
- 禁用无用服务与自启动
- 仅开放业务端口
- 服务使用非root用户运行
命令与示例
# 查看开机自启服务
systemctl list-unit-files --state=enabled
# 禁用不必要服务
sudo systemctl disable --now avahi-daemon
# 检查监听端口
sudo ss -lntup
# nginx使用非root用户(示例)
ps -ef | grep nginx
排错
- 端口被占用:sudo lsof -i:80 定位进程。
练习
- 禁用一个无用服务并验证其不再监听端口。
4. 防火墙与网络策略#
检查项
- 默认拒绝,仅开放必要端口
- 管理端口白名单
- 记录拒绝日志
firewalld 示例
sudo systemctl enable --now firewalld
# 默认拒绝
sudo firewall-cmd --set-default-zone=drop
# 允许ssh来自管理网段
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" service name="ssh" accept'
# 放行业务端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
# 查看规则
sudo firewall-cmd --list-all
排错
- 连接被拒:sudo firewall-cmd --list-all 检查端口是否放行。
练习
- 只允许 10.0.0.0/24 访问 22 端口,其他网段不可达。
5. 文件系统与权限#
检查项
- 关键目录权限收敛
- 禁止普通用户访问敏感配置
- 审计SUID/SGID异常
- 挂载 noexec/nodev/nosuid
命令与示例
# 关键目录权限
sudo chmod 700 /root
sudo chmod 600 /etc/shadow
# 查找SUID/SGID文件
sudo find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -print
# /tmp 加固挂载(示例)
echo "tmpfs /tmp tmpfs defaults,noexec,nodev,nosuid 0 0" | sudo tee -a /etc/fstab
sudo mount -o remount /tmp
排错
- 应用无法在 /tmp 执行:检查 noexec 是否导致,必要时调整。
练习
- 审计并记录系统中SUID文件清单。
6. 日志与审计#
检查项
- 开启系统安全日志
- 关键文件变更审计
- 日志轮转与集中采集
auditd 示例
sudo yum -y install audit
sudo systemctl enable --now auditd
# 审计 /etc/passwd 变更
echo "-w /etc/passwd -p wa -k passwd_change" | sudo tee -a /etc/audit/rules.d/audit.rules
sudo augenrules --load
验证
# 触发变更后查看日志
sudo ausearch -k passwd_change
练习
- 添加 /etc/ssh/sshd_config 审计规则并验证。
7. 系统更新与漏洞管理#
检查项
- 可信源配置
- 定期更新安全补丁
- 高危漏洞紧急修复
命令与示例
# 查看可更新包
sudo yum check-update
# 只更新安全补丁(需要yum-plugin-security)
sudo yum -y install yum-plugin-security
sudo yum -y update --security
排错
- 更新依赖冲突:sudo yum deplist <pkg> 分析依赖链。
练习
- 输出系统当前内核版本与可用更新版本列表。
8. 基础防护工具#
检查项
- 防爆破工具启用
- SELinux/AppArmor可控启用
fail2ban 示例
sudo yum -y install epel-release
sudo yum -y install fail2ban
sudo systemctl enable --now fail2ban
# 配置ssh防护
sudo tee /etc/fail2ban/jail.d/sshd.local <<'EOF'
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 3600
findtime = 600
EOF
sudo systemctl restart fail2ban
验证
sudo fail2ban-client status sshd
练习
- 人为制造3次失败登录,观察是否被封禁。
9. 中间件运行环境检查#
检查项
- 服务禁止root运行
- 管理端口绑定内网
- 默认账户与密码修改
- 配置文件权限最小化
示例(MySQL)
# 进程用户
ps -ef | grep mysqld
# 绑定内网
grep -n "bind-address" /etc/my.cnf
# 权限收敛
sudo chmod 600 /etc/my.cnf
示例(Nginx)
# 确认worker运行用户
grep -n "user" /etc/nginx/nginx.conf
# 检查监听端口
ss -lntup | grep nginx
排错
- 端口暴露公网:检查防火墙与中间件监听地址配置。
练习
- 将某中间件管理端口从 0.0.0.0 改为 127.0.0.1 并验证。
10. 备份与恢复安全#
检查项
- 备份加密
- 传输使用安全通道
- 定期验证恢复
示例
# 备份并加密
tar czf /backup/etc-$(date +%F).tar.gz /etc
gpg -c /backup/etc-$(date +%F).tar.gz
# 通过SSH传输
scp /backup/etc-*.gpg backup@10.0.0.10:/data/backup/
# 恢复验证
gpg -d /backup/etc-*.gpg | tar xz -C /tmp/restore_test
练习
- 模拟恢复 /etc/hosts 并核对一致性。
11. 资产与合规性检查#
检查项
- 资产清单与版本记录
- 账号、端口、服务台账
- 变更记录可追溯
示例脚本(资产巡检)
#!/bin/bash
echo "HOST: $(hostname)"
echo "OS: $(cat /etc/redhat-release 2>/dev/null || cat /etc/os-release | head -n1)"
echo "KERNEL: $(uname -r)"
echo "IP: $(hostname -I)"
echo "OPEN_PORTS:"
ss -lntup
练习
- 将脚本输出保存至 /var/log/asset_$(date +%F).log 并建立周报。
快速核查清单(可打印)#
- [ ] root 禁止远程登录,启用密钥认证
- [ ] 无用账户已锁定
- [ ] 防火墙默认拒绝,仅开放必需端口
- [ ] 关键目录权限收敛
- [ ] auditd/日志轮转开启
- [ ] 补丁更新策略执行
- [ ] 中间件非root运行与端口内网绑定
- [ ] 备份加密并定期恢复演练