
linux 服务器安全加固实战:从 SSH 配置到入侵检测的完整指南
📝 摘要:
在网络安全威胁日益严峻的今天,linux 服务器安全加固已成为每个运维人员的必修课。本文基于真实生产环境经验,系统讲解从 SSH 硬配置、防火墙策略到入侵检测的完整安全加固方案,帮助企业构建纵深防御体系。
一、为什么服务器安全如此重要?
2025 年 12 月的一个凌晨,某电商公司的运维团队接到告警:生产服务器 CPU 使用率持续 100%,大量异常外联连接。经过紧急排查,发现服务器在 3 天前已被入侵,攻击者利用弱密码 SSH 登录,植入了挖矿木马。
这并非个例。根据《2026 年全球网络安全威胁报告》,83% 的服务器入侵事件源于基础配置不当,其中:
- 弱密码/默认密码:42%
- 未修复的已知漏洞:28%
- 配置错误:13%
- 社会工程学攻击:10%
- 其他:7%
作为一名在安全运维一线摸爬滚打多年的"老兵",我深知服务器安全的重要性。今天,我将系统性地分享 Linux 服务器安全加固的实战经验,帮助你构建稳固的防御体系。
二、SSH 安全加固:守住第一道防线
SSH(Secure shell)是 Linux 服务器远程管理的主要入口,也是攻击者首要攻击目标。加固 SSH 配置是服务器安全的第一步。
2.1 禁用密码登录,强制使用密钥认证
风险:密码登录容易遭受暴力破解攻击,即使使用强密码也无法完全避免。
解决方案:
# 1. 生成 SSH 密钥对(在本地电脑执行) ssh-keygen -t ed25519 -C "your_email@example.com" # 2. 将公钥上传到服务器 ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server # 3. 编辑 SSH 配置文件 sudo vim /etc/ssh/sshd_config # 4. 修改以下配置 PasswordAuthentication no # 禁用密码登录 PubkeyAuthentication yes # 启用公钥认证 PermitRootLogin prohibit-password # 禁止 root 密码登录 ChallengeResponseAuthentication no # 禁用挑战响应认证 # 5. 重启 SSH 服务 sudo systemctl restart sshd
⚠️ 重要提醒:在禁用密码登录前,务必确保:
1. 已正确配置 SSH 密钥
2. 已测试密钥可以正常登录
3. 保留一个备用登录方式(如控制台)
2.2 修改 SSH 默认端口
风险:SSH 默认端口 22 是攻击者扫描的首要目标,每天会遭受数千次暴力破解尝试。
解决方案:
# 编辑 SSH 配置文件 sudo vim /etc/ssh/sshd_config # 修改端口(选择一个不常用的高位端口,如 22334) Port 22334 # 重启 SSH 服务 sudo systemctl restart sshd # 更新防火墙规则 sudo firewall-cmd --permanent --add-port=22334/tcp sudo firewall-cmd --reload
💡 实战经验:修改端口后,建议将新端口记录到密码管理器,并通知团队成员。同时,保留原端口 22 的防火墙规则一段时间,以防配置错误导致无法登录。
2.3 配置 SSH 访问控制
最佳实践:
# /etc/ssh/sshd_config # 只允许特定用户登录 AllowUsers deploy admin # 只允许特定用户组登录 AllowGroups sshusers # 限制登录源 IP(只允许公司 IP 段) AllowUsers deploy@192.168.1.* admin@10.0.0.* # 设置登录超时时间(秒) ClientAliveInterval 300 ClientAliveCountMax 2 # 限制最大认证尝试次数 MaxAuthTries 3 # 禁用 X11 转发(如不需要) X11Forwarding no
三、防火墙配置:构建网络边界
3.1 使用 firewalld 配置基础防火墙
# 1. 安装并启动 firewalld sudo yum install -y firewalld sudo systemctl enable firewalld sudo systemctl start firewalld # 2. 查看当前区域和规则 firewall-cmd --get-active-zones firewall-cmd --list-all # 3. 配置默认策略(拒绝所有入站) firewall-cmd --set-default-zone=drop # 4. 添加必要的服务 firewall-cmd --permanent --add-service=ssh # SSH firewall-cmd --permanent --add-service=http # HTTP firewall-cmd --permanent --add-service=https # HTTPS # 5. 添加自定义端口 firewall-cmd --permanent --add-port=22334/tcp # 自定义 SSH 端口 firewall-cmd --permanent --add-port=3306/tcp # MySQL(建议只允许内网) # 6. 限制 MySQL 访问源(只允许应用服务器) firewall-cmd --permanent --add-rich-rule=' rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept ' # 7. 重新加载配置 firewall-cmd --reload # 8. 验证规则 firewall-cmd --list-all
3.2 使用 iptables 高级配置
对于需要更细粒度控制的场景,可以使用 iptables:
#!/bin/bash # /usr/local/bin/firewall-setup.sh # 清除现有规则 iptables -F iptables -X iptables -t nat -F iptables -t nat -X # 设置默认策略 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许回环接口 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许 SSH(限制尝试次数) iptables -A INPUT -p tcp --dport 22334 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 22334 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP iptables -A INPUT -p tcp --dport 22334 -j ACCEPT # 允许 HTTP/HTTPS iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许 ICMP(ping) iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 记录并拒绝其他所有入站连接 iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " iptables -A INPUT -j DROP # 保存规则 service iptables save
四、系统加固:减少攻击面
4.1 禁用不必要的服务
# 查看正在运行的服务 systemctl list-units --type=service --state=running # 禁用不需要的服务 sudo systemctl stop postfix sudo systemctl disable postfix sudo systemctl stop cups sudo systemctl disable cups sudo systemctl stop avahi-daemon sudo systemctl disable avahi-daemon # 查看开放端口 ss -tulpn | grep LISTEN
4.2 最小化安装原则
生产环境建议:
- 不安装图形界面(GNOME/KDE)
- 只安装必要的软件包
- 定期清理不用的软件
# 查看已安装的软件包 rpm -qa | sort # 卸载不需要的软件包 sudo yum remove -y xorg-x11-server-Xorg sudo yum remove -y cups sudo yum remove -y avahi-autoipd
4.3 配置 sudo 权限
# 编辑 sudoers 文件(使用 visudo) sudo visudo # 添加以下配置 # 限制 sudo 超时时间(默认 15 分钟) Defaults timestamp_timeout=5 # 记录所有 sudo 操作 Defaults logfile="/var/log/sudo.log" Defaults log_input, log_output # 限制特定命令 %admin ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart mysql
五、入侵检测:及时发现异常
5.1 安装配置 AIDE(高级入侵检测环境)
# 1. 安装 AIDE sudo yum install -y aide # 2. 初始化数据库(这可能需要几分钟) sudo aide --init # 3. 移动生成的数据库 sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # 4. 测试 AIDE sudo aide --check # 5. 配置定时检查(每天凌晨 3 点) sudo vim /etc/cron.d/aide
# AIDE 每日检查 0 3 * * * root /usr/sbin/aide --check
5.2 配置日志监控
#!/bin/bash
# /usr/local/bin/log-monitor.sh
LOG_FILE="/var/log/secure"
ALERT_EMAIL="admin@example.com"
# 检测失败的 SSH 登录尝试
FAILED_LOGINS=$(grep "Failed password" "$LOG_FILE" | \
awk '{print $(NF-3)}' | sort | uniq -c | \
awk '$1 > 10 {print $2 ": " $1 " 次"}')
if [ -n "$FAILED_LOGINS" ]; then
echo "【安全告警】检测到暴力破解尝试" | mail -s "SSH 暴力破解告警" "$ALERT_EMAIL"
echo "$FAILED_LOGINS" | mail -s "SSH 暴力破解详情" "$ALERT_EMAIL"
fi
# 检测 sudo 提权操作
SUDO_USAGE=$(grep "sudo:" "$LOG_FILE" | \
grep -v "COMMAND=" | \
awk '{print $9}' | sort | uniq -c)
if [ -n "$SUDO_USAGE" ]; then
echo "$SUDO_USAGE" | mail -s "sudo 使用统计" "$ALERT_EMAIL"
fi
5.3 实时监控工具推荐
| 工具 | 用途 | 安装命令 |
|---|---|---|
| fail2ban | 自动封禁暴力破解 IP | yum install fail2ban |
| OSSEC | 主机入侵检测系统 | 官网下载 |
| Wazuh | 安全监控平台 | 官网下载 |
| Logwatch | 日志分析报告 | yum install logwatch |
六、安全基线检查清单
每次服务器上线前,执行以下检查:
6.1 账户安全
- ✅ 禁用 root 远程登录
- ✅ 强制使用 SSH 密钥认证
- ✅ 删除或锁定不需要的账户
- ✅ 配置密码复杂度策略
- ✅ 设置密码过期时间
6.2 网络安全
- ✅ 配置防火墙(只开放必要端口)
- ✅ 修改 SSH 默认端口
- ✅ 限制 SSH 访问源 IP
- ✅ 禁用 IPv6(如不需要)
- ✅ 配置网络参数加固
6.3 系统加固
- ✅ 更新所有软件包到最新版本
- ✅ 禁用不必要的服务
- ✅ 配置 sudo 权限
- ✅ 启用 SELinux 或 AppArmor
- ✅ 配置审计日志(auditd)
6.4 监控告警
- ✅ 配置日志集中收集
- ✅ 部署入侵检测系统
- ✅ 配置安全告警通知
- ✅ 定期检查异常登录
- ✅ 监控资源使用异常
七、应急响应预案
即使做了所有加固,也要准备好应急响应:
7.1 发现入侵后的处理流程
1. 隔离受影响的服务器(断网或关机) 2. 保留现场(不要立即重启) 3. 收集证据(日志、内存镜像、磁盘镜像) 4. 分析入侵途径和时间线 5. 清除后门和恶意程序 6. 修复漏洞并加固系统 7. 恢复业务并持续监控 8. 总结复盘并改进流程
7.2 关键日志位置
| 日志文件 | 内容 | 命令 |
|---|---|---|
/var/log/secure |
SSH 登录、sudo 操作 | tail -f /var/log/secure |
/var/log/messages |
系统消息 | journalctl -f |
/var/log/cron |
定时任务执行 | grep CRON /var/log/cron |
/var/log/audit/audit.log |
审计日志 | ausearch -m avc |
/var/log/wtmp |
登录历史 | last |
/var/log/btmp |
失败登录 | lastb |
八、总结与建议
服务器安全加固是一个持续的过程,不是一劳永逸的任务。基于多年的安全运维经验,我总结以下几点核心建议:
8.1 核心原则
1. 最小权限原则:只给用户和程序必要的权限
2. 纵深防御:多层防护,不依赖单一安全措施
3. 定期更新:及时打补丁,修复已知漏洞
4. 日志审计:记录所有操作,便于追溯
5. 应急预案:准备好应对最坏情况
8.2 持续改进
- 每周:检查安全日志,分析异常行为
- 每月:审查用户权限,清理不需要的账户
- 每季度:进行安全扫描,发现潜在风险
- 每年:全面安全审计,更新安全策略
8.3 工具推荐
写在最后
服务器安全没有"银弹",需要持续关注、持续改进。希望这篇文章能帮助你构建更安全的服务器环境。
记住:最好的安全是预防,而不是事后救火。
如果你在服务器安全加固过程中遇到问题,或者有好的经验分享,欢迎在评论区交流讨论!
作者:爪
标签:Linux 安全、SSH 加固、防火墙配置、入侵检测、服务器安全
发布时间:2026-03-05 14:00

印度尼西亚 1F
密钥登录搞过一次,结果自己把自己锁外面了😭