挾著優異性能及廣泛支援的優勢,使用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所示。
「應用程式層」為欲使用PAM驗證的應用程式,在本文為sshd(SSH服務的應用程式)。而使用者可在「設定層」設定應用程式欲使用的PAM驗證方式,相關設定檔置於「/etc/pam.d」目錄內,並以服務名稱來命名,例如SSH服務的設定檔名稱即為sshd,相關內容如圖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 RHOST _ | 登入來源主機名稱或IP |
| PAM USER _ | 登入的使用者名稱 |
| PAM SERVICE _ | 應用程式名稱(例如sshd、login、sudo) |
| PAM TYPE _ | 設定PAM處理不同階段的狀態,會依序處理如下不同階段的模組: ‧身分驗證(auth) ‧帳號檢查(account) ‧密碼變更(password) ‧會話管理(session) 在此階段大致可分為:open _session(此階段為使用者成功登入後,在本文即是在此階段執 行自定義之程式)、close _session(此階段為使用者登出) |
介紹過pam_exec模組後,接下來實作SSH成功登入後,即寄發電子郵件至管理者的功能。
首先,撰寫如圖3所示簡單的BASH程式(名稱為notify.sh),主要功能在於儲存登入使用者、來源主機及時間等相關資訊至檔案(/tmp/rpt.txt),而後再利用寄發電子郵件的方式,將資訊寄給管理者。

接著,即可至PAM設定檔(/etc/pam.d/sshd)加入下列設定(使用者登入成功後,就執行notify.sh),如圖4所示:
session optional pam_exec.so notify.sh
圖4 在PAM設定檔內設定,若使用者登入成功就執行notify.sh。
在設定完成後,便可測試從遠端以SSH登入,成功登入後,就會執行notify.sh,並在「/tmp/rpt.txt」儲存如圖5之相關登入資訊。
而後,即可利用這個將此檔案寄給管理者的方式來掌握SSH登入狀況。接著,示範如何利用pam_faillock模組來降低SSH被暴力攻擊的威脅。

| 組態名稱 | 說明 |
|---|---|
| dir [目錄名稱] | 設定儲存使用者登入失敗記錄的目錄位置,預設為/var/run/faillock |
| silent | 設定不顯示任何輸出訊息 |
| no log info _ _ | 設定不利用系統的Syslog機制儲存相關資訊 |
| local users only _ _ | 設定只追蹤並記錄本機使用者登入資訊,亦即不記錄利用遠端伺服器認證(例如LDAP 或AD伺服器)中的使用者相關資訊 |
| deny = 3 | 設定連續登入失敗次數的門檻值,當登入失敗超過此次數後,便會進行封鎖,此組態 須與fail _interval組態配合 |
| fail interval [秒數] _ | 設定計算連續登入失敗的時間區間,其單位為秒 |
| unlock time [秒數] _ | 當連續登入失敗次數超過所設定的門檻值時,欲封鎖該帳號的時間長度,其單位為 秒。若設定為0表示永久封鎖,如下例為若某個帳號於5分鐘內、連續登入失敗3次, 便封鎖10分鐘: deny = 3 fail _interval=300 unlock _time=600 |
| even deny root _ _ | 設定系統上的root帳號同樣也納入監控對象,若未設定此組態,將僅會監控系統內一 般使用者的登入資訊 |
| root unlock time [秒數] _ _ | 當root帳號連續登入失敗次數超過所設定的失敗次數門檻值時,欲封鎖該帳號的時間 長度,其單位為秒 |
什麼是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所示。
在設定pam_faillock模組之前,須先檢查SSH組態檔(/etc/ssh/sshd_config)相關設定,確認如下設定:
UsePAM yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
在確認SSH組態設定後,接著使用「authselect select sssd」來選擇sssd配置檔,如圖7所示。
選擇完配置檔後,使用「authselect current」檢查現有選用的設定,如圖8所示,目前尚未啟用faillock模組。


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

在確認啟用faillock模組後,就可以設定faillock模組的組態檔(/etc/security/faillock.conf),在此設定在2分鐘內如果登入錯誤超過3次,就對該來源進行封鎖120秒,設定內容如下:
dir = /var/run/faillock
audit
silent
deny = 3
fail_interval = 120
unlock_time = 120
箇中好手加入分享行列!如果您有豐富IT實戰經驗,來稿採隨到隨審制。
設定完成後,即可利用輸入3次錯誤密碼的方式,讓pam_faillock封鎖,並可在「/var/secure」查看到相關封鎖資訊,如圖10所示。

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

faillock #顯示被faillock封鎖的資訊
如果要解除所有封鎖,可使用「faillock –reset」指令來解除所有封鎖或使用,或者執行「faillock –user 使用者名稱 –reset」指令只解除某個使用者的封鎖。
至此,一個以PAM機制增強SSH的防護系統就完成了。
