Linux服务器安全加固指南:从SSH防护到内核参数调优

服务器安全加固的必要性

在当前的网络环境中,服务器每天都会面临成千上万次的扫描和攻击尝试。根据多家安全机构的统计,一台暴露在公网上的Linux服务器,平均在上线后6分钟内就会遭到首次自动化扫描。默认安装的Linux系统存在大量可被利用的配置缺陷,如果不做安全加固,被入侵只是时间问题。本文将从SSH防护、防火墙配置、文件权限、内核参数等多个维度,提供一套完整可操作的加固方案。

SSH安全配置

SSH是服务器管理的主要入口,也是攻击者最常尝试的突破口。以下配置建议写入/etc/ssh/sshd_config

# 禁止root直接登录
PermitRootLogin no

# 仅允许密钥认证,禁用密码登录
PasswordAuthentication no
PubkeyAuthentication yes

# 限制登录用户
AllowUsers deploy admin

# 修改默认端口(减少自动化扫描命中)
Port 2222

# 空密码禁止登录
PermitEmptyPasswords no

# 限制认证尝试次数
MaxAuthTries 3

# 登录超时30秒
LoginGraceTime 30

# 禁用X11转发
X11Forwarding no

# 禁用端口转发
AllowTcpForwarding no
AllowAgentForwarding no

修改完成后重启SSH服务:systemctl restart sshd。务必在修改前确保密钥登录已配置好,否则可能把自己锁在门外。

使用Fail2Ban防范暴力破解

Fail2Ban通过监控日志文件,自动封禁频繁失败登录的IP,是SSH暴力破解的有效防线:

# 安装
apt install fail2ban -y    # Debian/Ubuntu
yum install fail2ban -y    # CentOS

# 创建本地配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600

[sshd-aggressive]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 3600
bantime = 86400

这里配置了两层策略:10分钟内3次失败封禁1小时,1小时内5次失败封禁24小时。启动服务:systemctl enable --now fail2ban

防火墙配置:UFW与iptables

对于Ubuntu系统,UFW是最友好的防火墙前端:

# 默认拒绝所有入站
ufw default deny incoming
ufw default allow outgoing

# 仅开放必要端口
ufw allow 2222/tcp comment SSH
ufw allow 80/tcp comment HTTP
ufw allow 443/tcp comment HTTPS

# 限制SSH端口连接速率
ufw limit 2222/tcp

# 启用
ufw enable
ufw status verbose

对于需要更精细控制的场景,可以直接使用iptables/nftables:

# 限制单IP并发连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit \
    --connlimit-above 50 -j DROP

# SYN Flood防护
iptables -I INPUT -p tcp --syn -m limit \
    --limit 1/s --limit-burst 3 -j ACCEPT

# 保存规则
iptables-save > /etc/iptables/rules.v4

文件权限与关键目录加固

不正确的文件权限是提权攻击的常见利用点:

# /tmp设置为noexec防止从tmp执行恶意程序
mount -o remount,noexec,nosuid,nodev /tmp

# 关键系统文件设为不可变
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow

# 检查SUID/SGID文件(常见提权路径)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# 移除不必要的SUID权限
chmod u-s /usr/bin/passwd  # 根据实际需要谨慎操作

# SSH目录权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

内核参数安全调优

通过sysctl调整内核参数,可以增强网络栈的安全性和稳定性。在/etc/sysctl.d/99-security.conf中添加:

# 禁用IP源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# 启用SYN Cookies防范SYN Flood
net.ipv4.tcp_syncookies = 1

# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# 禁用IP转发(非路由器场景)
net.ipv4.ip_forward = 0

# 增加文件描述符上限
fs.file-max = 65535

# 限制核心转储
fs.suid_dumpable = 0

# 内核地址空间布局随机化
kernel.randomize_va_space = 2

# 禁用内核指针暴露
kernel.kptr_restrict = 2

# 限制dmesg输出
kernel.dmesg_restrict = 1

应用配置:sysctl -p /etc/sysctl.d/99-security.conf

自动安全更新与审计

启用无人值守安全更新,确保关键漏洞补丁及时安装:

# Debian/Ubuntu
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades

# CentOS/RHEL
yum install yum-cron -y
systemctl enable --now yum-cron

定期安全审计同样重要,推荐使用Lynis进行自动化安全检查:

# 安装Lynis
apt install lynis -y

# 运行完整审计
lynis audit system

# 查看审计报告
cat /var/log/lynis-report.dat

Lynis会从100多个维度检查系统安全状况,并给出具体的加固建议和评分。

入侵检测与日志监控

配置AIDE(Advanced Intrusion Detection Environment)进行文件完整性监控:

apt install aide -y

# 初始化数据库
aideinit

# 将数据库移到活动位置
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 定期检查(加入cron)
0 3 * * * /usr/bin/aide --check | mail -s "AIDE Report" admin@example.com

同时建议将关键日志转发到远程日志服务器或SIEM平台,避免攻击者删除本地日志掩盖痕迹。可配置rsyslog远程转发:

# /etc/rsyslog.d/50-remote.conf
*.* @@log-server.example.com:514

总结

服务器安全加固不是一次性的工作,而是需要持续维护的过程。核心原则是:最小权限、最小暴露面、纵深防御。从SSH加固到内核参数调优,每一层都是防线的一部分。建议将所有加固步骤编写为Ansible Playbook或Shell脚本,实现可重复、可审计的自动化部署,避免遗漏。定期用Lynis审计、及时安装安全补丁、监控异常登录行为,才能让服务器在恶劣的网络环境中保持安全。