写在前面:一台裸奔的Linux服务器
一台默认安装的Linux服务器,暴露的攻击面远超想象:多余的RPM包、开放的网络服务、宽松的SSH配置、未启用的审计系统。
安全加固不是一次性操作,而是一套从安装到运行的全生命周期清单。本文按CIS Benchmark框架梳理加固要点,每一步都给出可直接执行的配置。
阅读指南
•适合谁:Linux运维、DevOps、安全工程师
•阅读时间:18分钟
•实操占比:80%命令可直接复制执行
•难度:中高级
一、系统最小化:只装需要的
核心思路:只装需要的,不装可能需要的。
包管理裁剪
# RHEL/CentOS:审计已安装的包
rpm -qa --queryformat '%{SIZE} %{NAME}\n' | sort -rn | head -30
# 移除已知不需要的危险包
dnf remove -y ypbind rsh-server ypserv telnet-server talk-server
# Debian/Ubuntu:查看手动安装的包
apt-mark showmanual
# 移除不需要的服务包
apt purge -y rsh-client rsh-redone-server telnetd tftpd xinetd
服务裁剪
# 列出所有已启用的服务
systemctl list-unit-files --type=service --state=enabled
# 关闭非必要服务(常见可关闭项)
systemctl disable --now avahi-daemon cups bluetooth nfs-server 2>/dev/null
二、SSH加固:服务器的第一道门
SSH是Linux服务器最主要的远程入口,也是攻击者首要目标。
生产环境推荐配置
# /etc/ssh/sshd_config
Port 22022 # 修改默认端口
Protocol 2
# 认证
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁用密码认证
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
# 会话管理
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowTcpForwarding no
# 访问控制
AllowGroups sshusers # 仅允许指定组
LogLevel VERBOSE # 记录详细日志
创建SSH用户组
# 创建专用SSH用户组
groupadd sshusers
usermod -aG sshusers ops_user
# 配置密钥认证
mkdir -p /home/ops_user/.ssh
chmod 700 /home/ops_user/.ssh
echo "ssh-ed25519 AAAAC3Nza... user@workstation" > /home/ops_user/.ssh/authorized_keys
chmod 600 /home/ops_user/.ssh/authorized_keys
# 重启前务必验证配置语法
sshd -t && systemctl restart sshd
重要:修改SSH配置后,不要关闭当前终端,另开一个终端验证能正常登录后再退出旧会话。
Fail2ban暴力破解防护
# 安装
dnf install -y fail2ban # RHEL
apt install -y fail2ban # Debian/Ubuntu
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22022
filter = sshd
maxretry = 3
bantime = 3600
systemctl enable --now fail2ban
fail2ban-client status sshd # 查看封禁状态
三、强制访问控制:SELinux与AppArmor
SELinux(RHEL/CentOS/Fedora)
生产环境应保持Enforcing模式,而非简单关闭。
# 查看当前模式
getenforce
# 临时切换
setenforce 0 # Permissive(仅记录,不拦截)
setenforce 1 # Enforcing(实际拦截)
# 永久设置
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
排查方式:服务因SELinux无法正常工作时,分析审计日志而非关闭SELinux。
# 查看最近的AVC拒绝日志
ausearch -m AVC -ts recent
# 生成并应用自定义策略模块
ausearch -m AVC -ts today | audit2allow -M mycustompol
semodule -i mycustompol.pp
AppArmor(Ubuntu/Debian)
# 查看状态
apparmor_status
# 切换profile模式
aa-complain /etc/apparmor.d/usr.sbin.mysqld # 仅记录
aa-enforce /etc/apparmor.d/usr.sbin.mysqld # 实际拦截
四、auditd审计系统
auditd记录系统调用和关键文件访问,是合规审计的核心工具。
安装与配置
dnf install -y audit # RHEL
apt install -y auditd # Debian/Ubuntu
systemctl enable --now auditd
核心审计规则
# /etc/audit/rules.d/audit.rules
# 1. 监控登录相关文件篡改
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
# 2. 监控SSH配置变更
-w /etc/ssh/sshd_config -p wa -k ssh_config
# 3. 监控系统时间修改
-a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change
# 4. 监控内核模块加载
-w /sbin/insmod -p x -k modules
-w /sbin/rmmod -p x -k modules
# 重新加载规则
augenrules --load
auditctl -l
# 日志分析
ausearch -ts recent # 最近10分钟
ausearch -k identity # 按key查询
aureport --summary # 生成可读报告
五、防火墙规则
firewalld(RHEL/CentOS)
# 查看当前区域和规则
firewall-cmd --get-default-zone
firewall-cmd --list-all
# 放行业务端口(永久生效)
firewall-cmd --permanent --add-port=22022/tcp # SSH
firewall-cmd --permanent --add-port=443/tcp # HTTPS
# 限制SSH来源IP(仅允许运维网段)
firewall-cmd --permanent --new-zone=ssh-restricted
firewall-cmd --permanent --zone=ssh-restricted --add-source=10.0.1.0/24
firewall-cmd --permanent --zone=ssh-restricted --add-port=22022/tcp
# 重新加载
firewall-cmd --reload
nftables(现代Linux推荐)
nftables是iptables的继任者,配置语法更统一:
# /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iif "lo" accept
ct state established,related accept
icmp type echo-request limit rate 5/second accept
tcp dport 22022 ct state new limit rate 5/minute accept
tcp dport { 80, 443 } accept
limit rate 10/minute log prefix "nft-drop: " drop
}
}
nft -f /etc/nftables.conf
systemctl enable nftables
六、安全基线检查脚本
以下脚本整合上述检查项,可作为定期巡检工具:
#!/bin/bash
# security_baseline_check.sh
# 执行只读检查,不修改任何系统配置
PASS=0; FAIL=0; WARN=0
REPORT="/tmp/security_baseline_$(date +%Y%m%d_%H%M%S).txt"
check() {
local desc="$1"; local result="$2"; local detail="${3:-}"
if [ "$result" = "PASS" ]; then
echo "[PASS] $desc" | tee -a "$REPORT"; PASS=$((PASS + 1))
elif [ "$result" = "FAIL" ]; then
echo "[FAIL] $desc - $detail" | tee -a "$REPORT"; FAIL=$((FAIL + 1))
else
echo "[WARN] $desc - $detail" | tee -a "$REPORT"; WARN=$((WARN + 1))
fi
}
# 检查SSH加固
SSHD_CONFIG="/etc/ssh/sshd_config"
grep -q "^PermitRootLogin.*no" "$SSHD_CONFIG" && check "SSH禁止root登录" "PASS" || check "SSH禁止root登录" "FAIL" "未配置"
grep -q "^PasswordAuthentication.*no" "$SSHD_CONFIG" && check "SSH禁用密码认证" "PASS" || check "SSH禁用密码认证" "FAIL" "未配置"
# 检查防火墙
systemctl is-active --quiet firewalld 2>/dev/null || systemctl is-active --quiet nftables 2>/dev/null || systemctl is-active --quiet ufw 2>/dev/null
if [ $? -eq 0 ]; then
check "防火墙运行状态" "PASS"
else
check "防火墙运行状态" "FAIL" "未检测到运行中的防火墙"
fi
# 检查SELinux/AppArmor
if command -v getenforce >/dev/null 2>&1; then
[ "$(getenforce)" = "Enforcing" ] && check "SELinux模式" "PASS" || check "SELinux模式" "WARN" "建议Enforcing"
fi
# 检查auditd
systemctl is-active --quiet auditd 2>/dev/null && check "auditd运行中" "PASS" || check "auditd运行状态" "WARN" "未运行"
# 检查危险服务
DANGER_SERVICES="telnet rsh rlogin tftp xinetd ypbind"
for svc in $DANGER_SERVICES; do
systemctl is-enabled "$svc" 2>/dev/null | grep -q enabled && check "危险服务$svc" "FAIL" "已启用"
done
echo "===============================" | tee -a "$REPORT"
echo "汇总: PASS=$PASS FAIL=$FAIL WARN=$WARN" | tee -a "$REPORT"
echo "详细报告: $REPORT"
[ "$FAIL" -gt 0 ] && exit 1 || exit 0
部署定时检查:
chmod +x security_baseline_check.sh
sudo ./security_baseline_check.sh
# 配置定时检查(每周一早上8点)
# crontab -e
0 8 * * 1 /opt/scripts/security_baseline_check.sh >> /var/log/security_baseline.log 2>&1
七、加固清单速查表
| 类别 |
关键措施 |
优先级 |
| 系统最小化 |
最小安装、裁剪服务、移除危险包 |
高 |
| SSH加固 |
密钥认证、改端口、禁root、Fail2ban |
高 |
| 强制访问控制 |
SELinux Enforcing / AppArmor |
高 |
| 审计系统 |
auditd配置规则、定期分析 |
中 |
| 防火墙 |
默认拒绝、最小端口放行 |
高 |
| 密码策略 |
最小长度12、复杂度、定期检查 |
中 |
| 内核加固 |
SYN Cookies、禁IP转发 |
中 |
| 定期巡检 |
基线脚本定时运行、漏洞修复 |
中 |
思考题
1.你的生产环境SELinux是Enforcing还是Disabled? 如果禁用了,考虑过重新启用吗?
2.你的SSH配置中MaxAuthTries设了多少? 默认值6在暴力破解面前够用吗?
3.文中基线检查脚本你能跑通几项? FAIL项有多少?打算怎么修?
本文是公众号速查版,原文含完整CIS Benchmark框架对照、详细auditd规则解析、nftables高级配置及安全合规检查方案。点击文章底部左侧「阅读原文」查看完整版,网站所有文章均中英双语,方便技术团队对照学习。
喜欢这篇文章? 点击「在看」让更多人看到,或转发给你的运维小伙伴。安全无小事,加固从清单开始。