你的 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.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 嘗試數十次至數百次

  • 使用如 rootadmintestoracle 等帳戶名稱

快速檢查的範例:

# 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 上

  • 在短時間內

  • 發生多次登錄失敗時

自動添加防火牆規則以進行阻擋的工具。

概念簡單:

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

  2. 超過特定閾值時,阻擋該 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. 為開發者設計的“最少日誌檢查例行程序”

從實際工作中,開發者可以做到的程度總結為,
每週檢查一次,大約做到以下這些 即可大幅提升安全性。

每週一次的檢查:

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

  2. 檢查最多失敗的 IP TOP 10

  3. Accepted 日誌中,

    • 查看新的 IP,

    • 對於不尋常的時間,

    • 或陌生帳戶的存在

  4. 阻擋可疑 IP 使用防火牆/fail2ban

只要直接親自查看一次,
“噢,這台伺服器確實每天都在遭受攻擊”的感覺就會油然而生,
並激發出投入安全設置的動力。


黑客攻擊 ssh 伺服器的情形

結語:立即打開日誌看看

SSH 安全,首先在於了解我的伺服器中實際發生了什麼事,而不是尋求華麗的解決方案。

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

  2. 根據 Failed passwordInvalid userAccepted 進行閱讀

  3. 若有異常,立即考慮更改設置並引入防火牆和 fail2ban

如果你讀完了這篇文章,
那麼現在已經準備好避免“因為未查看日誌而遭受的駭客攻擊”了。
現在打開終端,親自查看伺服器日誌吧。

對開發者來說,安全並非選擇,而是必須和常規

點擊這裡了解 fail2ban 的使用方法。