📝 摘要:
在网络安全威胁日益严峻的今天,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"
fi5.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
- it2021
- it2021.com
- Nessus
- nginx
- 信息安全
- 安全监控
- 安全运维
- 密码管理
- 应急响应
- 日志监控
- 漏洞扫描
- 网络安全






雅加达 雅加达 1F
密钥登录搞过一次,结果自己把自己锁外面了😭
湖北 咸宁 2F
改端口真有用?我上次改完还是被扫爆了
香港 香港 3F
AllowUsers 那块写错了没?@192.168.1.* 这样能生效?
河北 石家庄 4F
之前公司就栽在弱密码上,现在看到SSH就PTSD
浙江 杭州 5F
fail2ban 装了但老误封,有人调过阈值吗?
首尔特别 江南 B1
@ 墨痕轻浅 fail2ban的maxretry和findtime可以调一下,具体看日志。
浙江 杭州 6F
这配置看着挺全,但小厂哪有精力搞这么细啊
上海 上海 7F
sudo日志记录那个参数是不是漏了引号?🤔
山东 淄博 8F
刚搭完服务器,照着这条 checklist 挨个过一遍
香港 香港 B1
@ Gutspook 照着过一遍心里踏实多了,省得后面出问题。
9F
又是凌晨三点修安全问题的一天,运维命苦
首尔特别 江南 10F
AIDE跑一次CPU直接干到90%,生产环境慎用
广东 广州 11F
密钥登录确实得先测好,不然真进不去😂
北京 北京 12F
半夜告警响起来的时候真想砸电脑。
北京 北京 13F
防火墙配完还得测一下,有时候规则不生效。
湖北 武汉 14F
应急响应那块儿断电是不是太粗暴了?业务咋办?
京畿道 15F
小厂确实难,但基础加固不做,出事更麻烦。
重庆 重庆 16F
AIDE对性能要求是高,可以只监控关键目录。
北京 北京 17F
日志监控脚本那个邮箱报警能换成钉钉吗?
北京 北京 18F
这些命令直接贴出来,小白敢不敢用啊?
浙江 金华 19F
照着做了一遍,防火墙规则死活不生效,啥情况?
佛统 20F
这个脚本直接拷过去能跑吗?感觉还得改改。
甲府 21F
密钥登录真香,再也不用记密码了👍
玉野 22F
弱密码那个数据吓人,赶紧把密码改了。
湖北 武汉 23F
fail2ban我们也在用,误封确实头疼。
熊本 24F
入侵检测那块儿没看懂,有更简单的方案没?
上海 上海 25F
半夜告警太真实了,简直噩梦。
海南 海口 26F
SSH改端口这招管用,扫端口的少多了。
台湾 台北 B1
@ 啼血魂 改完确实清净不少
北京 北京 27F
密钥登录搞定了,就是配完有点慌
河北 邢台 B1
@ 小鹿音 配完都慌,过半小时才敢删旧密钥
滋贺 28F
sudo日志监控很有用,之前靠它揪出个内鬼
西澳大利亚州 珀斯 B1
@ 话痨小野兽 抓内鬼太刺激了,直接抓现行
辽宁 葫芦岛 29F
最小权限原则真重要,动不动就出问题。
新南威尔士州 悉尼 30F
fail2ban配置完安心多了
沃州 洛桑 B1
@ 古藤老树 配置好后挺省心的,继续加油