PAM詳解(一)PAM介紹


 
目錄
一、Pam概述... 2
二、Pam框架... 2
三、Pam服務模塊... 3
四、Pam庫... 4
五、Pam配置文件(/etc/pam.conf)... 4

一、Pam概述

PAM(Pluggable Authentication Modules )是由Sun提出的一種認證機制。它通過提供一些動態鏈接庫和一套統一的API,將系統提供的服務和該服務的認證方式分開,使得系統管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序,同時也便於向系統中添加新的認證手段。

二、Pam框架

pam框架有以下四部分組成:

  1. PAM 應用程序,也稱為消費方;
  2. PAM 庫;
  3. PAM 配置文件;
  4. PAM 服務模塊,也稱為提供者;

該框架可為與驗證相關的活動提供統一的執行方式。采用該方式,應用程序開發者可使用 PAM 服務,而不必了解策略的語義。算法是集中提供的。可以獨立於各個應用程序對算法進行修改。借助 PAM,管理員可以根據特定系統的需要調整驗證過程,而不必更改任何應用程序。調整是通過 PAM 配置文件 pam.conf 來執行的。

下圖說明了 PAM 體系結構。應用程序通過 PAM 應用編程接口 (application programming interface, API) 與 PAM 庫進行通信。PAM 模塊通過 PAM 服務提供者接口 (service provider interface, SPI) 與 PAM 庫進行通信。通過這種方式,PAM 庫可使應用程序和模塊相互進行通信。

 

三、Pam服務模塊

PAM 服務模塊是一個共享庫(動態鏈接庫),用於為系統登錄應用程序(如 login、rlogin 和 telnet)提供驗證和其他安全服務。四種類型的PAM服務是:

  1. 驗證服務模塊 用於授予用戶訪問帳戶或服務的權限。提供此服務的模塊可以驗證用戶並設置用戶憑證。pam_authenticate () | pam_setcred ()
  2. 帳戶管理模塊 用於確定當前用戶的帳戶是否有效。提供此服務的模塊可以檢查口令或帳戶的失效期以及限時訪問。pam_acc_mgmt ()
  3. 會話管理模塊 用於設置和終止登錄會話。pam_open_session () | pam_close_session ()
  4. 口令管理模塊 用於強制實施口令強度規則並執行驗證令牌更新。pam_chauthok ()

一個 PAM 模塊可以實現其中的一項或多項服務。將簡單模塊用於明確定義的任務中可以增加配置靈活性。因此,應該在不同的模塊中實現PAM服務。然后,可以按照 pam.conf 文件中定義的方式根據需要使用這些服務。

每個使用PAM認證的應用程序都以pam_start開始,pam_end結束。實際做認證工作的API函數有六個(以下將這六個函數簡稱為認證API):

應用程序的<span "="">API還有很多,但是服務模塊的<span "="">API只有<span "="">6個,如下圖:

其中應用程序<span "="">API的函數原型均為

點擊(此處)折疊或打開

  1. int
  2. pam_xxx(    
  3. pam_handle_t *pamh, //傳遞給SPI的參數,對應SPI參數中的pamh
  4. int flags //傳遞給SPI的參數,對應SPI參數中的flags
  5. );

其中服務模塊<span "="">SPI的函數原型均為:

點擊(此處)折疊或打開

  1. PAM_EXTERN int
  2. pam_sm_xxx(    //本文中紅色標記處為SPI參數的來源
  3. pam_handle_t *pamh,
  4.  int flags,
  5.  int argc,
  6.  const char **argv
  7. );

 

四、Pam庫

PAM 庫 libpam 是PAM體系結構中的中心元素:

  1. libpam 可以導出 API pam。應用程序可以調用此API以執行驗證、帳戶管理、憑證建立、會話管理以及口令更改。
  2. libpam 可以導入主配置文件 pam.conf。PAM 配置文件可指定每種可用服務的PAM模塊要求。pam.conf 由系統管理員進行管理。
  3. libpam 可以導入SPI pam_sm,而導出則由服務模塊完成。

 

五、Pam配置文件(/etc/pam.conf)

    該文件是由如下的5項所組成的:
    

    1. service-name

    應用的名字,比如telnet、login、ftp等,服務名字“OTHER”代表所有沒有在該文件中明確配置的其它服務。

    2. module-type

    模塊類型有四種:auth、account、session、password,即對應PAM所支持的四種管理方式。同一個服務可以調用多個 PAM模塊進行認證,這些模塊構成一個stack。

    3. control-flag

    用來告訴PAM庫該如何處理與該服務相關的PAM模塊的成功或失敗情況。它有四種可能的 值:required,requisite,sufficient,optional。

    1) required 表示本模塊必須返回成功才能通過認證,但是如果該模塊返回失敗的話,失敗結果也不會立即通知用戶,而是要等到同一stack 中的所有模塊全部執行完畢再將失敗結果返回給應用程序。可以認為是一個必要條件。

    2) requisite 與required類似,該模塊必須返回成功才能通過認證,但是一旦該模塊返回失敗,將不再執行同一stack內的任何模塊,而是直 接將控制權返回給應用程序。是一個必要條件。注:這種只有RedHat支持,Solaris不支持。

    3) sufficient 表明本模塊返回成功已經足以通過身份認證的要求,不必再執行同一stack內的其它模塊,但是如果本模塊返回失敗的話可以 忽略。可以認為是一個充分條件。

    4) optional表明本模塊是可選的,它的成功與否一般不會對身份認證起關鍵作用,其返回值一般被忽略。

    5) Binding

    4. module-path

    用來指明本模塊對應的程序文件的路徑名,一般采用絕對路徑,如果沒有給出絕對路徑,默認該文件在目錄/usr/lib/security下 面。

    5. arguments(此處的參數傳遞給SPI,對應着SPI參數中的 argc 和 argv)

    是用來傳遞給該模塊的參數。一般來說每個模塊的參數都不相同,可以由該模塊的開發者自己定義,但是也有以下幾個共同 的參數:

    1) debug  該模塊應當用syslog( )將調試信息寫入到系統日志文件中。

    2) no_warn  表明該模塊不應把警告信息發送給應用程序。

    3) use_first_pass  表明該模塊不能提示用戶輸入密碼,而應使用前一個模塊從用戶那里得到的密碼。

    4) ry_first_pass  表明該模塊首先應當使用前一個模塊從用戶那里得到的密碼,如果該密碼驗證不通過,再提示用戶輸入新的密碼。

    5) use_mapped_pass  該模塊不能提示用戶輸入密碼,而是使用映射過的密碼。

    6) expose_account  允許該模塊顯示用戶的帳號名等信息,一般只能在安全的環境下使用,因為泄漏用戶名會對安全造成一定程度的威 脅。

    如果對於該服務的操作(如驗證或帳戶管理)/etc/pam.conf 僅包含一個模塊,則該模塊的結果將確定操作的結果。

    如果為服務操作定義了多個模塊,那么這些模塊就堆疊起來,即,對於該服務存在一個 PAM 堆棧。下圖說明如何為每種類型的控制標志記錄成敗信息
     
其實在linux系統中,/etc/pam.conf這個配置文件已經起不到什么作用了,因為它的作用完全被/etc/pam.d/中“對應”的配置文件代替了。/etc/pam.d/中“對應”的配置文件就是以/etc/pam.conf中service-name項的“值”命名的。如下圖所示:

上圖中service-name的值為myyanzheng,那么在/etc/pam.d/中就有這樣一個名字為myyanzheng的文件,其內容如下圖所示:

可以看到上圖中配置文件myyanzheng的內容只比/etc/pam.conf少了service-name一項,之所少這一項,因為該配置文件的名字就是service-name。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM