Skip to content

🏗️ 系统安全加固 ​

防火墙和 SSH 加固保护了网络入口,认证安全管好了登录门槛。现在该从操作系统内核层面做一次彻底的"大扫除"——缩小内核攻击面,封堵各种可能被利用的系统通道。

sysctl 安全参数调优 ​

Linux 内核有大量可通过 sysctl 调优的安全参数,集中在网络栈和内存管理。

网络层防御 ​

编辑 /etc/sysctl.d/99-security.conf:

config
# === IP 欺骗防护 ===
# 忽略所有 ICMP 重定向(防止路由劫持)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# 不发送 ICMP 重定向(非路由器无需发送)
net.ipv4.conf.all.send_redirects = 0

# 拒绝源路由包(攻击者可能指定数据包路径)
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# === SYN Flood 防护 ===
# 启用 SYN Cookie(SYN 队列满时用 cookie 方式验证)
net.ipv4.tcp_syncookies = 1

# SYN 队列长度
net.ipv4.tcp_max_syn_backlog = 2048

# SYN+ACK 重试次数(减少半开连接积压)
net.ipv4.tcp_synack_retries = 2

# === 常规安全参数 ===
# 启用 IP 转发安全审查(rp_filter)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 忽略所有 ICMP Echo 请求(防止 ping 探测)
net.ipv4.icmp_echo_ignore_all = 1

# 不在响应中包含广播时间戳
net.ipv4.tcp_timestamps = 0

# 禁用 IPV6(如果不需要)
# net.ipv6.conf.all.disable_ipv6 = 1

# === 日志记录可疑包 ===
# 记录 Martian 包(源地址不合理的包)
net.ipv4.conf.all.log_martians = 1

应用配置:

bash
sudo sysctl -p /etc/sysctl.d/99-security.conf
# 查看当前所有内核参数
sudo sysctl -a | grep net.ipv4

禁用不必要的服务 ​

bash
# 列出所有开机自启的服务
systemctl list-unit-files --state=enabled

# 列出正在监听的端口
ss -tlnp

# 关闭不需要的服务(示例)
sudo systemctl disable --now cups          # 打印服务
sudo systemctl disable --now avahi-daemon   # 零配置网络
sudo systemctl disable --now bluetooth      # 蓝牙
sudo systemctl disable --now rpcbind        # NFS RPC(不需要 NFS 时)

原则

一台 Web 服务器只需要:sshd、nginx、监控 agent、日志服务。其他都是攻击面。

限制 cron/at 使用 ​

防止恶意用户或已入侵的进程通过计划任务维持持久化:

bash
# 只允许这些用户使用 crontab
echo "root" > /etc/cron.allow
echo "www-data" >> /etc/cron.allow

# 黑名单为空(allow 优先于 deny)
> /etc/cron.deny

# at 指令同样限制
echo "root" > /etc/at.allow
> /etc/at.deny

# 设置正确权限
chmod 600 /etc/cron.allow /etc/at.allow

查看所有用户计划任务:

bash
# 查看所有用户 crontab
for user in $(cut -d: -f1 /etc/passwd); do
    echo "=== $user ==="
    sudo crontab -u $user -l 2>/dev/null
done

# 系统级定时任务
ls -la /etc/cron.* /var/spool/cron/

文件完整性检查:AIDE ​

AIDE(Advanced Intrusion Detection Environment)对关键系统文件建立哈希数据库,发现文件被篡改时告警。

bash
# 安装
sudo apt install aide

# 初始化数据库(构建基准快照)
sudo aideinit
# 初始化完成后数据库在 /var/lib/aide/aide.db.new
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 日常检查:对比当前状态与基准数据库
sudo aide -c /etc/aide/aide.conf --check

# 如果出现了合法变更(比如系统更新),更新基准
sudo aideinit
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

常用 AIDE 配置(/etc/aide/aide.conf 中追加):

config
# 监控 /etc 目录下的关键文件
/etc     p+i+n+u+g+s+m+c+sha512

# 监控 SUID/SGID 文件
/bin     p+i+n+u+g+s+m+c+sha512
/sbin    p+i+n+u+g+s+m+c+sha512
/usr/bin p+i+n+u+g+s+m+c+sha512
/usr/sbin p+i+n+u+g+s+m+c+sha512

提示

把 AIDE 检查加入 cron 每周跑一次,异常结果发邮件告警。

内核安全模块浅介 ​

AppArmor(Ubuntu 默认) ​

AppArmor 为每个程序设定"能力边界"——一个 Web 应用就算被攻破,也无法访问它配置文件之外的目录。

bash
# 查看 AppArmor 状态
sudo aa-status

# 配置文件在 /etc/apparmor.d/
ls /etc/apparmor.d/

# 为程序生成配置模板
sudo aa-genprof /path/to/program

# 把某个 profile 设为 enforce(强制执行)或 complain(仅记录)
sudo aa-enforce /etc/apparmor.d/usr.bin.nginx
sudo aa-complain /etc/apparmor.d/usr.bin.nginx

SELinux(CentOS/RHEL 默认) ​

SELinux 粒度更细,基于标签的强制访问控制(MAC),但学习曲线陡峭。

bash
# 查看状态
getenforce
# 查看 SELinux 审计日志
sudo ausearch -m avc -ts recent

选谁?

AppArmor 配置简单,学习成本低,适合个人和小团队。SELinux 粒度更细,适合有专职安全人员的环境。

安全更新自动化 ​

bash
# 安装无人值守更新
sudo apt install unattended-upgrades

# 启用自动安全更新
sudo dpkg-reconfigure --priority=low unattended-upgrades

配置文件 /etc/apt/apt.conf.d/50unattended-upgrades:

config
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
    "${distro_id}ESM:${distro_codename}-infra-security";
};

# 自动删除不再需要的旧内核
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";

# 更新后自动重启(如果需要的话)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

实战:新机器加固清单 ​

拿到一台全新的 Ubuntu 20.04+ 服务器时,按这个顺序执行:

bash
#!/bin/bash
# init-harden.sh — Ubuntu 服务器初始化加固脚本

echo "=== 1. 系统更新 ==="
apt update && apt upgrade -y
apt install -y unattended-upgrades fail2ban ufw aide
dpkg-reconfigure --priority=low unattended-upgrades

echo "=== 2. sysctl 内核加固 ==="
cat > /etc/sysctl.d/99-security.conf <<'EOF'
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.conf.all.rp_filter = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.conf.all.log_martians = 1
EOF
sysctl -p /etc/sysctl.d/99-security.conf

echo "=== 3. 安装基础防火墙 ==="
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable

echo "=== 4. 配置 fail2ban ==="
# 为 SSH 创建 fail2ban jail 配置(而不是启用所有 jail)
cat > /etc/fail2ban/jail.local <<'F2B'
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5

[sshd]
enabled  = true
port     = ssh
logpath  = %(sshd_log)s
F2B
systemctl enable fail2ban --now

echo "=== 5. 限制 cron/at ==="
echo "root" > /etc/cron.allow
echo "root" > /etc/at.allow

echo "=== 6. 禁用无用服务 ==="
systemctl disable --now cups 2>/dev/null || true
systemctl disable --now avahi-daemon 2>/dev/null || true
systemctl disable --now bluetooth 2>/dev/null || true

echo "=== 7. 初始化 AIDE 基准 ==="
aideinit -y -f 2>/dev/null && mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

echo "=== ✅ 基础加固完成 ==="
echo "接下来请手动完成:密钥登录、sshd_config 安全配置、Google Authenticator(可选)"

🧪 练习题 ​

  1. 写一套 sysctl 配置,关闭所有 IPV6 功能
  2. 用 AIDE 监控 /etc/passwd、/etc/shadow、/etc/sudoers,尝试修改其中一个后运行 aide --check
  3. 检查你的服务器有哪些非必要服务在运行,尝试关闭它们

系统层面加固好了,上去一层看看 Web 应用的防御——Web 应用安全。


🎯 本章要点 ​

  • net.ipv4.tcp_syncookies=1 防御 SYN Flood,防止半开连接耗尽资源
  • 修改 sysctl 配置后执行 sysctl -p 立即生效,无需重启
  • SELinux/AppArmor 是强制访问控制(MAC),即使 root 权限也被限制

有问题或补充?欢迎留言