資安 SSH PAM Linux 暴力破解

登入成功就通知並記錄 連續失敗則暫封防暴力破解

善用Linux內建PAM機制 強化SSH安全防護

2026-01-12
系統管理者通常會使用SSH服務以加密的方式遠端登入系統進行管理,也因此SSH經常成為惡意攻擊者的目標,因此建議設定適當的防火牆政策,控管可連線SSH的來源,降低被攻擊的風險。此外,也可利用系統上的PAM機制,進一步加強防護SSH。

挾著優異性能及廣泛支援的優勢,使用Linux系統來架構相關的網路服務(例如網站伺服器、郵件伺服器)也越發普及,一般而言,系統管理者通常會使用SSH(Secure Shell)服務,以加密的方式遠端登入系統進行管理,也因此SSH常常成為惡意攻擊者的目標。

一般而言,通常僅會有系統管理人員使用SSH服務進行系統管理,因此建議設定適當的防火牆政策。

控管可連線SSH的來源(也就是僅允許管理人員的IP可登入),即可有效地降低SSH服務被攻擊的風險。

除此之外,也可利用系統上的PAM(Pluggable Authentication Modules)機制,進一步對SSH加強防護。

因此,在本文中將說明如何使用PAM機制來達到下列功能:

1. 在SSH成功登入後,即觸發某個事件(例如寄發電子郵件通知管理者)以即時告知SSH已被成功登入。

2. 設定暴力攻擊的防護機制(例如設定5分鐘內登入失敗超過3次,即暫時封鎖該來源10分鐘)來增強SSH防護。本文所使用的作業系統為CentOS Stream 9。

認識SSH

SSH(Secure Shell)是一種網路通訊協定,主要的功能在於提供加密的方式來安全地登入至遠端系統進行管理。一般而言,Linux會內建此服務,使用者無須另外安裝。在簡單介紹過SSH服務後,接下來繼續說明相關的組態檔(/etc/ssh/sshd_config),常用的組態設定說明如下:

Port 22:設定SSH服務所使用的通訊埠,預設為22。為了安全考量,建議考慮改用其他的通訊埠。

PasswordAuthentication yes | no:設定是否使用密碼的方式登入,亦即使用傳統的帳號∕密碼方式登入,預設為yes。

PubkeyAuthentication yes | no:設定是否要使用金鑰認證的方式登入,使用者在建立專屬的數位金鑰後即可使用此金鑰登入SSH伺服器,而無需帳號密碼的認證。

PermitRootLogin no:設定是否允許root使用者(最高權限使用者)從遠端登入,通常建議將此組態設為no,亦即不允許root使用者從遠端登入。

AllowUsers [使用者帳號]:設定允許登入的使用者名稱。

SyslogFacility [Facility名稱]:SSH服務運作時的相關資訊,均會以系統上的Syslog機制進行記錄,此組態即是設定所使用的Facility(類別)名稱,預設為AUTHPRIV,表示會以驗證類別來記錄SSH運作相關資訊。

ChallengeResponseAuthentication yes | no:利用挑戰(Challenge)及回應(Response)機制的驗證登入方式,由系統發出挑戰,例如詢問一個問題(Challenge),而後使用者再進行回應(Response)。在確認回應無誤後,就表示驗證成功。

LogLevel INFO:設定所要記錄SSH事件的嚴重程度等級,當SSH服務發生符合所設定的嚴重程度等級的事件時即記錄,常見等級包括FATAL(記錄發生嚴重錯誤的資訊)、ERROR(記錄發生一般錯誤的資訊)、INFO(記錄一般資訊,如登入、登出等資訊)、VERBOSE(記錄詳細資訊,如詳細的認證過程)、DEBUG(記錄最詳細的資訊,通常是用來偵錯的用途)。

CheckHostIP yes | no:設定確認已連線過的主機是否有不一致的問題,在設定yes的情況下,SSH會比對每次連線來源主機的資訊,如果發現同樣的IP,但為不同主機(最常見的情況為更換主機,但使用同樣的IP),就會以訊息提醒使用者。

Ciphers:設定SSH連線時所使用的加密演算法。

MACS(Message Authentication Code):設定SSH連線時所使用的訊息驗證演算法。

UseDNS yes | no:設定是否針對連線的來源IP進行DNS查詢,若無特殊的需求,建議設定為no,可加快連線SSH伺服器的速度。

usePam yes | no:設定是否使用PAM機制。

接下來,介紹PAM(Pluggable Authentication Modules)機制。

何謂PAM

PAM(Pluggable Authentication Modules)是Linux系統上用來統一管理使用者身分驗證的安全框架。主要目的在於將應用程式與驗證機制分離開來,讓開發者在不需要修改應用程式的原始碼的情況下,利用呼叫PAM模組的方法來達到驗證使用者身分的目的。

PAM的運作架構為三層式,如圖1所示。

圖1  PAM的運作架構。

「應用程式層」為欲使用PAM驗證的應用程式,在本文為sshd(SSH服務的應用程式)。而使用者可在「設定層」設定應用程式欲使用的PAM驗證方式,相關設定檔置於「/etc/pam.d」目錄內,並以服務名稱來命名,例如SSH服務的設定檔名稱即為sshd,相關內容如圖2所示。

圖2  設定檔相關內容。

使用者可藉由設定不同的組態來利用PAM機制進行使用者身分的驗證,其驗證方式會由上往下依序地執行驗證,以圖2為例,將會依序執行pam_selinux.so、pam_namespace.so等相關模組,在執行相關的模組驗證後,便會回覆驗證結果給應用程式,藉以判別是否驗證成功。其組態設定格式可分為下列四個欄位:

類型  控制組態  模組路徑  模組參數

每一個欄位的說明,如下所述:

類型

依其性質,則分為下列類型:

Auth(認證管理)

此類型的模組是針對使用者所提供的資訊(例如帳號∕密碼)來驗證使用者是否為合法的使用者。一般用來驗證帳號∕密碼是否正確。

Account(帳戶管理)

相對於認證管理,主要是針對驗證的帳號使用狀態,例如驗證帳戶是否為有效帳號或帳號有效期限是否過期。

Password(密碼管理)

主要是針對密碼進行管理,例如設定密碼的複雜度或限定密碼的有效期限等相關事項。

 Session(會話管理)

主要是管理使用者成功登入後或登出等相關執行的事項,例如可設定記錄使用者登入時間與來源。

控制組態

此組態主要是設定PAM模組的行為,常用的組態如下所述:

required

當PAM模組驗證判別為失敗時,並不會馬上回覆失敗,而是會繼續地往下執行其他模組的判別,直至所有模組都判別完成後,才會回覆驗證失敗至應用程式,告知驗證失敗。除此之外,必須所有的模組都驗證成功,才會回覆驗證成功。

requisite

當某個模組驗證判別為失敗時,即直接回覆驗證失敗訊息至應用程式,並不再繼續往下驗證其他模組。

sufficient

在同樣一種模組類型內,如果單一模組驗證判定為成功,即表示以此模組類型的驗證已經成功,而不會繼續往下執行同類型中的其他模組。但要注意的是,但如果有設定其他類型的模組,就會繼續進行驗證,並回覆最後的驗證結果。如下例設定(有兩種不同模組類型的驗證):

auth     sufficient  pam_access.so auth     sufficient  password-auth account  required   postlogin

當pam_access.so驗證成功後,就表示auth模組類型的驗證已經成功(不會再往下驗證password-auth),但會繼續驗證account模組類型內的模組(postlogin),再回覆最後驗證結果至應用程式。

optional

此組態不管回覆驗證成功或失敗,均不會影響最後的認證結果,通常是用來記錄系統紀錄(Log)使用。

模組名稱

在此設定直接執行驗證的模組程式名稱及位置。

模組參數

用來設定要傳遞給模組程式的相關參數資訊。

在簡單說明過PAM機制的運作後,接下來利用pam_exec模組實作一個遠端使用者以SSH成功登入後,即觸發某個程式或執行某個指令(例如寄送電子郵件至管理者信箱)。

什麼是pam_exec模組

pam_exec模組主要是用來驗證成功後執行自訂的外部指令或程式,因此可以將此模組設定在使用者登入成功後,即執行寄發電子郵件給管理者的指令碼。pam_exec在SSH成功登入後,會將登入相關資訊儲存在系統上的環境變數,使用者可利用讀取環境變數的方式來取得相關資訊。相關環境變數如表1所示。

介紹過pam_exec模組後,接下來實作SSH成功登入後,即寄發電子郵件至管理者的功能。

首先,撰寫如圖3所示簡單的BASH程式(名稱為notify.sh),主要功能在於儲存登入使用者、來源主機及時間等相關資訊至檔案(/tmp/rpt.txt),而後再利用寄發電子郵件的方式,將資訊寄給管理者。

圖3  BASH程式內容。

接著,即可至PAM設定檔(/etc/pam.d/sshd)加入下列設定(使用者登入成功後,就執行notify.sh),如圖4所示:

圖4  在PAM設定檔內設定,若使用者登入成功就執行notify.sh。

session optional pam_exec.so notify.sh

在設定完成後,便可測試從遠端以SSH登入,成功登入後,就會執行notify.sh,並在「/tmp/rpt.txt」儲存如圖5之相關登入資訊。

圖5  儲存相關登入資訊。

而後,即可利用這個將此檔案寄給管理者的方式來掌握SSH登入狀況。接著,示範如何利用pam_faillock模組來降低SSH被暴力攻擊的威脅。

什麼是pam_faillock模組

pam_faillock是PAM架構內建防止暴力破解(Brute-force Attack)的安全模組,提供管理者設定時間區間(例如5分鐘內),連續輸入密碼錯誤次數(例如3次),暫時封鎖時間(例如封鎖1分鐘)等組態,例如管理者可設定在5分鐘內連續輸入超過3次的錯誤帳號就封鎖該來源1分鐘,藉此來防止攻擊者的暴力破解攻擊。其所使用的組態檔為「/etc/security/faillock.conf」,常用的組態設定如表2所示。

簡單介紹pam_faillock模組之後,接著實作防止SSH暴力攻擊的設定,由於設定較為複雜,因此不建議以直接編輯PAM設定檔方式來設定。在此將使用authselect(管理驗證Authentication與帳號資訊Identity的相關設定)程式來做設定。首先安裝最新版本的authselect與pam軟體,執行以下指令:

dnf upgrade authselect pam

authselect是使用配置檔(Profiles)方式來維護相關組態設定,並提供相關預設配置檔。這裡使用名稱為sssd的預設配置檔進行設定。

可先使用「authselect list」指令來確定預設配置檔,如圖6所示。

圖6  使用「authselect list」指令確定預設配置檔。

在設定pam_faillock模組之前,須先檢查SSH組態檔(/etc/ssh/sshd_config)相關設定,確認如下設定:

UsePAM yes ChallengeResponseAuthentication yes PasswordAuthentication no

在確認SSH組態設定後,接著使用「authselect select sssd」來選擇sssd配置檔,如圖7所示。

圖7  使用「authselect select sssd」來選擇sssd配置檔。

選擇完配置檔後,使用「authselect current」檢查現有選用的設定,如圖8所示,目前尚未啟用faillock模組。

圖8  執行「authselect current」檢查現有選用的設定。

接著,利用「authselect enable-feature with-faillock」啟用faillock模組功能。啟用完畢後,最後再執行「authselect current」確認是否已啟用faillock,如圖9所示。

圖9  執行「authselect current」確認是否已啟用faillock。

在確認啟用faillock模組後,就可以設定faillock模組的組態檔(/etc/security/faillock.conf),在此設定在2分鐘內如果登入錯誤超過3次,就對該來源進行封鎖120秒,設定內容如下:

dir = /var/run/faillock audit silent deny = 3 fail_interval = 120 unlock_time = 120

設定完成後,即可利用輸入3次錯誤密碼的方式,讓pam_faillock封鎖,並可在「/var/secure」查看到相關封鎖資訊,如圖10所示。

圖10  輸入3次錯誤密碼,因而讓pam_faillock封鎖。

除此之外,可執行「faillock」指令查看相關資訊,如圖11所示:

圖11  執行「faillock」指令查看相關資訊。

faillock  #顯示被faillock封鎖的資訊

如果要解除所有封鎖,可使用「faillock –reset」指令來解除所有封鎖或使用,或者執行「faillock --user 使用者名稱 –reset」指令只解除某個使用者的封鎖。

至此,一個以PAM機制增強SSH的防護系統就完成了。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!