Linux 服务器安全加固实战指南:从 SSH 防线到入侵检测,10 步锁定你的生产服务器
作者:蔚蓝信科 | 2026年6月12日 | Linux安全加固 · 服务器安全 · SSH加固 · Fail2Ban · UFW防火墙
一、你的服务器,可能正在「裸奔」
上个月处理了一起安全事件:一台跑了三年业务的 CentOS 服务器被植入挖矿木马,CPU 飙到 100%,关键业务全部瘫痪。排查发现五个致命问题——root 密码是 123456、SSH 端口 22 裸奔公网、防火墙根本没开、/etc/passwd 里多了三个不明账户、日志被人为清空。
这不是个例。2026 年云安全报告显示,超过 67% 的服务器入侵源于基础配置缺陷而非高级零日漏洞。换句话说——不是黑客太强,是我们太懒。
本文基于生产环境实战经验,从 SSH 防线到内核加固,用 10 个步骤带你建立一套可落地的 Linux 加固体系。所有命令已在 CentOS 7+ / Rocky 8+ / Ubuntu 20.04+ 验证通过,直接复制就能用。
二、第一步:锁死 SSH 入口(最高优先级)
SSH 是攻击者最爱的突破口,暴力破解、撞库、字典攻击 24 小时不间断。加固 SSH 是安全第一课。
1. 禁用密码登录,只用密钥认证
密码会被猜、会被撞、会被键盘记录器抓。密钥认证是底线。
# 管理员本机生成 ED25519 密钥对(安全性高于 RSA) ssh-keygen -t ed25519 -C "admin-prod-key" # 公钥上传到服务器 ssh-copy-id -i ~/.ssh/id_ed25519.pub root@your-server-ip
然后修改 SSH 配置文件 /etc/ssh/sshd_config:
# 核心三件套:禁止密码、禁止root、限制尝试次数 PasswordAuthentication no PubkeyAuthentication yes PermitRootLogin no MaxAuthTries 3 ClientAliveInterval 300
# 重启生效 systemctl restart sshd # CentOS/Rocky systemctl restart ssh # Ubuntu/Debian
⚠️重要:先确认密钥能登录,再禁用密码!建议另开一个终端保持原连接,改错了还能救。
2. 限制 SSH 访问来源 IP
# UFW:只允许办公网络网段的 IP 连 SSH ufw allow from 10.0.0.0/8 to any port 22 ufw allow from 203.0.113.5/32 to any port 22 comment '堡垒机IP' # 或者用 /etc/hosts.allow + hosts.deny 做双层防护 echo "sshd: 10.0.0.0/8 203.0.113.5" >> /etc/hosts.allow echo "sshd: ALL" >> /etc/hosts.deny
3. 双重认证(2FA)——给 SSH 再加一把锁
# Debian/Ubuntu 安装 Google Authenticator PAM 模块 apt install libpam-google-authenticator -y # 普通用户执行,生成 2FA 密钥 google-authenticator # 修改 PAM 配置 echo "auth required pam_google_authenticator.so" >> /etc/pam.d/sshd # SSH 配置要求 公钥 + 2FA 双重认证 echo "AuthenticationMethods publickey,keyboard-interactive" >> /etc/ssh/sshd_config systemctl restart sshd
此时登录要先通过密钥,再输动态验证码——就算私钥泄露,攻击者也进不来。
三、第二步:账户权限最小化
核心原则
1. 清理冗余账户和空口令
# 查找 UID=0 的异常账户(正常只有 root) awk -F: '$3==0{print $1}' /etc/passwd # 查找空口令账户 awk -F: '($2==""||$2=="!"){print $1}' /etc/shadow # 删除可疑账户 userdel -r suspicious_user
2. sudo 权限收紧
不要随便给人 ALL=(ALL) ALL:
# visudo 创建 /etc/sudoers.d/web-admin web-admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
⚠️绝对不要用 vim 直接改 /etc/sudoers——语法错误会导致所有 sudo 失效。一定用 visudo,它会自动校验语法。
3. 强制强密码策略
# 密码有效期策略 sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN 10/' /etc/login.defs # Ubuntu/Debian 密码复杂度 apt install libpam-pwquality -y cat >> /etc/security/pwquality.conf << EOF minlen = 14 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1 EOF
4. 空闲超时自动登出
echo "export TMOUT=1800" >> /etc/profile # 30分钟无操作自动退出 echo "readonly TMOUT" >> /etc/profile # 防止用户 unset 绕过 source /etc/profile
四、第三步:防火墙 = 大门口的保安
# 安装并启用 apt install ufw -y ufw default deny incoming # 默认拒绝所有入站 ufw default allow outgoing # 默认允许所有出站 # 只开放必要端口 ufw allow 22/tcp comment 'SSH' ufw allow 80,443/tcp comment 'Web Service' # 限制 SSH 来源 IP ufw allow from 10.0.0.0/8 to any port 22 # 启用防火墙 ufw enable ufw status verbose
实战建议:上线前先用 ufw allow from YOUR_IP 锁定 SSH,防止配置过程中被踢下线。
五、第四步:Fail2Ban + CrowdSec = 自动反击
防火墙挡端口,Fail2Ban 挡暴力破解。
# 安装 Fail2Ban apt install fail2ban -y # 创建自定义配置(不要直接改 jail.conf,升级会覆盖) cat > /etc/fail2ban/jail.local << EOF [DEFAULT] bantime = 3600 findtime = 600 maxretry = 3 [sshd] enabled = true port = 22 logpath = /var/log/auth.log maxretry = 3 bantime = 7200 EOF systemctl enable fail2ban --now
进阶方案:CrowdSec。它不仅分析本地日志,还能同步全球威胁情报——有人攻击了全球其他服务器,你的服务器也会自动拦截他的 IP。
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | bash apt install crowdsec crowdsec-firewall-bouncer-iptables -y
六、第五步:安全审计——你被入侵了,你知道吗?
Lynis:一键安全体检
apt install lynis -y lynis audit system
Lynis 会扫描 300+ 安全项,从 SSH 配置到内核参数,直接告诉你哪些需要修复,还附修复方法。
日志监控不能缺
# 确保日志服务运行 systemctl status rsyslog auditd # Logwatch 每日自动给你发邮件报告 apt install logwatch -y logwatch --output mail --service all --range today
日志轮转必须配置,否则磁盘被写满服务异常:
cat /etc/logrotate.conf | grep -E "rotate|weekly|compress"
七、第六步:Rootkit 和恶意软件扫描
# Rkhunter:Rootkit 专项检测 apt install rkhunter -y rkhunter --update rkhunter --check --skip-keypress # ClamAV:病毒扫描 apt install clamav clamav-daemon -y freshclam clamscan -r /home -i --remove
八、第七步:内核参数加固
cat >> /etc/sysctl.conf << EOF # SYN 攻击防护 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 # 禁止 IP 源路由(防 IP 欺骗) net.ipv4.conf.all.accept_source_route = 0 # 禁止 ICMP 重定向 net.ipv4.conf.all.accept_redirects = 0 # 禁止普通用户查看其他用户进程 kernel.yama.ptrace_scope = 2 # 禁止 suid 程序生成 core dump fs.suid_dumpable = 0 EOF sysctl -p
九、一键部署脚本(Ubuntu 22.04 开箱即用)
#!/bin/bash set -e apt update && apt install -y unattended-upgrades ufw fail2ban lynis clamav rkhunter logwatch libpam-pwquality ufw default deny incoming && ufw default allow outgoing ufw allow 22/tcp && ufw allow 80,443/tcp && ufw --force enable echo 'APT::Periodic::Unattended-Upgrade "1";' >> /etc/apt/apt.conf.d/20auto-upgrades sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs grep -q TMOUT /etc/profile || echo 'export TMOUT=1800' >> /etc/profile echo "=== 基础加固完成,请手动配置 SSH 密钥认证 ==="
十、最常见的三个排坑点
坑一:改了 SSH 配置没验证,重启后连不上。解法:用 sshd -t 测试语法,另开终端保持连接,确认无误再重启。
坑二:Fail2Ban 配了但是没生效。解法:fail2ban-client status sshd 查看状态,检查 logpath 路径是否正确。
坑三:Lynis 扫描出一堆警告,不知道怎么修。解法:每个 WARNING 后有 ID(如 [ACCT-9622]),直接搜索这个 ID 即可找到官方修复文档。
总结
安全加固不是一次性工程,而是一个持续过程。把这套流程落地成制度:新服务器上线前跑一遍、每月一次 Lynis 安全体检、自动更新保持开启。如果你们管理的服务器较多,还可以借助 Ansible 批量推送加固、通过 OPSMASTER 这类统一的运维管理平台集中查看所有服务器的安全状态和告警,避免因遗漏单点导致整体防线溃堤。
记住三件事:SSH 是入口要锁死、防火墙是底线要守住、审计是眼睛绝不能瞎。现在就动手检查你的生产服务器,说不定已经有陌生 IP 在试探你的 22 号端口了。
本文由 蔚蓝信科 运维团队原创整理,如需转载请联系授权。