系统讲解SSH暴力破解的防御手段

描述

问题背景

只要服务器暴露在公网上,SSH 端口扫描和暴力破解几乎是必然发生的。笔者的测试环境服务器,上线第一天就收到了暴力破解告警——日志里充满了来自全球各地的破解尝试,目标账号从 root 到 admin 到 test 到 oracle,无所不包。

暴力破解的原理很简单:攻击者用自动化工具,遍历常见用户名和密码字典,尝试登录 SSH 服务。由于很多运维工程师习惯使用弱密码(如 root/123456、admin/admin),攻击者总有成功的机会。一旦成功,攻击者就会在服务器上植入后门、挖矿程序,或以此为跳板攻击内网其他机器。

这篇文章面向初中级 Linux 运维工程师,系统讲解 SSH 暴力破解的防御手段,从密码策略、公钥认证、fail2ban、端口伪装到入侵检测,逐层加防。每种手段都有具体的配置步骤和验证方法。

第一步:知己知彼——查看攻击日志

在动手加固之前,先看看攻击者的"工作成果"。

1.1 查看 SSH 登录失败记录

 

# CentOS/RHEL:查看 secure 日志
sudo tail -500 /var/log/secure | grep -i "failed password"

# Ubuntu/Debian:查看 auth 日志
sudo tail -500 /var/log/auth.log | grep -i "failed password"

 

1.2 统计攻击者 IP 和尝试次数

 

# 从日志中提取攻击者 IP 并统计次数
# CentOS
sudo grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

# Ubuntu
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

# 如果有公钥认证失败的记录
sudo grep "Publickey" /var/log/auth.log | grep "Failed" | awk '{print $11}' | sort | uniq -c | sort -rn | head -10

 

1.3 统计被攻击的目标账号

 

# 查看哪些账号被尝试登录
# CentOS
sudo grep "Failed password" /var/log/secure | awk '{print $9}' | sort | uniq -c | sort -rn | head -20

# Ubuntu
sudo grep "Failed password" /var/log/auth.log | awk '{print $9}' | sort | uniq -c | sort -rn | head -20

 

1.4 查看是否有成功的登录

 

# 查看成功的 SSH 登录
# CentOS
sudo grep "Accepted" /var/log/secure | awk '{print $9, $11, $13}'
# Ubuntu
sudo grep "Accepted" /var/log/auth.log | awk '{print $9, $11, $13}'

# 查看最近一次成功登录的时间和来源
# CentOS
sudo last | head -20
# Ubuntu
sudo last | head -20

# 查看 root 登录记录
sudo last root | head -10

# 如果发现陌生 IP 的成功登录记录,需要立即排查

 

1.5 查看攻击者常用账号字典

从日志中可以看到,攻击者会尝试的常见用户名包括:

 

root, admin, user, test, guest, oracle, mysql, postgres, ubuntu, centos, debian, www-data, apache, nginx, tomcat, redis, mongodb, postgres, backup, ftp, nagios

 

结论:如果你的服务器上有这些账号且使用弱密码,基本等于门户大开。

第二步:最彻底的防御——禁用密码登录,改用公钥认证

2.1 原理

密码认证的缺陷:

密码可以被猜测、暴力破解

密码可以被键盘记录器、钓鱼网站窃取

弱密码(123456、password、admin)几乎是秒破

公钥认证的优势:

基于非对称加密,无法被暴力破解

私钥文件即使泄露,也通常有 passphrase 保护

除非攻击者拿到了你的私钥文件,否则无法登录

2.2 生成 SSH 密钥对

 

# 在你的本地电脑(不是服务器)上执行
# Windows: 使用 PowerShell 或 Git Bash
# macOS/Linux: 使用 Terminal

ssh-keygen -t ed25519 -C "your_email@example.com"
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/username/.ssh/id_ed25519):
# 直接回车使用默认路径
# Enter passphrase (empty for no passphrase): 输入一个强密码
# Enter same passphrase again: 确认密码

# 如果服务器不支持 ed25519(很老的系统),使用 RSA
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

 

2.3 将公钥上传到服务器

 

# 方法一:使用 ssh-copy-id(最简单)
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@

# 方法二:手动复制
# 先用密码登录一次(最后一次)
cat ~/.ssh/id_ed25519.pub
# 复制输出的内容

# 在服务器的 ~/.ssh/authorized_keys 文件中添加这一行
ssh admin@
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 验证
exit

 

2.4 修改 SSH 配置禁用密码登录

 

# 编辑 SSH 配置文件
sudo vi /etc/ssh/sshd_config

# 确保以下配置存在且未被注释:
# 启用公钥认证
PubkeyAuthentication yes

# 禁用密码认证
PasswordAuthentication no

# 禁用空密码登录
PermitEmptyPasswords no

# 禁用 challenge-response 认证(也会绕开密码)
ChallengeResponseAuthentication no

# 确保 UsePAM 是 yes(Ubuntu 默认)
UsePAM yes

 

2.5 重启 SSH 服务并验证

 

# 重启 SSH 服务
sudo systemctl restart sshd

#  重要:在退出当前 session 前,先测试新登录方式是否正常
# 新开一个终端,不要关闭当前 session,执行:
ssh -i ~/.ssh/id_ed25519 admin@

 

2.6 验证配置是否生效

 

# 在本地测试:用密码登录应该被拒绝
ssh admin@
# 输入密码后应该看到:
# Permission denied (publickey,password).

# 用公钥登录应该成功
ssh -i ~/.ssh/id_ed25519 admin@
# 应该不需要输入密码即可登录

# 在服务器上查看日志(如果有失败尝试,说明配置可能有问题)
sudo tail -20 /var/log/secure | grep sshd

 

第三步:fail2ban 自动封禁攻击者 IP

即使使用了公钥认证,fail2ban 仍然是必要的防护工具,因为:

服务器上可能还有使用密码认证的服务(如 Web 后台、数据库管理界面)

fail2ban 可以防止 DDoS、扫描等行为

减少攻击流量,保护系统资源

3.1 fail2ban 工作原理

fail2ban 通过监控日志文件,发现短时间内多次登录失败的 IP,自动将其加入防火墙规则封禁。封禁时间可配置,到期后自动解封。

3.2 安装 fail2ban

 

# CentOS/RHEL(需要 EPEL 源)
sudo yum install -y epel-release
sudo yum install -y fail2ban

# Ubuntu/Debian
sudo apt-get install -y fail2ban

 

3.3 配置 fail2ban

fail2ban 的配置分为两部分:jail.conf(默认配置)和 jail.local(用户自定义配置,优先级更高)。不要修改 jail.conf,直接在 jail.local 中覆盖。

 

# 创建 jail.local 配置文件
sudo vi /etc/fail2ban/jail.local

# 添加以下内容:
[DEFAULT]
# 封禁 IP 的时间(秒),3600 = 1 小时
bantime = 3600

# 时间窗口(秒),600 = 10 分钟内
findtime = 600

# 最大失败次数,超过这个次数就封禁
maxretry = 5

# 封禁动作(iptables 是默认)
banaction = iptables-multiport

# 忽略自己的 IP(把运维人员的 IP 加进去,防止把自己封了)
ignoreip = 127.0.0.1/8 ::1 192.168.1.100 10.0.0.50

# SSH 防护配置
[sshd]
enabled = true
# SSH 端口
port = ssh
# 日志文件(CentOS)
logpath = /var/log/secure
# 日志文件(Ubuntu)
# logpath = /var/log/auth.log
# 过滤规则(在 filter.d/sshd.conf 中定义)
filter = sshd
# 最大重试次数(覆盖 DEFAULT)
maxretry = 3

# 如果 SSH 使用非标准端口,修改 port
# port = 2222

# Apache/Nginx 防暴力破解(可选)
[apache-auth]
enabled = true
port = http,https
logpath = /var/log/httpd/ssl_error_ssl_log
maxretry = 3

 

3.4 启动并启用 fail2ban

 

# 启动 fail2ban
sudo systemctl start fail2ban

# 设置开机自启动
sudo systemctl enable fail2ban

# 查看状态
sudo systemctl status fail2ban

 

3.5 验证 fail2ban 是否工作

 

# 查看 fail2ban 状态
sudo fail2ban-client status

# 查看 SSH 防护状态
sudo fail2ban-client status sshd

# 输出示例:
# Status for the jail: sshd
# |- Filter
# |  |- Currently failed: 3
# |  |- Total failed: 150
# |  `- File list: /var/log/secure
# `- Actions
#    |- Currently banned: 2
#    |- Total banned: 15
#    `- Banned IP list: 23.45.67.89 203.0.113.5

# 查看被封禁的 IP
sudo iptables -L f2b-sshd -n

# 如果看到 IP 列表,说明 fail2ban 正在工作

 

3.6 手动测试 fail2ban

注意:测试前确认你的 IP 不在 ignoreip 列表中,否则会被放行

 

# 从另一台机器(或手机)故意输错密码 3 次
# 应该被封禁 1 小时

# 查看是否被封禁
sudo iptables -L f2b-sshd -n

# 如果被封禁了,查看封禁状态
sudo fail2ban-client status sshd

# 解封某个 IP(如果误封了自己)
sudo fail2ban-client set sshd unbanip 

# 解封所有 IP(紧急情况)
sudo fail2ban-client unban --all

 

3.7 fail2ban 配置进阶

 

# 配置邮件通知(当 IP 被封禁时发送邮件)
# 在 jail.local 中添加:
[DEFAULT]
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_mwl)s
# action_mwl:封禁 + 发送邮件(包含日志)
# action_: 只封禁,不发邮件

# 配置更严格的 SSH 防护:5 分钟内 2 次失败就封禁
[sshd]
enabled = true
port = ssh
logpath = /var/log/secure
filter = sshd
findtime = 300  # 5 分钟
maxretry = 2    # 2 次失败就封禁
bantime = 7200  # 封禁 2 小时

# 配置 fail2ban 的日志级别(调试用)
# 编辑 /etc/fail2ban/fail2ban.conf
[Definition]
loglevel = DEBUG

# 重启 fail2ban
sudo systemctl restart fail2ban

 

第四步:修改 SSH 默认端口

SSH 默认监听 22 端口,所有的暴力破解扫描器都会首先扫描 22 端口。改成非标准端口可以减少大量的无效扫描。

4.1 修改 SSH 端口

 

# 1. 编辑 SSH 配置
sudo vi /etc/ssh/sshd_config

# 找到 #Port 22,改为非标准端口(如 2222)
Port 2222

# 2. 确保防火墙/安全组已开放新端口
# CentOS (firewalld)
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

# Ubuntu (ufw)
sudo ufw allow 2222/tcp

# 3. 重启 SSH
sudo systemctl restart sshd

# 4. 验证:新端口应该能登录
ssh -p 2222 admin@

# 5. 确认旧端口不再监听
sudo ss -tunapl | grep :22

 

4.2 注意事项

 

# 如果使用了 SELinux,需要额外配置
# CentOS with SELinux enabled
sudo yum install -y policycoreutils-python
sudo semanage port -a -t ssh_port_t -p tcp 2222

# 如果使用了 firewalld,已经在第 2 步开放了端口

# 如果使用了 iptables,直接添加规则
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 注意:云服务器的安全组也需要同步修改新端口

 

第五步:限制 SSH 来源 IP

5.1 使用 iptables 限制来源 IP

 

# 只允许特定 IP 访问 SSH
# 先清除现有的 SSH 规则(如果有)
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT

# 添加只允许特定 IP 的规则
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 2222 -j ACCEPT

# 如果有多个运维 IP
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 2222 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 2222 -j ACCEPT

# 保存规则
sudo iptables-save > /etc/sysconfig/iptables

 

5.2 使用 firewalld 限制来源 IP

 

# 使用 rich rule 限制来源 IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="2222" protocol="tcp" accept'

# 限制 IP 段
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="2222" protocol="tcp" accept'

# 重新加载
sudo firewall-cmd --reload

# 查看规则
sudo firewall-cmd --list-rich-rules

 

5.3 使用 ufw 限制来源 IP

 

# 只允许特定 IP 访问 SSH
sudo ufw allow from 192.168.1.100 to any port 2222

# 允许 IP 段
sudo ufw allow from 192.168.1.0/24 to any port 2222

# 查看规则
sudo ufw status numbered

 

第六步:使用双因素认证(2FA)

公钥认证 + 密码认证 + 2FA,是目前最强的 SSH 登录防护。即使攻击者拿到了你的私钥和密码,没有手机上的验证码也无法登录。

6.1 安装 Google Authenticator PAM 模块

 

# CentOS/RHEL
sudo yum install -y google-authenticator

# Ubuntu/Debian
sudo apt-get install -y libpam-google-authenticator

# macOS(如果你用 mac 作为 SSH 客户端需要验证)
brew install google-authenticator-libpam

 

6.2 为用户配置 2FA

 

# 切换到需要配置 2FA 的用户
su - admin

# 运行配置向导
google-authenticator

# 交互式问答:
# Do you want authentication tokens to be time-based? (y/n)
# → y

# 会显示一个二维码,用 Google Authenticator 或 Authy 扫描
# (也可以手动输入底部的密钥)

# Save the ~/.google_authenticator file? (y/n)
# → y

# By default, a new token is generated every 30 seconds.
# Do you want to disallow multiple uses of the same authentication token?
# This limits you to one login about every 30 seconds, but it is useful
# if you might get your secret phrase stolen.
# → y  (同一个 token 只能用一次,防止中间人重放攻击)

# By default, tokens are good for 30 seconds. To compensate for possible
# time-skew between the client and the server, we allow an extra token
# before and after the current time.
# Do you want to do so? (y/n)
# → y  (允许 1 分钟的时间窗口,防止手机时间不准)

# If the computer that you are logging into is not hardened enough to
# allow for short timeouts, you should add an external rule in
# addition to rate-limiting the max number of login attempts.
# Do you want to enable the short unlock timeout? (y/n)
# → n

# Enable login count limit? (y/n)
# → y  (限制最大尝试次数)

 

6.3 配置 SSH 使用 PAM 认证

 

# 编辑 SSH 配置
sudo vi /etc/ssh/sshd_config

# 添加/修改:
# 启用 challenge-response 认证(用于 PAM)
ChallengeResponseAuthentication yes

# 确保公钥认证仍然开启
PubkeyAuthentication yes

# 重启 SSH
sudo systemctl restart sshd

 

6.4 编辑 PAM 配置启用 Google Authenticator

 

# 编辑 PAM 的 sshd 配置
sudo vi /etc/pam.d/sshd

# 在第一行(auth       include   password-auth)之前或之后添加:
auth       required     pam_google_authenticator.so nullok
# nullok 参数:允许没有配置 2FA 的用户仍然可以用密码登录

# 如果是 Ubuntu,可能是:
# auth required pam_google_authenticator.so nullok

 

6.5 测试 2FA

 

# 用 SSH 测试
ssh admin@

# 应该看到:
# Verification code:
# Password:

# 输入 Google Authenticator 显示的验证码
# 如果配置正确,应该能登录

 

第七步:入侵检测——发现攻击痕迹

7.1 使用 OSSEC 检测暴力破解

OSSEC 是一个开源的主机入侵检测系统(HIDS),可以检测 SSH 暴力破解、文件篡改、Rootkit 等。

 

# 安装(CentOS)
sudo yum install -y ossec-hids

# 安装(Ubuntu)
sudo apt-get install -y ossec-hids

# OSSEC 配置后可以自动封禁攻击 IP,无需单独配置 fail2ban

 

7.2 常用入侵检测命令

 

# 检查是否有用户被添加
cat /etc/passwd | grep -E "test|hack|backup"

# 检查是否有新增的 SSH 公钥
cat ~/.ssh/authorized_keys | head -10

# 检查最近执行的命令
history

# 检查是否有新的 cron 任务
sudo crontab -l
sudo cat /var/spool/cron/root

# 检查是否有异常的网络连接
ss -tunapl | grep ESTABLISHED

# 检查是否有异常进程
ps aux | grep -iE "xmrig|miner|kinsing|kworkerds|illegal"

 

第八步:综合防御方案

8.1 推荐的安全加固配置

最小安全方案(适合大多数场景):

公钥认证,禁用密码登录

fail2ban 自动封禁

SSH 端口改为非标准端口

只允许特定 IP 访问 SSH

高安全方案(适合核心服务器):

公钥认证 + 2FA 双因素认证

fail2ban 自动封禁

SSH 端口改为非标准端口

只允许特定 IP 访问 SSH

使用 OSSEC 做入侵检测

所有 SSH 登录触发邮件告警

8.2 完整配置脚本

 

#!/bin/bash
# save as: ssh_security_hardening.sh
#  执行前确保你有 VNC/ILO 等备用登录方式

set -e

echo "===== SSH 安全加固 ====="

# 1. 修改 SSH 端口
SSH_PORT=2222

# 2. 安装 fail2ban
if command -v yum &> /dev/null; then
    sudo yum install -y epel-release
    sudo yum install -y fail2ban
elif command -v apt-get &> /dev/null; then
    sudo apt-get install -y fail2ban
fi

# 3. 配置 fail2ban jail.local
sudo tee /etc/fail2ban/jail.local > /dev/null < /dev/null < /dev/null; then
    sudo firewall-cmd --permanent --add-port=${SSH_PORT}/tcp
    # 允许运维 IP(请替换为你的 IP)
    # sudo firewall-cmd --permanent --add-source=/32
    sudo firewall-cmd --reload
fi

echo "SSH 安全加固完成!"
echo "SSH 端口已改为: $SSH_PORT"
echo "请用新端口登录测试:ssh -p $SSH_PORT admin@"

 

总结

SSH 暴力破解是持续性的安全威胁,但完全可以通过合理的配置防御。推荐的防御优先级:

必须做(阻断最常见的攻击):

禁用密码登录,改用公钥认证 —— 这是最彻底的手段,密码登录关闭后,暴力破解毫无意义

配置 fail2ban —— 自动封禁频繁登录失败的 IP,即使攻击者拿到密码也会被封

强烈推荐(进一步减少攻击面):

修改 SSH 默认端口 —— 减少 90%+ 的扫描流量,降低日志噪音

限制 SSH 来源 IP —— 只允许运维 IP 访问,彻底阻断外部扫描

可选(高安全场景):

双因素认证(2FA) —— 即使私钥泄露,攻击者仍无法登录

入侵检测系统(OSSEC) —— 发现异常行为,主动告警

防御的核心原则:纵深防御,单一手段可能被绕过,但多层叠加后攻击成本会极高。

第九节:日常运维安全检查清单

安全加固不是一劳永逸的事情。配置完成后,还需要建立日常安全巡检机制,持续监控安全状态。

9.1 每日安全巡检脚本

 

#!/bin/bash
# save as: ssh_security_daily_check.sh
# 配置 cron: 0 9 * * * /usr/local/bin/ssh_security_daily_check.sh

LOG_FILE="/var/log/ssh_security_check.log"
ALERT_EMAIL="admin@example.com"

echo "===== SSH 安全巡检 $(date) =====" >> $LOG_FILE

# 1. 检查 fail2ban 是否运行
FAIL2BAN_STATUS=$(systemctl is-active fail2ban 2>/dev/null)
if [ "$FAIL2BAN_STATUS" != "active" ]; then
    echo "[ALERT] fail2ban 未运行!" | tee -a $LOG_FILE
    echo "请立即检查:systemctl status fail2ban" | tee -a $LOG_FILE
fi

# 2. 检查最近 SSH 登录失败次数
FAILED_COUNT=$(grep "Failed password" /var/log/secure 2>/dev/null | wc -l)
echo "SSH 登录失败总数: $FAILED_COUNT" >> $LOG_FILE

# 3. 检查是否有成功的陌生 IP 登录
KNOWN_IPS="192.168.1.100 10.0.0.50"
ACCEPTED_LOGINS=$(grep "Accepted" /var/log/secure 2>/dev/null)
for ip in $KNOWN_IPS; do
    ACCEPTED_LOGINS=$(echo "$ACCEPTED_LOGINS" | grep -v "$ip")
done

if [ -n "$ACCEPTED_LOGINS" ]; then
    echo "[ALERT] 发现未知来源的成功登录!" | tee -a $LOG_FILE
    echo "$ACCEPTED_LOGINS" | tee -a $LOG_FILE
    echo "$ACCEPTED_LOGINS" | mail -s "SSH 未知登录告警" $ALERT_EMAIL
fi

# 4. 检查 SSH 配置是否有被动过的痕迹
SSHD_CONFIG_MD5=$(md5sum /etc/ssh/sshd_config | awk '{print $1}')
SSHD_CONFIG_MD5_SAVED="<之前记录的md5值>"
if [ "$SSHD_CONFIG_MD5" != "$SSHD_CONFIG_MD5_SAVED" ]; then
    echo "[ALERT] sshd_config 文件被修改!" | tee -a $LOG_FILE
fi

# 5. 检查 authorized_keys 是否有新增项
KNOWN_KEYS_COUNT=<之前记录的key数量>
CURRENT_KEYS_COUNT=$(wc -l /root/.ssh/authorized_keys 2>/dev/null | awk '{print $1}')
if [ "$CURRENT_KEYS_COUNT" -gt "$KNOWN_KEYS_COUNT" ]; then
    echo "[ALERT] authorized_keys 有新增公钥!" | tee -a $LOG_FILE
fi

# 6. 检查被封禁的 IP 数量
BANNED_IP_COUNT=$(sudo fail2ban-client status sshd | grep "Banned IP" | awk '{print $4}')
echo "当前被封禁 IP 数量: $BANNED_IP_COUNT" >> $LOG_FILE

# 如果被封禁 IP 数量异常高(如超过 100),说明正在遭受攻击
if [ "$BANNED_IP_COUNT" -gt 100 ]; then
    echo "[ALERT] 被封禁 IP 数量异常: $BANNED_IP_COUNT" | tee -a $LOG_FILE
fi

echo "" >> $LOG_FILE

 

9.2 每周安全审计

 

#!/bin/bash
# save as: ssh_security_weekly_audit.sh
# 配置 cron: 0 3 * * 0 /usr/local/bin/ssh_security_weekly_audit.sh

# 1. 统计本周 SSH 暴力破解统计
echo "===== SSH 暴力破解周报 ====="
echo "统计时间范围: $(date -d '7 days ago' +%Y-%m-%d) 至 $(date +%Y-%m-%d)"

# 统计来源 IP 分布
echo ""
echo "[ 来源 IP TOP 20 ]"
grep "Failed password" /var/log/secure -m 10000 | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

# 统计被尝试的用户名
echo ""
echo "[ 被尝试的用户名 TOP 20 ]"
grep "Failed password" /var/log/secure -m 10000 | awk '{print $9}' | sort | uniq -c | sort -rn | head -20

# 统计总失败次数
TOTAL_FAILED=$(grep "Failed password" /var/log/secure -m 10000 | wc -l)
echo ""
echo "本周登录失败总次数: $TOTAL_FAILED"

# 2. 统计 fail2ban 封禁情况
BANNED_IPS=$(sudo iptables -L f2b-sshd -n | grep "REJECT" | awk '{print $4}' | sort | uniq | wc -l)
echo "本周 fail2ban 新封禁 IP 数: $BANNED_IPS"

# 3. 审计 authorized_keys 变更
echo ""
echo "[ authorized_keys 变更审计 ]"
if [ -f /root/.ssh/authorized_keys ]; then
    echo "当前公钥数量: $(wc -l < /root/.ssh/authorized_keys)"
    echo "最近修改时间: $(stat -c %y /root/.ssh/authorized_keys)"
fi

# 4. 审计新创建的用户账号
echo ""
echo "[ 本周新建账号审计 ]"
lastlog -b 7 | grep -v "Never" | tail -20

 

9.3 SSH 安全配置基线文档

每次安全配置变更后,建议更新配置基线文档,方便后续审计和交接:

 

SSH 安全配置基线(版本:v1.0,日期:2026-04-29)

一、服务配置
- SSH 端口:2222(非标准端口)
- SSH 协议版本:2(默认)
- 公钥认证:启用
- 密码认证:禁用
- 空密码登录:禁用
- Root 登录:禁用
- X11Forwarding:禁用
- AllowTcpForwarding:禁用

二、访问控制
- 允许登录的用户:admin, deploy
- 允许登录的 IP 段:192.168.1.0/24, 10.0.0.0/8
- fail2ban:启用,封禁时间 1 小时,最多 3 次尝试

三、审计日志
- SSH 登录日志:/var/log/secure
- 日志保留:90 天
- 集中日志服务器:log-server-ip

四、维护记录
- 2026-04-29:初始加固,修改端口、启用 fail2ban、配置公钥认证
- 2026-04-30:配置 IP 白名单

五、运维联系人
- 运维负责人:张工 138xxxx
- 安全负责人:李工 139xxxx

 

9.4 应急响应流程——发现 SSH 被入侵后怎么办

当日常巡检发现 SSH 被入侵时,按以下流程处置:

 

阶段一:确认(5 分钟内)
1. 查看 last 命令,确认是否有陌生 IP 登录记录
2. 查看 /var/log/secure,确认登录时间和来源 IP
3. 查看 /root/.bash_history,确认攻击者执行过哪些命令
4. 查看 /root/.ssh/authorized_keys,确认是否有后门公钥

阶段二:止血(15 分钟内)
1. 断开攻击者连接:pkill -kill -t 
2. 封锁攻击者 IP:iptables -I INPUT -s  -j DROP
3. 修改所有可能泄露的密码
4. 如果无法确认攻击路径,先关闭 SSH(systemctl stop sshd)

阶段三:排查
1. 查看攻击者使用的账号和密码(如果密码登录被禁,可能是公钥入侵)
2. 查看攻击者在系统中执行了哪些操作
3. 检查是否有植入后门(cron、SSH authorized_keys、systemd service)
4. 检查是否有横向移动(攻击内网其他机器)

阶段四:修复
1. 删除攻击者植入的所有后门
2. 如果系统被严重入侵,建议重装系统
3. 重新配置 SSH 安全加固
4. 从备份恢复被篡改的文件

阶段五:复盘
1. 输出完整的事件报告
2. 分析攻击路径,更新安全加固方案
3. 补充监控告警规则

 

最后提醒:任何安全配置变更前,都要确保有备用登录方式(VNC/ILO/云控制台)。最悲惨的情况不是被攻击,而是被自己的防火墙规则挡在外面。

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分