Linux運維安全之PAM安全策略實施
可插拔認證模組PAM-Pluggable Authentication Modules是一套共享庫,用來對應用程式或服務的使用進行認證授權以及提供其他安全服務。起初它是由美國Sun公司為Solaris作業系統開發的,後來,很多作業系統都實現了對它的支援,Red hat 5.0後的發行版在預設基礎安裝包中都包括了PAM。
PAM的優點是它的實用性和靈活性,對於Linux伺服器上的應用程式或服務,可以根據需求實施各種安全策略,甚至可以自己編寫認證模組進行呼叫。
本期安仔課堂,ISEC實驗室的張老師為大家詳解PAM。
一、PAM的認證機制
圖1
當User訪問一個Service或者Program,應用程式需要進行認證服務,會根據自身定義認證的PAM配置檔案來呼叫PAM相關模組進行驗證,最後將驗證結果返回給應用程式,應用程式再產生相應的動作。
二、PAM的配置
PAM主要的檔案為 /usr/lib/security或 /usr/lib64/security目錄下的pam_*.so模組檔案,以及/etc/pam.d目錄下的特定應用程式的PAM配置檔案。
圖2
圖3
以passwd為例,我們看一下當執行passwd時,PAM進行了哪些處理。檢視passwd的PAM配置檔案:
圖4
PAM的配置檔案以如下空白分隔的欄位組成:
module_type control_flag module_path module_options
module_type:為服務指定模組型別。有效模組型別是 auth、account、session 或 password,給定的模組將提供對一個或多個模組型別的支援。
control_flag:為模組指定堆疊行為。受支援的控制標誌是 required、requisite、sufficient 或 optional。
module_path:指定為服務裝入的模組。
module_option:指定能夠傳送到服務模組的空格劃定的選項列表。該欄位的值取決於在 module_path 欄位中定義的模組支援的選項,此欄位是可選的。
passwd的PAM配置應用了system-auth配置:
圖5
pam_env模組將根據管理員在/etc/security/pam_env.conf中設定的內容設定環境變數,pam_faildelay模組設定了失敗delay時間為2s。
pam_fprintd模組是進行指紋驗證,由於控制標誌為sufficient,驗證失敗並不影響繼續驗證。Pam_unix nullok引數允許空密碼,try_first_pass使用先前模組的密碼進習慣驗證。
pam_succeed_if設定了當uid大於1000時,不記錄登入資訊到系統日誌中。當前面模組沒有驗證成功,最後的pam_deny模組將直接拒絕 OTHER的預設動作。關於PAM模組的詳細資訊可以通過man 模組名進行查詢:
圖6
三、PAM後門
通過在pam_unix下的pam_unix_auth.c原始碼中新增判斷條件,使得_unix_verify_password返回值為PAM_SUCCESS。這樣就可以在用系統存在的任意使用者名稱與設定的後門密碼進行登入。
首先檢視伺服器PAM的版本資訊:
圖7
安裝之前需要先安裝flex flex-deve,否則在64位系統上編譯PAM的時候會遇到yywrap()函式未定義錯誤。
圖8
下載指定版本的PAM進行修改然後編譯成so檔案,再複製到系統pam模組目錄下替換原檔案,這樣就造好後門了。
關於PAM後門的排查:
如果新增的是自定義的PAM模組,那麼只要查詢模組所屬的包就可以發現PAM後門:
圖9
對於通過修改原PAM模組,可以通過計算MD5值與原來進行diff
圖10
圖11
四、PAM實現雙因子認證
買了臺ECS/VPS,設定密碼太複雜了不方便記住也不方便輸入,用證書登入得y用證書也不方便。何不設定個弱口令外加個動態驗證碼?
雙因子可以使用Google動態令牌,也可以使用Duo Unix,Duo Unix支援App動態口令、簡訊口令以及電話。
首先需要到DUO官網註冊賬號,新建一個UNIX Application保護應用,獲得Integration key、Secret key、API hostname。
圖12
然後安裝pam_duo
圖13
安裝後修改配置檔案/etc/duo/pam_duo.conf
圖14
然後在配置檔案中新增該模組,SSH需要在配置檔案開啟USE PAM以及USE DNS
圖15
接著登入伺服器,這時會出現一個url讓你進行註冊
圖16
訪問url繫結註冊完成後再次登入時就可以選擇動態驗證碼了
圖17
五、PAM_DUO原始碼淺析
DUO_UNIX專案地址: ofollow,noindex" target="_blank">https://github.com/duosecurity/duo_unix
PAM_DUO認證中主要就是pam_sm_authenticate函式的處理,處理時首先會讀取DUO的配置檔案,之後檢測是否配置了其他config檔案,有則更新conf的值。此外,也將檢測是否配置了debug引數。
圖19
圖20
然後呼叫duo_parse_config檢查配置檔案的讀寫許可權,當返回值為-2時丟擲錯誤“config檔案應僅root可讀”,當返回值為-1時丟擲檔案不可開啟錯誤:
圖21
圖22
然後檢查是否開啟fips_mode:
圖23
呼叫pam_get_user獲取認證使用者資訊,檢查使用者密碼資訊:
圖24
對於SSH服務,關閉增量狀態資訊提示:
圖25
呼叫duo_check_groups檢查認證使用者是否是否在DUO認證的配置組中:
圖26
檢查獲取使用者/etc/passwd的GECOS資訊並進行轉換:
圖27
呼叫duo_local_ip解析本機ip地址:
圖28
這邊開始進行DUO認證過程。使用pam_duo.conf配置的ikey、skey、apihost呼叫DUO API介面,檢測API介面連線,當處理錯誤返回DUO服務錯誤:
圖29
接著呼叫duo_login進行登入,在duo_login函式中會POST一個BOSN格式的認證資訊到伺服器,當返回錯誤為NULL則認證成功。
圖30