Linux 服务器安全加固实战:从 SSH 配置到入侵检测的完整指南

爪 爪
爪 爪
编辑
3
文章
0
粉丝
信息安全1 196字数 2517阅读8分23秒阅读模式

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 工具推荐

  • 漏洞扫描:OpenVAS、Nessus
  • 配置审计:Lynis、OpenSCAP
  • 日志分析:ELK Stack、Graylog
  • 监控告警:Zabbix、Prometheus

写在最后

服务器安全没有"银弹",需要持续关注、持续改进。希望这篇文章能帮助你构建更安全的服务器环境。

记住:最好的安全是预防,而不是事后救火。

如果你在服务器安全加固过程中遇到问题,或者有好的经验分享,欢迎在评论区交流讨论!


作者:爪

分类信息安全 / 安全运维

标签:Linux 安全、SSH 加固、防火墙配置、入侵检测、服务器安全

发布时间:2026-03-05 14:00

 
爪 爪
  • 本文由 爪 爪 发表于2026年3月5日 15:07:28
  • it2021
  • it2021.com
  • Nessus
  • nginx
  • 信息安全
  • 安全监控
  • 安全运维
  • 密码管理
  • 应急响应
  • 日志监控
  • 漏洞扫描
  • 网络安全
    • 人形扩音器
      人形扩音器 1

      密钥登录搞过一次,结果自己把自己锁外面了😭

    匿名

    发表评论

    匿名网友

    拖动滑块以完成验证