你的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.service或journalctl -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 “监视日志”的习惯也是不错的。
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。
概念很简单:
-
监控
auth.log中的Failed password模式 -
一旦超过特定阈值,就用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. 为开发者准备的“最少生活日志检查流程”
如果将开发者在工作中能够实现的程度总结下来,
只需做到以下几点,安全敏感度将完全不同.
每周进行一次:
-
查看最近一周内
Failed password和Invalid user的数量 -
确认攻击最多的IP前10名
-
在
Accepted日志中检查-
新的IP,
-
异常的时间段,
-
陌生的账户
-
-
通过防火墙/
fail2ban等阻止可疑IP
只需亲自看一遍,
“哦,这个服务器真的每天都在受到攻击”的感觉便会油然而生,
也会激发出投资安全设置的意愿。

总结:现在就打开日志吧
SSH安全并不是一些宏大的解决方案,
从观察自己服务器上究竟发生了什么开始。
-
打开
/var/log/auth.log或/var/log/secure -
根据
Failed password、Invalid user、Accepted进行阅读 -
若有异常则立即考虑修改设置和引入防火墙、
fail2ban
如果你读完了这篇文章,
你现在已做好准备避免由于“无法查看日志”而遭受的黑客攻击。
快打开终端,亲自检查一下服务器日志。
对开发者来说,安全不是选择而是必要和日常.
目前没有评论。