你的 SSH 伺服器 可能每天都在遭受數百次攻擊。 這種可能性很大 這句話並不足夠。我個人堅信,幾乎 100% 的概率是你的伺服器每天都會受到數百次的攻擊。然而,許多開發者幾乎從不打開 /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 來“監視”日誌的習慣。
如果想了解 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
特別要注意的有:
-
平時不常用的帳戶登錄
-
與平常不同的時間登錄(例如:凌晨三點)
-
來自陌生國家或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 TOP 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 上
-
在短時間內
-
發生多次登錄失敗時
自動添加防火牆規則以進行阻擋的工具。
概念簡單:
-
監控
auth.log中的Failed password模式 -
超過特定閾值時,阻擋該 IP 使用 iptables/ufw
從而自動化日誌分析,實現自動阻擋暴力破解攻擊。
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 TOP 10
-
在
Accepted日誌中,-
查看新的 IP,
-
對於不尋常的時間,
-
或陌生帳戶的存在
-
-
阻擋可疑 IP 使用防火牆/
fail2ban等
只要直接親自查看一次,
“噢,這台伺服器確實每天都在遭受攻擊”的感覺就會油然而生,
並激發出投入安全設置的動力。

結語:立即打開日誌看看
SSH 安全,首先在於了解我的伺服器中實際發生了什麼事,而不是尋求華麗的解決方案。
-
打開
/var/log/auth.log或/var/log/secure -
根據
Failed password、Invalid user、Accepted進行閱讀 -
若有異常,立即考慮更改設置並引入防火牆和
fail2ban
如果你讀完了這篇文章,
那麼現在已經準備好避免“因為未查看日誌而遭受的駭客攻擊”了。
現在打開終端,親自查看伺服器日誌吧。
對開發者來說,安全並非選擇,而是必須和常規。
目前沒有評論。