ECS 安全加固与入侵排查实战记录

记录一次阿里云「异常登录 / 凭据窃取」告警的完整排查与加固过程

记录时间:2026-10-31

服务器:阿里云 ECS(Ubuntu 22.04)


一、告警来了

阿里云云安全中心推送了两条告警:

ECS 在非常用地登录
异常登录:凭据窃取

看到这种告警,第一反应应该是先排查有没有被攻破,而不是急着改配置。


二、入侵排查(6 项检查)

检查 1:当前登录会话

who
ps aux | grep '[s]shd.*@'

判断标准:有没有你不认识的 IP 正在连接。

检查 2:最近登录成功记录

last -n 30 -F

看两个关键点:

  • 登录 IP 是否都是自己的

  • 认证方式是否为 publickey(公钥)而非 password

本次结果:

root  pts/1  115.230.32.76   10-29 14:00 - 21:13
root  pts/1  211.90.235.252  10-29 11:18 - 12:02   ← 异地,但确认是自己的网络

检查 3:登录失败记录(暴力破解痕迹)

lastb -n 20 -F

# 或从 auth.log 统计失败次数最多的 IP
grep 'Failed password' /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head

本次发现了 6 个 IP 在尝试爆破:

218.28.78.67     尝试 admin / debian
154.18.197.29    尝试 root
221.194.148.34   尝试 root
139.19.117.130   尝试 admin
64.62.197.68     尝试空用户名

检查 4:SSH 授权密钥是否被篡改

cat /root/.ssh/authorized_keys
find /home /root -name 'authorized_keys' 2>/dev/null

关键:只应该有你自己的密钥。如果出现陌生密钥 = 已被入侵。

本次结果:只有 1 把 my-aliyun 密钥,正常。

检查 5:可疑进程(挖矿/后门特征)

# 按 CPU 排序看异常高占用
ps aux --sort=-%cpu | head -10

# 检查常见挖矿木马进程名
ps aux | grep -iE 'kdevtmpfsi|kinsing|minerd|xmrig|masscan|zmap' | grep -v grep

本次结果:无典型挖矿进程。

检查 6:对外网络连接

ss -tunp

看有没有连接到陌生 IP(尤其是矿池、C2 服务器)。

本次结果:

100.100.30.26:80    → AliYunDun(阿里云监控,正常)
100.100.45.182:443  → hbrclient(阿里云备份,正常)
115.230.32.76:22    → 自己的 SSH 会话

检查 7:定时任务(后门常用藏身处)

crontab -l
ls -la /etc/cron.d/
systemctl list-timers --all

本次结果:只有自己的备份脚本,干净。


三、排查结论

✅ 无入侵痕迹
   · 所有登录都是自己的 IP + 公钥
   · 无陌生密钥
   · 无挖矿/后门进程
   · 无异常外联
   · 定时任务干净

⚠️ 但发现真实高危配置
   · PermitRootLogin yes
   · PasswordAuthentication yes
   · 且正在被暴力破解(6 个 IP 尝试)

"非常用地登录"的真相:自己从手机热点/公司网络登录过,触发了异地告警。
"凭据窃取"的真相:大量暴力破解尝试,触发了凭据窃取检测规则。


四、SSH 加固

备份配置(重要!)

cp /etc/ssh/sshd_config /root/sshd_config.bak.$(date +%Y%m%d-%H%M%S)

修改配置

# 1) 禁用密码登录,只允许公钥
sed -i 's/^PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config

# 2) root 仅允许公钥登录(禁止密码)
sed -i 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config

# 3) 确保公钥认证开启
sed -i 's/^PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config

# 4) 限制认证尝试次数
sed -i 's/^MaxAuthTries.*/MaxAuthTries 3/' /etc/ssh/sshd_config

# 5) 禁用空密码
echo 'PermitEmptyPasswords no' >> /etc/ssh/sshd_config

# 6) 关闭 X11 转发(减少攻击面)
echo 'X11Forwarding no' >> /etc/ssh/sshd_config

语法检查(关键步骤!)

sshd -t

这一步不能省。配置写错会导致 SSH 起不来,直接把自己锁在服务器外面。

重载服务

systemctl reload sshd

用 reload 而不是 restart,当前会话不会断开。

验证

# 尝试密码登录(应该被拒绝)
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no root@127.0.0.1

# 预期输出
root@127.0.0.1: Permission denied (publickey).

五、安装 fail2ban 自动封禁

安装

apt-get install -y fail2ban

配置 /etc/fail2ban/jail.local

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
banaction = iptables-multiport
backend = systemd

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 7200
findtime = 600

启动

systemctl enable fail2ban
systemctl restart fail2ban

查看状态

fail2ban-client status sshd

输出:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|- Actions
   |- Currently banned: 0
   |- Banned IP list:

六、内存优化(顺手做的)

排查时发现两个"无用但吃内存"的服务:

1. fwupd(固件更新守护进程)—— 占 140MB

云服务器完全不需要(那是给物理机更新 BIOS 用的)。

systemctl stop fwupd
systemctl disable fwupd
systemctl mask fwupd

省 140MB,零风险。

2. 阿里云 aegis(云盾)—— 占 37MB

尝试关闭失败:

systemctl disable aegis → Access denied
pkill -9 → 进程被内核模块重启

原因:AliSecGuard 是内核模块(lsmod | grep AliSecGuard 可见),由内核层守护,用户态无法关闭。

结论:37MB 不到总内存 2%,且是安全防护,建议保留。真要关需去阿里云控制台卸载客户端。

优化效果

项目

优化前

优化后

已用内存

762 MB

629 MB

可用内存

779 MB

911 MB

使用率

54%

35%


七、经验总结

1. 看到安全告警先排查,别慌

异地登录很可能是自己换了网络(手机热点、公司 WiFi、VPN)。先看 last 和 auth.log,确认 IP 和认证方式。

2. 密码登录是最大的风险

云服务器暴露在公网,24 小时被爆破是常态。只用公钥登录能彻底消除这个风险——攻击者没有你的私钥文件,爆破再多次也没用。

3. 改 SSH 配置必须三步走

备份 → 改配置 → sshd -t 语法检查 → reload

跳过语法检查 = 可能把自己锁在门外,只能去阿里云控制台用 VNC 救场。

4. fail2ban 是低成本高收益

3 行配置就能自动封禁爆破 IP,减少日志噪音,还能降低被爆破成功的概率。

5. 云服务器上的"无用服务"

  • fwupd:固件更新,云服务器不需要

  • snapd:如果不用 snap 包,可以关

  • multipathd:如果不是多路径存储,可以关

6. 内存百分比要看清楚是"占什么"的比例

Docker/1Panel 显示的 MEM% 是占容器上限的比例,不是占物理内存。看到 22% 别慌,换算一下可能只有 3%。


八、最终状态

SSH 安全:
  PasswordAuthentication no        (仅公钥)
  PermitRootLogin prohibit-password
  MaxAuthTries 3
  fail2ban: active(失败3次封禁2小时)

系统优化:
  fwupd: inactive / masked(省 140MB)
  内存: 629MB 已用 / 911MB 可用(35%)

入侵排查结论:
  ✅ 无入侵痕迹
  ✅ 所有登录可追溯
  ✅ 无后门/挖矿进程

附:常用排查命令速查

# 登录相关
last -n 20 -F                          # 成功登录
lastb -n 20 -F                         # 失败登录
who                                    # 当前会话
grep 'Accepted' /var/log/auth.log      # 认证成功日志
grep 'Failed' /var/log/auth.log        # 认证失败日志

# 进程相关
ps aux --sort=-%cpu | head             # CPU TOP
ps aux --sort=-rss | head              # 内存 TOP
lsmod | grep -iE 'aegis|ali'           # 内核模块

# 网络相关
ss -tunp                               # 所有连接
netstat -tunp                          # 同上

# 后门排查
crontab -l                             # root 定时任务
ls -la /etc/cron.d/                    # 系统定时任务
systemctl list-timers --all            # systemd 定时器
cat /root/.ssh/authorized_keys         # 授权密钥
find / -name 'authorized_keys' 2>/dev/null   # 所有用户的密钥

# fail2ban 管理
fail2ban-client status                 # 总览
fail2ban-client status sshd            # SSH 详情
fail2ban-client set sshd unbanip x.x.x.x   # 解封