你的SSH服务器很可能每天遭受数百次攻击。 说可能性很大还不够,我甚至可以肯定你的服务器几乎每天会受到数百次攻击。然而,很多开发者几乎从不查看 /var/log 文件夹。 不妨现在在终端运行简单的 journalctl -f |grep ssh

只要正确查看日志:

  • 什么时候

  • 在哪里

  • 如何
    尝试进入服务器的详细信息将一目了然。

这篇文章将从开发者的角度整理如何解读SSH服务器日志实际分析黑客迹象的方法


1. SSH日志在哪里保存?



不同的Linux发行版SSH日志的位置略有不同。

通常情况是:

  • Ubuntu / Debian系列

    • /var/log/auth.log
  • CentOS / RHEL系列

    • /var/log/secure
  • 基于systemd的通用命令

    • journalctl -u ssh.servicejournalctl -u sshd

虽然使用tail也不错,但个人来说非常喜欢使用journald,因为可以把所有服务的日志集中在一个地方查看。

# Ubuntu示例
sudo tail -f /var/log/auth.log

# CentOS/RHEL示例
sudo tail -f /var/log/secure

# 实时查看systemd服务日志
sudo journalctl -u ssh.service -f

小贴士: 即便是开发服务器,至少偶尔养成使用 tail -f “监视日志”的习惯也是不错的。

想要了解journald的具体使用方法请点击“这里”!


2. 解构SSH日志中的一行

让我们通过查看一行典型的SSH日志来理解其结构。(Ubuntu示例)

2.1 公钥登录成功

Jan 10 12:34:56 myserver sshd[12345]: Accepted publickey for deploy from 203.0.113.10 port 50312 ssh2: ED25519 SHA256:xxxx

各部分的含义:

  • Jan 10 12:34:56 : 日期,时间

  • myserver : 主机名

  • sshd[12345] : 进程名称(SSH守护进程)和PID

  • Accepted publickey : 认证成功,方式是公钥

  • for deploy : 登录的账户名

  • from 203.0.113.10 : 连接源IP

  • port 50312 : 客户端端口

  • ssh2: ED25519 ... : 协议/密钥类型信息

理解这些信息后,就可以快速了解“谁从哪里用钥匙连接”.

2.2 密码登录失败

Jan 10 12:35:01 myserver sshd[12346]: Failed password for root from 198.51.100.23 port 50320 ssh2
  • Failed password : 密码认证失败

  • for root : 尝试以root账户登录

  • from 198.51.100.23 : 源IP

如果这样的日志以几秒钟的间隔出现数十至数百次
几乎可以确定是暴力破解攻击

2.3 尝试以不存在的用户登录

Jan 10 12:35:05 myserver sshd[12347]: Invalid user admin from 198.51.100.23 port 50325
  • Invalid user admin : 以不存在的admin账户尝试登录

这也是自动化机器人常用的模式。


3. 从日志中看到的典型攻击模式



3.1 暴力破解攻击 (brute-force)

特征:

  • Failed password日志在短时间内大量出现

  • 同一IP尝试数十至数百次

  • 使用root, admin, test, oracle等账户名

快速确认的示例:

# Failed password总数量
sudo grep "Failed password" /var/log/auth.log | wc -l

# 哪个账户受到攻击最多
sudo grep "Failed password" /var/log/auth.log \
  | awk '{for (i=1;i<=NF;i++) if ($i=="for") print $(i+1)}' \
  | sort | uniq -c | sort -nr | head

3.2 扫描不存在的用户

sudo grep "Invalid user" /var/log/auth.log | head

大量此日志的意义是“正在随机尝试服务器上可能存在的账户”.

3.3 特定IP的过度尝试

查看某个IP是否特别多次失败:

sudo grep "Failed password" /var/log/auth.log \
  | awk '{print $(NF-3)}' \
  | sort | uniq -c | sort -nr | head

上面的$(NF-3)通常指的是from <IP>部分的IP,但
可能会因环境而异,需要根据自己的日志格式进行调整。


4. 从“成功的”登录中寻找异常迹象

攻击通常以失败告终,但真正可怕的是成功的登录.

4.1 收集Accepted日志

sudo grep "Accepted" /var/log/auth.log

其中特别需要注意的:

  • 平时未使用的账户的登录

  • 与平常不同时段的登录(例如:凌晨3点)

  • 陌生国家/区域的IP(非公司/家中/VPN的IP)

4.2 一次查看最近的登录记录

last命令显示最近的登录记录。

# 最近的SSH登录记录
last -i | head

# 失败的登录(在支持的环境中)
lastb | head

仅仅定期检查这个,就能轻松发现
“接入记录是我没有在场的时候”的情况。


5. 实战日志分析:快速检查流程示例

假设有一台SSH服务器,
我们将制定5分钟即可完成的检查流程.

5.1 第一步:检查登录失败总量

sudo grep "Failed password" /var/log/auth.log | wc -l
sudo grep "Invalid user" /var/log/auth.log | wc -l
  • 如果数字突然大幅增加,可以怀疑“攻击强度增加”。

5.2 第二步:攻击最多的IP前10名

sudo grep "Failed password" /var/log/auth.log \
  | awk '{print $(NF-3)}' \
  | sort | uniq -c | sort -nr | head
  • 前IP可以放进防火墙/fail2ban规则中。

5.3 第三步:尝试以root登录的记录

sudo grep "Failed password for root" /var/log/auth.log | tail
sudo grep "Accepted.*root" /var/log/auth.log
  • Accepted出现时,意味着已经成功以root登录,非常危险。

5.4 第四步:扫描最近的成功登录

sudo grep "Accepted" /var/log/auth.log | tail -n 50

这里需要检查的要点:

  • 是我不知道的IP吗?

  • 是正常的工作时间段吗?

  • 突然出现的新账户吗?


6. 仅查看日志有什么用?立即采取防御措施

如果在日志中发现有攻击的迹象,
那么应该着手进行防御设置.

6.1 关闭密码登录(仅允许公钥)

/etc/ssh/sshd_config中:

PasswordAuthentication no
PubkeyAuthentication yes

修改后:

sudo systemctl reload sshd
# 或者
sudo service ssh restart

切记要在成功测试了公钥登录后再关闭密码登录。
否则可能导致自己无法进入。

6.2 禁止root直接登录

PermitRootLogin no

禁止以root直接登录,
建议以普通账户登录后使用sudo

6.3 修改端口(减少噪音)

Port 22    # -> 例如: 修改为2222
  • 虽然更改端口并不意味着安全性会“增强”,

  • 但无意义的自动扫描/攻击日志会显著减少,
    让“真正的异常迹象”更易显现。

6.4 使用如fail2ban的工具

fail2ban会监控日志,当出现:

  • 同一IP

  • 在短时间内

  • 发生多次登录失败时

自动添加防火墙规则来阻止该IP。

概念很简单:

  1. 监控auth.log中的Failed password模式

  2. 一旦超过特定阈值,就用iptables/ufw阻止该IP

实现对日志分析的自动化,以自动阻止暴力破解攻击.

6.5 通过防火墙限制SSH访问

如果可能的话:

  • 只允许从公司VPN或特定固定IP访问22/tcp(或修改后的端口)

  • 其余都禁止

例如:ufw简单示例

sudo ufw allow from 203.0.113.50 to any port 22 proto tcp
sudo ufw deny 22/tcp

7. 为开发者准备的“最少生活日志检查流程”

如果将开发者在工作中能够实现的程度总结下来,
只需做到以下几点,安全敏感度将完全不同.

每周进行一次:

  1. 查看最近一周内Failed passwordInvalid user的数量

  2. 确认攻击最多的IP前10名

  3. Accepted日志中检查

    • 新的IP,

    • 异常的时间段,

    • 陌生的账户

  4. 通过防火墙/fail2ban等阻止可疑IP

只需亲自看一遍,
“哦,这个服务器真的每天都在受到攻击”的感觉便会油然而生,
也会激发出投资安全设置的意愿。


黑客攻击ssh服务器的情景

总结:现在就打开日志吧

SSH安全并不是一些宏大的解决方案,
从观察自己服务器上究竟发生了什么开始

  1. 打开/var/log/auth.log/var/log/secure

  2. 根据Failed passwordInvalid userAccepted进行阅读

  3. 若有异常则立即考虑修改设置和引入防火墙、fail2ban

如果你读完了这篇文章,
你现在已做好准备避免由于“无法查看日志”而遭受的黑客攻击。
快打开终端,亲自检查一下服务器日志。

对开发者来说,安全不是选择而是必要和日常.

点击“这里”可以查看关于Fail2ban的详细使用方法。