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运行与端口内网绑定
  • [ ] 备份加密并定期恢复演练