95·安全加固高级

系统安全加固清单

hardeningsecurity

第 95 课 - 系统安全加固清单

1. 学习目标

通过本课的学习,你将能够:

  • 理解系统安全加固的核心原则与重要性。
  • 掌握一个系统化的Linux系统安全加固清单及其关键检查点。
  • 运用常用的命令和配置,对系统进行安全基线检查与加固操作。
  • 识别系统配置中的常见安全隐患,并采取相应措施进行修复。
  • 规划持续的系统安全审计与维护流程。

2. 核心概念

想象一下,你刚刚搬进一栋新房子。安全加固就像给房子系统性地安装防盗门、防盗窗、监控摄像头和保险柜,而不是只关注其中某一个点。系统加固的目的是减少攻击面遵循最小权限原则,并通过纵深防御策略,让攻击者即使突破一点,也难以长驱直入。

核心清单通常涵盖以下方面:

  • 账户与认证:密码策略、特权账户管理。
  • 服务与守护进程:关闭不必要的服务。
  • 文件系统权限:关键文件和目录的访问控制。
  • 网络安全:防火墙、网络参数调优。
  • 日志与审计:确保关键操作有据可查。
  • 软件管理:及时更新与移除不必要的软件。

3. 代码示例

以下是一个基础的加固操作脚本和一些关键检查命令。请在测试环境中谨慎运行,生产环境操作前务必做好备份。

示例1:基础加固检查与配置脚本

#!/bin/bash
# security_hardening_checklist.sh
# 注意:这是一个演示脚本,实际操作前请务必理解每一条命令的含义。
# 使用方式: sudo bash security_hardening_checklist.sh

echo "=== Linux 系统安全加固清单检查 ==="
echo ""

# 1. 账户与认证加固
echo "1. 检查密码策略 (PAM配置)..."
# 设置密码最大有效期为90天
if ! grep -q "PASS_MAX_DAYS" /etc/login.defs; then
    echo "PASS_MAX_DAYS 90" >> /etc/login.defs
    echo "  - 已设置密码最大有效期 (PASS_MAX_DAYS) 为 90 天。"
else
    echo "  - 密码最大有效期已配置。"
fi

# 2. 禁用不必要的服务 (示例:关闭 cups 打印服务)
echo ""
echo "2. 检查并禁用非必要服务..."
if systemctl is-active cups >/dev/null 2>&1; then
    systemctl stop cups
    systemctl disable cups
    echo "  - 已停止并禁用 CUPS 打印服务。"
else
    echo "  - CUPS 服务未运行或已被禁用。"
fi

# 3. 文件系统权限加固
echo ""
echo "3. 加固关键文件权限..."
# 确保 /etc/passwd, /etc/shadow 权限正确
chmod 644 /etc/passwd
chmod 000 /etc/shadow
echo "  - 已设置 /etc/passwd (644) 和 /etc/shadow (000) 权限。"

# 4. 网络安全加固 - 启用并配置防火墙 (以ufw为例)
echo ""
echo "4. 检查防火墙状态..."
if command -v ufw &> /dev/null; then
    ufw enable
    ufw default deny incoming
    ufw default allow outgoing
    echo "  - 已启用UFW防火墙,设置默认拒绝入站,允许出站。"
else
    echo "  - UFW未安装,请手动配置防火墙规则。"
fi

# 5. SSH 服务加固 (如果安装)
echo ""
echo "5. 加固SSH服务配置..."
SSHD_CONFIG="/etc/ssh/sshd_config"
if [ -f "$SSHD_CONFIG" ]; then
    # 禁止root直接登录
    sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' "$SSHD_CONFIG"
    # 禁用密码认证,仅允许密钥登录(慎用,确保你已有密钥)
    # sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' "$SSHD_CONFIG"
    systemctl restart sshd
    echo "  - 已禁止SSH Root登录,并重启了sshd服务。"
    echo "  - 密码认证配置已准备就绪,取消注释并确认密钥可用后生效。"
fi

echo ""
echo "=== 基础加固检查完成。部分操作(如SSH配置)可能需要进一步调整。==="
echo "=== 请根据您的应用需求进行细化配置。 ==="

示例2:常用的安全状态检查命令

# 检查已开放的端口
ss -tulnp

# 查看系统正在运行的服务
systemctl list-units --type=service --state=running

# 查找SUID/SGID文件(潜在提权风险点)
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -lg {} \; 2>/dev/null

# 查看最近登录失败的记录
lastb | head -10

# 查看sudo日志
grep "sudo" /var/log/auth.log | tail -20

4. 实践练习

练习1:安全基线检查

  • 使用 ss -tulnp 命令检查你系统的网络连接。
  • 记录下所有监听端口,并判断哪些是业务必需的。尝试用防火墙关闭一个非必需的端口。

练习2:账户安全加固

  • 检查系统中是否存在空密码的用户:sudo awk -F: '($2 == "") {print $1}' /etc/shadow
  • 为系统设置更严格的密码策略(如修改 /etc/pam.d/common-password 中的 minlen 参数)。

练习3:编写加固脚本

  • 编写一个简单的Bash脚本,实现以下功能:
    1. 检查并设置 /tmp 目录的权限为 1777(sticky bit)。
    2. 记录所有修改了关键配置文件(如 /etc/passwd)的用户操作(提示:可使用 auditd 规则或 inotifywait)。

5. 常见错误

  • 错误1:只做单点加固,缺乏系统性。 例如,只加固了SSH,却忽略了Web应用目录权限或数据库配置。

    • 修正:遵循安全清单,进行覆盖账户、网络、服务、文件、日志等多个层面的系统化加固。
  • 错误2:过度加固导致服务不可用。 例如,在生产环境直接禁用密码认证且未配置好密钥,将自己锁在服务器之外。

    • 修正在测试环境验证所有配置;采用“先记录,后执行”的模式;每次只修改一项配置并测试。
  • 错误3:加固后未进行验证。 修改了配置(如 sshd_config),但未使用 sshd -t 命令检查语法错误,或未重启服务。

    • 修正:修改任何配置后,务必检查语法重启相应服务,并从另一终端测试连接,确保配置生效且服务正常。
  • 错误4:忽视日志监控。 完成了配置加固,但没有开启或审查相关日志,导致无法及时发现异常行为。

    • 修正:加固必须与日志审计相结合。配置 auditd 监控关键文件,并定期检查 /var/log/auth.log/var/log/syslog 等。

6. 小结

系统安全加固不是一劳永逸的“设置”,而是一个持续的过程。关键要点回顾如下:

  1. 安全加固是系统性的:应涵盖身份认证、网络、服务、文件、日志等多个层面。
  2. 遵循最小权限原则:用户、进程、服务只应拥有完成其任务所必需的最小权限。
  3. 加固前必须备份与测试:任何对生产环境的修改,都应在测试环境验证,并做好配置和数据备份。
  4. 加固需与监控审计结合:安全加固降低了风险,但持续的日志监控和定期审计是发现并应对新威胁的关键。
  5. 保持更新:及时应用安全补丁是加固清单中至关重要的一环。

请牢记,安全加固的目标是在可用性安全性之间找到最佳平衡点,为你的系统和应用构建一个稳固的防线。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「实战:搭建 Nginx/Apache Web 服务器」 以巩固所学知识。