[轉載請註明出處] http://kezeodsnx.pixnet.net/blog
作者: kezeodsnx
引言
又是認證,使用linux,似乎比較常談到認證的問題。想了一想,其實是linux在認證方面做了比較多方便使用者的設計與機制。用windows時,開機開半天,有問題重開機,遇到藍底白字也不會抱怨,IE要密碼就敲,因為自古以來都是這樣的"理所當然"。這是否表示為使用者想的愈多,反而讓使用者困擾呢?相同的思考下,限制使用者是否比讓其選擇更能提高接受度呢?
簡介
一般的認證方式,不外乎username/password。就像Kerberos存在的價值一樣,這種方式有其缺點。現在討論的並不是安全性的問題,而是方便性的問題。想想看,有一種新的編碼方式出現了,不僅加解密快,破解要花上100000年,API完整,而且還不用錢。嗯,interesting!趕快來改code,把library掛一掛,API改一下,看看build不build的過。聽起來蠻合理的。再想像一下,如果在寫程式時,就使用某種library,叫用其API來完成認證的程序,將來不管有什麼新的認證方式,或是想改變一下認證的流程,都不用再改自己的code?只要改一下設定檔,把這個module"插入"就好。什麼!?不夠吸引人?麻煩按上一頁離開本頁面或右上角關閉離開。
PAM
這個東西就叫PAM (Pluggable Authentication Module),PAM定義了4個主要的流程:auth,account,password,session供使用者選用:
auth: 主要的密碼驗證程序。由應用程式 (samba,ftp,ssh,login)傳入使用者輸入的密碼,在此決定是否通過驗證。
account:用來檢查帳戶的屬性。如是否在deny list,是否到期之類的。
password:用來更新密碼。比如用某種演算法加密後,傳給下一個流程。
session:通常是做initialize,例如ftp,可在此為使用者掛載其擁有的目錄。
設定檔
路徑:/etc/pam.d/
格式:module-type control-flag module-path module-options
module-type:就是上述的4個流程
control-flag: 該module的重要性:
required:必要條件,沒pass就fail。但不會立刻告知應用程式,而是將剩下的module跑完。這麼做可以做一些收尾的動作,如umount。
requisite:必要條件,沒pass就fail,且立即告知應用程式,不會再執行任何module。
sufficient:充要條件,成功就pass,且不執行剩下的module。但失敗則ignore,繼續下一個module。
optional:其成功與否可被忽略,只是跑爽的。
binding:如果pass,且前面沒有任何required的module回答fail,則立刻告知應用程式,不會再執行任何module。若fail,則視同required, 繼續執行。
include:在此時間點讀入另一個設定檔。一個設定檔最多可包括32個module,當讀入另一個設定檔時,module的數量就會增加,並隨著執行完module而減少。include不會影響pass或fail。
用這個圖就很清楚了:
下圖說明PAM stack的include level:
module path: module的路徑,通常是/lib/security/
module options:傳給module的參數,可自定,但每個module都必須支援下列option:
debug:用syslog將log寫入系統的log
no_warn: 不會傳送warning message給應用程式
use_first_pass:從前一個module取得密碼,不能提示使用者輸入密碼
try_first_pass:從前一個module取得密碼,若fail才可提示使用者輸入密碼
Reference:
pam_unix--traditional password authentication
留言列表