行業洞察

一次真實伺服器入侵的教訓:保障主機基礎設施安全的 8 個習慣

4 個步驟 5 分鐘閱讀 17 次閱讀 0
本文目錄

我們最近調查了一起針對某主機公司管理基礎設施的入侵事件。整個過程毫無特別之處:沒有零日漏洞,也沒有國家級攻擊工具。它只是一連串普通習慣的疊加,每一個單獨看都無害,合在一起卻讓攻擊者悄無聲息地潛伏了一個多星期。下面介紹事件經過、最終如何被發現,以及幾乎可以在每一步阻止入侵的八個習慣。

入侵經過

  1. 共用 root 密碼。包括一台管理伺服器和一台跳板機在內的多台伺服器使用相同的 root 密碼,並且允許通過 SSH 密碼登入。
  2. 悄無聲息的首次登入。攻擊者用這個密碼登入了一次,並留下一條 SSH 隧道。隧道不會開啟終端,因此從未出現在 who 中。它一直保持了九天。
  3. 動靜很大的第二階段。一個多星期後,多個 IP 使用同一個密碼登入,新增了自己的 SSH 金鑰,建立了 systemd 服務和計劃任務,並在網站中植入了 webshell。
  4. 掩蓋痕跡。攻擊者將檔案修改時間回撥了一週,讓新檔案看起來像舊檔案;使用了一次性、執行後自刪除的 webshell;並在 /tmp 中留下了一個隱藏的 PHP 檔案。
  5. 被發現。之所以被發現,是因為業主申請了一次例行安全檢查,登入日誌顯示有來自無人認識的 IP 的 root 密碼登入。

阻斷攻擊鏈的 8 個習慣

1. 只用金鑰登入,任何地方都不重複使用密碼

關閉 SSH 密碼登入,為每個人分配各自的金鑰。這樣即使密碼洩露也毫無用處,一個被盜的憑據也絕不會開啟所有機器。請參閱 設定 SSH 金鑰登入。

2. 把跳板機和管理伺服器當作最核心的資產

跳板機或管理伺服器可以訪問其他所有機器,因此是最有價值的攻擊目標。為它設定獨立的憑據、最嚴格的防火牆和最密切的監控。一旦被入侵,應當重建,而不是清理。

3. 每次登入都收到提醒

那條隧道能執行九天,是因為沒有人收到登入通知。每次 SSH 和麵板登入都傳送一條 Telegram 訊息,陌生 IP 就會立刻暴露。設定大約只需十分鐘:審計登入並設定 Telegram 提醒。

4. 檢查連線,而不只是會話

除了 who,還要用 ss -tnp 檢查來自陌生 IP 的長時間 SSH 連線。隧道和 SFTP 會話在常用命令中是看不到的。

5. 所有面板都開啟雙因素認證

主機面板、計費系統和伺服器管理面板掌握著一切的鑰匙。請開啟兩步驗證,並儘可能將管理頁面限製為已知 IP 訪問。寶塔面板請參閱 寶塔面板安全加固指南。

6. 不要相信檔案日期

修改時間很容易偽造。排查植入檔案時,請使用 change time(狀態變更時間)和 birth time(建立時間),普通使用者態程序無法將其回撥:

find /var/www /tmp /dev/shm -newerct "-14 days" -type f 2>/dev/null
stat /path/to/suspicious.php    # compare Modify with Change and Birth

7. 關閉不需要開放的埠

資料庫埠、面板埠和管理路徑不應對整個網際網路開放。只放行您自己的 IP,將網站放在可隱藏源站的代理後面,並將防火牆預設策略設為拒絕。請參閱 使用 Cloudflare 隱藏源站 IP。

8. 事件發生後,更換所有憑據並保留證據

終止活動會話,但在刪除任何東西之前,先把日誌和可疑檔案複製到安全的地方。然後更換被入侵機器能接觸到的所有密碼、金鑰和 API 令牌,包括資料庫和支付閘道器憑據。完整的清理清單請參閱 檢查 Linux 伺服器是否被入侵。

出問題時,好的基礎設施能為您提供什麼

能否控制住局面,取決於您在出事之前就掌握的控制能力。在 IMIDC 獨立伺服器上,即使您用防火牆封鎖了其他所有訪問,仍然可以通過 VNC 控制臺 訪問伺服器螢幕;可以啟動 救援系統 離線檢查硬碟;也可以 重灌 您不再信任的伺服器。這些都能在客戶中心自助完成(請參閱 獨立伺服器管理面板使用指南)。當您需要有人幫忙把關時,我們的 7×24 小時技術支援團隊可以協助審查日誌和清理。

10 分鐘自查

grep "Accepted password" /var/log/auth.log* | tail     # any password logins?
ssh-keygen -lf /root/.ssh/authorized_keys              # do you know every key?
ss -tnp | grep sshd                                    # unknown long-lived connections?
crontab -l; ls /etc/cron.d /etc/systemd/system         # anything you did not add?
find /tmp /var/tmp /dev/shm -name ".*" -type f         # hidden files in temp dirs?

如果發現任何陌生的內容,請先停下來調查,再做進一步修改。提交工單,IMIDC 團隊將協助您逐步排查。

相關文章

這篇文章有幫助嗎?

相關教程