Linux PAM IAM 身分認證 資訊安全 SSH 暴力攻擊

原生可插拔模組化PAM機制 多方式兩階段認證輕鬆切換

操演阻絕SSH暴力攻擊 示範Linux彈性登入管理

2019-09-25
使用者設定密碼,如果只為了貪圖方便好記,在面臨惡意暴力攻擊時便很容易被破解而遭到入侵,這裡將以Linux系統中SSH伺服器為例,實地說明並示範如何利用該系統內建的PAM(Pluggable Authentication Modules)機制來嚴防這一類的類惡意攻擊。

 

暴力攻擊法一向是惡意攻擊者最常用的攻擊手法,利用程式不斷地嘗試以不同的帳號及密碼來測試是否可以登入系統。此種攻擊雖然簡單卻很有用,許多使用簡單密碼的用戶常常就因此被攻陷,因此本文將以最常用Linux系統中的SSH伺服器為例,說明如何利用系統中內建的PAM機制來防止此類攻擊。

相信這是一個大家都耳熟能詳的場景,當要使用某個系統時,即須以認證程序來進行,通常都是利用輸入使用者帳號及密碼等相關資訊來進行身分認證,例如要登入Linux系統時,必須提供使用者名稱和密碼,而後認證程序才能根據使用者所給的名稱和密碼來確認是否為合法的帳號。

但除了上述的帳號密碼認證方式外,在實際的環境中,還有許多其他種類的認證方式,例如越來越盛行的兩步驟驗證。每次登入系統時,在輸入原有的密碼後,系統會再自動產生一個暫時使用的認證碼,並將此認證碼依原先設定的方式傳送給登入者。最常見的例子是使用簡訊通知,將第二階段的認證傳遞給使用者的手機,使用者接收到後,再根據所提供的資訊,進行第二階段的認證。在通過第二層的驗證後,才能順利地登入至系統上,此種驗證將可大幅地增強系統的安全性,而漸漸地被採用。

但有撰寫程式經驗的工程師都知道,如果使用傳統的撰寫方式,每一種的認證方式都必須獨立撰寫相關程式,在更換認證方式時就必須重新編譯相關的程式,也就是說,只要使用不同的認證方式,便需要重新編譯要進行認證的程序。這在實務上使用時,常會造成極大的不便。

認識PAM認證機制

Linux系統提供了一種較為彈性的PAM(Pluggable Authentication Modules,可插拔的認證模組)認證機制,讓使用者在更換認證方式時,只須以抽換模組程式的方式即可改變認證模式,而不必重新編譯相關的程序。PAM的使用架構圖,如圖1所示。

圖1  PAM使用架構圖。

其中,PAM模組程式庫就是提供相關的認證模組程式庫(通常位於「/lib64/security/」),當使用者想要更換其他的認證方式時,只要利用PAM組態檔設定相對應的認證模組即可使用。

在此以Linux系統的SSH服務為例進行說明,首先檢查sshd(SSH的服務伺服器)是否有支援PAM認證模組,可以先執行「ldd sshd」指令做檢查。如果發現該程式有連結libpam.so,就表示有支援PAM認證模組,如圖2所示。

圖2  程式若有連結libpam.so,即代表可支援PAM認證模組。

接著,繼續來看PAM的設定檔。以SSH服務為例,其設定檔位於「/etc/pam.d/sshd」,其內容如圖3所示。

圖3  找出PAM的設定檔。

在說明PAM模組之前,必須先有一個概念,PAM模組預設是以堆疊的方式執行,由上往下執行,以圖3為例,會先執行pam_sepermit.so模組,再繼續往下執行password-auth模組,依次執行至最後的設定再回覆成功或失敗給應用程式。而PAM的組態設定格式可分為下列四個欄位:

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

針對這四個欄位,相關說明如下所述:

模組類型

PAM模組依其性質可分為以下四種:

‧認證管理(auth):此類模組主要是用來針對使用者所提供的資訊(例如帳號及密碼)來驗證使用者是否為合法的使用者。

‧帳戶管理(account):相對於認證管理,帳戶管理主要是針對認證以外的帳戶事項管理,例如驗證帳戶是否還是有效的,或限定帳戶可存取的時間,或者限定可存取帳戶資訊的來源端。

‧密碼管理(password):管理密碼相關的事項,例如可以設定密碼的複雜度,可排除使用者設定太過簡易密碼的風險。

‧會話管理(session):主要是在管理使用者存取系統或網路服務的相關事項,例如與服務資料交換時的相關資訊。

控制組態

此組態主要是控制PAM模組的執行狀況,常用的組態如下所述:

required

當使用此組態時,表示在執行的過程中,如果有一個模組已判定失敗,並不會馬上回覆失敗,而是繼續往下執行其他相同模組類型的模組,在執行完成後,才會回覆失敗訊息給應用程式。

或許這樣的方式,從直覺的角度來看是有點奇怪。既然已經判定失敗,為何還要浪費系統資源,繼續往下驗證。

然而,從系統安全的角度來看,這卻是一種聰明的方式。因為如果一旦發現失敗就立即回覆的話,那麼有心的攻擊者便能很清楚地知道是那個模組所回覆的,這樣他就可以更聚焦地攻擊該模組的漏洞,但若全部執行完,攻擊者即無從判斷資訊是那個模組所回覆的,如此即可有效地提升系統的安全。

而如果某個模組判定為成功,將繼續往下執行驗證。需要所有的模組都回覆才算驗證成功,並回覆成功的訊息給應用程式。

requisite

當使用此組態的模組回傳失敗時,便不再繼續往下驗證其他模組,並回覆失敗訊息給應用程式。

就如同required組態一樣,如果傳回成功,還是會繼續往下執行其他的模組,必須所有模組都判定成功,才會回覆成功的訊息給應用程式。

sufficient

以相同的模組類型而言,如果有個模組判定為成功,就表示以此模組類型的驗證已成功,而不會繼續往下執行其他的模組。

但如果有設定其他種類的模組類型,也必須驗證成功,才會回覆成功的訊息給應用程式。反之,如果其他的模組類型驗證判定為失敗,依然是回覆失敗訊息給應用程式。如下例所示,其中有兩種不同模組類型的驗證:

auth     sufficient    pam_sepermit.so auth    

sufficient    password-auth

account  required     postlogin

如果pam_sepermit.so判定成功,就表示auth模組類型的驗證已成功(不必再往下驗證password-auth),但要確認account模組類型也是回覆成功,才會回覆成功的訊息給應用程式。

optional

此組態基本上只是用來記錄Log的用途,不管回覆成功或失敗,都不會影響最後的認證結果。

include

用來包括其他的設定檔,當設定檔內有requisite的設定時,如果判定失敗,即會直接回覆失敗給應用程式。

substack

類似include,用來包括其他的設定檔,但最大的不同在於設定檔內有requisite的設定時,如果判定失敗,並不會直接回覆失敗給應用程式。

模組路徑

所謂的模組路徑,亦即設定模組程式的位置。

模組參數

模組參數的用途是,設定要傳遞給模組的相關參數資訊。

在簡單說明PAM機制的運作說明後,接下來就使用其內建的pam_tally2模組來阻擋SSH的暴力攻擊。

善用pam_tally2模組

在預設的情況下,系統允許使用者可不限次數進行登入(在此以SSH登入為例),也因此暴力攻擊成為惡意攻擊者最常用的攻擊手法,利用程式不斷地以不同的帳號和密碼資訊來嘗試登入系統。

為了因應此類的攻擊,一般都會設定一些門檻值,例如在5分鐘內登入失敗超過5次便封鎖該帳號,但此類的做法過於矯枉過正。因為有心人士會利用故意輸入錯誤的密碼的方式,讓合法使用者被封鎖。

因此,可以使用其他較為折衷的方式,同樣利用門檻值的方式,一旦符合所設定的門檻值時,即會暫時拒絕該來源的登入要求。例如,設定當登入失敗超過5次時便封鎖該來源10分鐘,也就是需要10分鐘後,該來源才可再連線登入,而pam_tally2模組(系統預設即有此模組)便是提供此類功能的模組。

pam_tally2除了提供模組程式外,也提供一支名稱為「pam_tally2」的應用程式,此應用程式主要是用來管理使用者登入失敗的相關資訊。可利用這個程式來查看某個使用者登入失敗的次數,例如要查看root使用者登入失敗的次數,就執行「pam_tally2 -u root」;若查看或要重設某個使用者登入失敗的次數,則使用「pam_tally2 -u root -r」來重設root使用者登入失敗的次數(將其失敗次數歸零)。除此之外,pam_tally2同樣提供一個模組程式(名稱為pam_tally2.so)讓使用者阻擋來自攻擊者的暴力攻擊。

了解pam_tally2.so模組程式

pam_tally2模組提供了下列常用的模組參數給使用者設定,相關說明如下:

file

記錄pam_tally2模組執行時所產生的紀錄,可以從這個檔案之中取得運作時的相關資訊。

deny

設定允許使用者登入失敗的次數,一旦登入失敗次數超過此數值(即門檻值),便暫時封鎖該來源。

unlock_time

當登入失敗次數超過所設定的門檻值時,就進行封鎖的時間(單位為秒)。該使用者須等到封鎖時限過後,才可再登入。

even_deny_root

even_deny_root表示所設定的規則,即使是root使用者也適用。

實際演練

在簡單說明過pam_tally2模組的用法後,將測試以root使用者登入SSH伺服器為例,設定登入錯誤超過3次就暫時將該使用者封鎖5分鐘。首先,在「/etc/pam.d/sshd」新增如圖4的組態。

圖4  在「/etc/pam.d/sshd」新增組態。

接著以root使用者的身分,故意嘗試登入錯誤超過三次。接著,再查看系統上的紀錄檔(/var/log/secure),即可發現如圖5中的資訊,告知該使用者已暫時被封鎖5分鐘。

圖5  已暫時被封鎖5分鐘。

此時,該使用者僅能等待5分鐘後,才能夠正常地再登入,這代表pam_tally2模組成功地發揮了預期的安全把關機制。

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


 


追蹤我們Featrue us

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

我知道了!