服务器安全加固不是装个防火墙就完事
Linux服务器安全加固是一项系统性工程,从网络入口到内核参数,每一层都有独立的攻击面和对应的防御策略。本文按照攻击链从外到内的顺序,逐层拆解SSH防护、权限管控、文件完整性、内核加固的实战配置方案。所有操作均在CentOS 8/Ubuntu 22.04 LTS环境验证通过。
SSH访问安全:暴力破解防护与密钥认证
SSH是服务器最暴露的攻击面。一条公网SSH端口每天可能承受上千次暴力破解尝试。
第一步:密钥认证+禁用密码登录
# 生成ED25519密钥对(比RSA更安全更短)
ssh-keygen -t ed25519 -C "admin@yunthe-server-01" -f ~/.ssh/id_server01
# 将公钥部署到服务器
ssh-copy-id -i ~/.ssh/id_server01.pub root@your-server-ip
# 修改sshd配置
cat >> /etc/ssh/sshd_config << 'EOF'
# 禁用密码认证
PasswordAuthentication no
PubkeyAuthentication yes
# 禁用root密码登录但允许密钥登录
PermitRootLogin prohibit-password
# 限制登录尝试次数
MaxAuthTries 3
# 设置登录超时
LoginGraceTime 30
# 仅允许特定用户组SSH登录
AllowGroups ssh-users
EOF
systemctl restart sshd
第二步:Fail2Ban自动封禁
# Ubuntu安装
apt install fail2ban -y
# 自定义配置
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
action = iptables-multiport[name=sshd, port="2222", protocol=tcp]
EOF
systemctl enable fail2ban && systemctl start fail2ban
# 查看封禁状态
fail2ban-client status sshd
第三步:更换默认端口+端口敲门
# 更改SSH端口
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
# 配置端口敲门(knockd)
apt install knockd -y
cat > /etc/knockd.conf << 'EOF'
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 15
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 15
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
tcpflags = syn
EOF
端口敲门的效果:SSH端口在防火墙层面默认拒绝所有连接,只有按照正确顺序”敲击”预设端口序列后,才会临时开放SSH访问。
权限最小化:用户与sudo管控
生产服务器不应该让所有人都用root操作。权限管控的核心原则是最小权限:
# 创建受限运维用户
useradd -m -s /bin/bash ops-admin
# 配置sudoers白名单
cat > /etc/sudoers.d/ops-admin << 'EOF'
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart php-fpm
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/journalctl -u nginx
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/tail /var/log/nginx/*
# 禁止root shell和编辑sudoers
ops-admin ALL=(ALL) !/bin/su, !/usr/bin/visudo
EOF
chmod 440 /etc/sudoers.d/ops-admin
# SSH用户组管控
groupadd ssh-users
usermod -aG ssh-users ops-admin
文件完整性监控:AIDE部署
入侵检测的重要一环是监控关键系统文件是否被篡改:
# 安装AIDE
apt install aide -y
# 初始化数据库
aideinit
# 将初始数据库移到正式位置
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 执行检查
aide --check
# 日常Cron检查脚本
cat > /etc/cron.daily/aide-check << 'EOF'
#!/bin/bash
REPORT=/var/log/aide/aide-$(date +%Y%m%d).log
mkdir -p /var/log/aide
aide --check > "$REPORT" 2>&1
# 有变更时发邮件告警
if ! grep -q "No differences" "$REPORT"; then
mail -s "AIDE Alert: File integrity violation on $(hostname)" \
security@yourcompany.com < "$REPORT"
fi
EOF
chmod +x /etc/cron.daily/aide-check
内核级安全参数调优
sysctl参数是Linux安全加固中容易被忽视但效果显著的层面:
cat > /etc/sysctl.d/99-security.conf << 'EOF'
# 禁用IP转发(非路由器场景)
net.ipv4.ip_forward = 0
# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 启用SYN Cookie防SYN Flood
net.ipv4.tcp_syncookies = 1
# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# 禁用IP源路由
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 限制内核指针泄露
kernel.kptr_restrict = 2
# 限制dmesg输出
kernel.dmesg_restrict = 1
# 限制unprivileged BPF
kernel.unprivileged_bpf_disabled = 1
# ASLR强度调到最高
kernel.randomize_va_space = 2
# 限制core dump
fs.suid_dumpable = 0
EOF
sysctl --system
防火墙配置:iptables/nftables白名单策略
安全策略的核心原则是”默认拒绝,显式允许”:
# nftables配置(Ubuntu 22.04+)
cat > /etc/nftables.conf << 'EOF'
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# 允许已建立的连接
ct state established,related accept
ct state invalid drop
# 允许loopback
iif lo accept
# ICMP限速
icmp type echo-request limit rate 5/second accept
# 仅允许特定IP段访问SSH
tcp dport 2222 ip saddr {10.0.0.0/8, 172.16.0.0/12} accept
# HTTP/HTTPS开放
tcp dport {80, 443} accept
# 记录被拒绝的连接
log prefix "nft-drop: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
EOF
systemctl enable nftables && systemctl restart nftables
安全加固自检清单
完成以上配置后,用以下命令快速自检:
#!/bin/bash
echo "=== SSH配置检查 ==="
grep -E "^(PasswordAuthentication|PermitRootLogin|Port)" /etc/ssh/sshd_config
echo "=== 开放端口检查 ==="
ss -tlnp | grep -v "127.0.0"
echo "=== 运行中的特权服务 ==="
ps aux | awk '$11 ~ /^S/ && $1 == "root"'
echo "=== SUID文件检查 ==="
find / -perm -4000 -type f 2>/dev/null | grep -v -E "(sudo|passwd|ping|su|mount)"
echo "=== 内核安全参数检查 ==="
sysctl net.ipv4.tcp_syncookies kernel.kptr_restrict kernel.dmesg_restrict
echo "=== 防火墙状态 ==="
nft list ruleset | head -20
安全加固没有终点,而是一个持续迭代的过程。定期审计配置、更新补丁、监控异常行为,才能让服务器在公网环境中保持安全。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-an-quan-jia-gu-shi-zhan-cong-ssh-fang-hu-dao/