[轉載請註明出處] 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.run_stack1.gif

下圖說明PAM stack的include level:

pam.run_stack2.gif

 

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:

Using PAM

 

PAM 實作

 

pam_unix--traditional password authentication

 

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()