Linux-PAM系統管理指南(轉)

post0發表於2007-08-11
Linux-PAM系統管理指南(轉)[@more@]

摘要

  Linux-PAM是一組共享庫,使用這些模組,系統管理者可以自由選擇應用程式使用的驗證機制。也就是說,勿需重新編譯應用程式就可以切換應用程式使用的驗證機制。甚至,不必觸動應用程式就可以完全升級系統使用的驗證機制。(2002-07-09 13:08:42)

--------------------------------------------------------------------------------

By 書生, 出處:Morgan, Andrew G.

1.簡介

  Linux-PAM(Pluggable Authentication Modules for Linux.基於Linux的插入式驗證模組)是一組共享庫,使用這些模組,系統管理者可以自由選擇應用程式使用的驗證機制。也就是說,勿需重新編譯應用程式就可以切換應用程式使用的驗證機制。甚至,不必觸動應用程式就可以完全升級系統使用的驗證機制。

  在歷史上,需要對使用者進行驗證的應用程式,必須同某種驗證機制編譯到一起。例如,傳統的UN*X系統是使用密碼對使用者進行校驗的。使用者輸入的密碼經過crypt加密後,然後和/etc/passwd檔案中的密文進行比較。在這種系統中,如果優先權的識別不是基於這種方式,就需要透過使用者識別符和使用者組識別符對優先權進行驗證。服務和應用程式可以使用基於使用者和使用者組識別的驗證方式。通常,使用者組的分配是透過/etc/group檔案。

  不幸的是,隨著計算機速度的加快和網路的大範圍普及,使用這種驗證方式越來越不安全了。因此,人們開發了許多新的驗證方法。

  Linux-PAM工程的目的就是分離應用軟體和驗證機制的開發。透過驗證函式庫可以實現上述目的。PAM庫由本地的系統配置檔案 /etc/pam.conf或者/etc/pam.d/目錄下的一些配置檔案來設定。而模組以動態可載入目標檔案(使用dloptn(3)函式開啟)的形式儲存在/usr/lib/security目錄中。

2.關於本文的一些說明

  在開始閱讀本文時,你應該清楚本文假定特定的檔案是在特定的目錄中。我們遵照RFC-86的約定。有些Linux釋出把這些檔案放在不同的位置,因此如果你的系統是象RedHat之類的釋出,那麼你應該謹慎使用本文提供的例子。

  例如,本文假設PAM可載入目標檔案(模組)是在/usr/lib/security/目錄下,而在RedHat Linux系統中它們被放在了/lib/security目錄下。因此,使用本文的例子時應該注意進行必要的轉換。

3.綜述

  我們從一個例子開始討論。首先找一個能夠為使用者提供服務的應用程式,login就是一個這樣的程式。login要做兩件事,首先查詢使用者,然後為使用者提供所需服務,例如提供一個shell程式。

  通常,login會提示使用者輸入密碼。然後對密碼進行校驗,這項任務就是Linux-PAM完成的。

  從程式設計師的角度看,Linux-PAM的任務就是校驗使用者的合法性。

  Linux-PAM具有很大的靈活性,系統管理者可以透過它自由選擇使用的驗證方式。你也可以自由選擇應用程式使用的驗證方式。Linux-PAM能夠提供的驗證方式多種多樣,從絕對信任(pam_permit)到視網膜掃描、音訊分析以及一次性口令,不一而足。

  為了描述Linux-PAM的靈活性,我們可以假想一種情況:一個系統管理者(父母)希望提高使用者(他們的子女)的數學能力。他/她就可以透過一個孩子們非常喜歡的遊戲“Shoot 'em up game”達成上述目的,當然前提是這個遊戲能夠使用PAM提供的驗證機制。驗證可以設定:每次孩子們要玩遊戲時,都需要回答出一組小於12的隨機數的乘積。這樣孩子們每次玩遊戲之前都可以練習乘法運算。隨著他們的成長,可以增加數字的大小。

  Linux-PAM處理四種型別的任務:驗證管理(auth)、帳戶管理(account)、會話管理(session)和口令管理(password)。應用程式使用的管理方式透過相關的Linux-PAM配置檔案設定。管理功能是有配置檔案指定的模組完成的。

  應用程式X,它透過一些介面呼叫Linux-PAM庫,而自己並不知道使用的驗證方法。Linux-PAM庫讀出PAM配置檔案的內容,根據配置檔案載入程式X需要的模組。這些模組進入某個管理組並且按照配置檔案設定的順序層疊在一起。它們為應用程式執行各種驗證任務。應用程式和使用者之間透過 conversation函式實現資訊交換。

3.1 入門

  下面是Seth Chaiklin說的一段話:

從這一點來看,PAM應該工作在理想世界中,在這裡所有的應用程式都沒有錯誤。然而,事實遠非如此。因此,如果你要使用PAM,需要考慮一些實際的問題。

如果你把Linux用作一個單使用者系統,或者系統中的使用者是相互信任的,那使用PAM沒有多大意思。

  你可以在沒有重要東西的系統上取消PAM,這實際上可以帶來一些方便。使系統象Win95。

  在網路環境下,就需要考慮使用者驗證的問題了。

  如果你使用Linux作為一個伺服器,用它來提供一些不同的服務,這時PAM就體現了它的價值。一般情況下,透過使用不同的模組,程式可以搜尋各種密碼資料庫,而程式本身勿需改寫。下面是一些例子:

apache有一個模組能夠提供PAM服務。因此,對於特定目錄的驗證可以透過PAM完成,這意味著大量現有的PAM模組可以用來進行驗證工作,包括RADIUS、NIS、NCP。

pppd有一個使用PAM驗證的版本(來自RedHat)。

  我可以把PAM由於任何需要驗證的程式嗎?

  可以說能也可以說不能。能,是指如果你能夠修改原始碼,就可以加入PAM驗證功能;不能是指如果你無法修改原始碼,那麼在二進位制可執行檔案匯中是無法加入PAM驗證功能的。

  我怎樣才能區分程式是否使用了PAM驗證?

使用ldd命令,如果這個程式的使用的動態連線庫沒有libpam和libpam_misc,那它肯定不使用PAM驗證。然而,還有可能已經包含這兩個庫了,但是因為某些問題,程式無法正常工作。因此需要更好的方法來測試。

對於需要使用PAM的程式,需要在/etc/pam.d目錄中為其設定配置檔案。配置檔案的名字被編寫程式序原始碼中,通常和程式的名字是一樣的,但不總是這樣。例如:有個程式叫作pamprog,它的PAM配置檔案是/etc/pam.d/pamprog。在配置檔案中,只有下面兩行: auth required pam_permit.so

auth required pam_warn.so

  現在對其進行測試。第一行,表示所有的使用者都允許透過;第二行表示想syslog中寫入一條警告資訊。如果測試成功,就表示程式能夠使用PAM進行驗證。然後你可以在配置檔案中加入更為複雜的驗證功能。

4.Linux-PAM配置檔案

  Linux-PAM的目標就是為系統管理者提供最大限度的靈活性。系統管理者可以透過兩種形式對Linux-PAM進行配置:單一配置檔案/etc/pam.conf;或者是/etc/pam.d/目錄。這一節我們將討論其配置檔案的語法。

4.1 配置檔案的語法

  讀者首先應該明白Linux-PAM的記號是大小寫敏感的。有兩個特殊的符號:#和。配置檔案中的註釋以#開頭,一般配置檔案中每行是一個入口(除了註釋),但是如果某個入口的定義很長,可以透過使用轉義符回行,而下一行也被看作是這個入口的一部分。

  一般/etc/pam.conf檔案每行都是這種格式:

  service-name module-type control-flag module-path arguments

  下面我們將對每個記號進行解釋。除了這種方式之外,還可以使用/etc/pam.d/目錄對Linux-PAM進行配置,稍後我們將對這種方式進行講述。

service-name

為這個入口分配的服務名。通常這是給定應用程式的會話名。例如:ftpd、rlogind、su等等。

Linux-PAM還為預設的驗證機制保留一個特殊的服務名,就是OTHER,大小寫均可。注意,如果某個模組指定了以命名的服務,那OTHER就被忽略。

modle-type

Linux-PAM當前有四種型別的模組:

auth

這種型別的模組為使用者驗證提供兩方面的服務。

讓應用程式提示使用者輸入密碼或者其它的標記,確認使用者的合法性;

透過它的憑證許可許可權,設定組成員關係(不同於上面討論的/etc/groups檔案)或者其它優先權。

account

這類模組執行基於非驗證的帳戶管理。它主要用來限制/允許使用者對某個服務的訪問時間,當前有效的系統資源(最多可以有多少個使用者),限制使用者的位置(例如:root使用者只能從控制檯登入)。

session

這類模組的主要用途是處理為使用者提供服務之前/後需要做的一些事情,包括:記錄開啟/關閉交換資料的資訊,監視目錄等。

password

用來升級使用者驗證標記。

control-flag

控制標誌用來設定驗證成功或者失敗後PAM需要作出的反應。因為模組可以層疊(stacked,同樣型別的模組依次執行),控制標誌可以決定每個模組的重要性。應用程式不會意識到單個模組成功或者失敗,它只會收到Linux-PAM庫成功或者失敗的綜合反應資訊。層疊模組的執行順序取決於/etc/pam.conf檔案的入口順序,入口列前的模組先執行。從Linux-PAM 6.0開始可以使用兩種語法定義控制標誌。

簡單的一種是使用單一關鍵詞定義控制標誌。有四個這樣的關鍵詞:required、requisite、sufficient和optional。

Linux-PAM透過如下方式解釋這些關鍵詞:

required

表示即使某個模組對使用者的驗證失敗,也要等所有的模組都執行完畢之後,PAM才返回錯誤資訊。這樣做是為了不讓使用者知道被哪個模組拒絕。如果對使用者驗證成功,所有的模組都會返回成功資訊。

requisite

如果特定的模組對使用者的驗證失敗,PAM馬上返回一個錯誤資訊,把控制權交回應用程式,不再執行其它模組進行驗證。

sufficient

表示如果一個使用者透過這個模組的驗證,PAM結構就立刻返回驗證成功資訊,把控制權交會應用程式。後面的層疊模組即使使用requisite或者required控制標誌,也不再執行。如果驗證失敗sufficient的作用和optional相同。

optional

表示即使本行指定的模組驗證失敗,也允許使用者享受應用程式提供的服務。使用這個標誌,PAM框架會忽略這這個模組產生的驗證錯誤,繼續順序執行下一個層疊模組。

還有一種比較複雜的語法來設定控制標誌,它由一組value=action形式的標記組成,標記之間以空格分開:

[value1=action1 value2=action2 ...]

valueN可以是下列Linux-PAM庫的返回值:success、open_err、symbol_err、service_err、 system_err、buf_err、perm_denied、auth_err、cred_insufficient、 authinfo_unavail、user_unknown、maxtries、new_authtok_reqd、acct_expired、 session_err、cred_unavail、cred_expired、cred_err、no_module_data、conv_err、 authtok_err、authtok_recover_err、authtok_lock_busy、authtok_disable_aging、 try_again、ignore、abort、authtok_expired、module_unknown、bad_item和default。最後一個(default)能夠用來設定上面的返回值無法表達的行為。

actionN可以是一個非負整數或者是下面的記號之一:ignore、ok、done、bad、die和reset。如果是非負整數J,就表示需要忽略後面J個同樣型別的模組。透過這種方式,系統管理者可以更加靈活地設定層疊模組,模組的層疊路徑由單個模組的反應決定。

ignore

如果使用層疊模組,那麼這個模組的返回值將被忽略,不會被應用程式知道。

bad

它表示這個返回碼應該被看作是模組驗證失敗。如果這個模組是層疊模組的第一個驗證失敗的模組,那麼它的狀態值就是整個層疊模組的狀態值。

die

終止層疊模組驗證過程,立刻返回到應用程式。

ok

告訴PAM這個模組的返回值直接作為所有層疊模組的返回值。也就是說,如果這個模組前面的模組返回狀態是PAM_SUCCESS,那這個返回值就會覆蓋前面的返回狀態。注意:如果前面的模組的返回狀態表示模組驗證失敗,那麼不能使用這個返回值覆蓋。

done

終止後續層疊模組的驗證,把控制權立刻交回應用程式。

reset

清除所有層疊模組的返回狀態,從下一個層疊模組重新開始。

module-path

PAM驗證模組的路徑。如果以/開頭,就表示是完整的路徑;如果不是以/打頭,就表示是相對於/usr/lib/security的相對路徑。

args

傳遞給模組的引數。類似於通常的Linux Shell命令列引數。有效的引數包括一些通用引數和特定於給定模組的引數。無效的引數將被忽略,並會把錯誤資訊記錄到syslog。

  注意:配置檔案中的任何一行錯誤都會導致驗證失敗,同時相關錯誤資訊被記錄到syslog。

4.2 基於目錄的配置形式

  從Linux-PAM 5.6版開始引入了一種基於目錄的配置方式,透過/etc/pam.d/目錄下的檔案對PAM進行配置。這種方式比單一的配置檔案具有更大的靈活性。這個目錄下的所有配置檔案都以某個服務名命名(小寫)。

  不過,這兩種配置方式不能同時起作用,也就是說,你只能使用其中一種對Linux-PAM進行配置。一般/etc/pam.d/優先。

  /etc/pam.d/目錄下的配置檔案的語法和/etc/pam.conf檔案的語法相似,形式如下:

  module-type control-flag module-path arguments

  和/etc/pam.conf檔案語法的唯一不同就是沒有服務名(service-name),服務名由檔名設定。例如:/etc/pam.d/login檔案儲存對login服務的設定。

  這種配置方式與單一配置檔案相比,具有很大的優越性:

減少了配置錯誤的機率。

更易於維護。

可以透過使用不同配置檔案的符號連線決定系統的驗證策略。

可以加快對於配置檔案的解析。

可以對單個的Linux-PAM配置檔案設定不同的存取許可權。

更易於軟體包的管理。

4.3 通用引數

  下面是一些通用引數,可以被所有的模組解析:

debug

透過syslog系統呼叫記錄除錯資訊。

nowarn

使模組不要嚮應用程式輸出警告資訊。

use_first_pass

使模組不提示使用者輸入密碼,而是使用為前一個驗證模組輸入的密碼。如果無效,則驗證失敗。這個引數只能用於auth和password型別模組。

try_first_pass

首先使用使用者為上一個模組輸入的密碼進行驗證,如果不行,就提示使用者輸入密碼,這個引數只能用於auth型別的模組。

use_mapped_pass

這個引數目前還不能被任何Linux-PAM模組支援,主要因為美國加密演算法的出口限制。

expost_account

通常,對於模組來說洩露使用者的某些資訊並非一個安全的策略。有時候使用者名稱、起始目錄或者使用者使用的shell等資訊都可以被攻擊者用來攻擊一個使用者帳戶。這個引數是一個適用於每個模組的標準引數,它可以使模組儘量少地洩露使用者資訊。

4.4 配置檔案入口示例

  在這一節,我們將給出一些例子,以便於理解。

4.4.1 預設策略

  一個合理的OTHER入口對於加強系統安全非常重要。下面是一個非常偏執的例子。

  # 預設; 拒絕訪問

  #

  OTHER auth required /usr/lib/security/pam_deny.so

  OTHER account required /usr/lib/security/pam_deny.so

  OTHER password required /usr/lib/security/pam_deny.so

  OTHER session required /usr/lib/security/pam_deny.so

  毫無疑問,這是最安全的OTHER策略了,但是不太合理。例如:如果這個檔案的其它部分編寫不好,那麼很容易把所有的使用者擋在門外。

  pam_deny模組在執行時不記錄任何資訊,除非使用者在無法執行某個服務程式時能夠與系統管理人員聯絡,否則系統管理者很長時間不會知道系統配置錯誤。

  在上面例子的前面加入以下幾行,系統管理者就可以獲得有關的警告資訊了:

  # 如果程式配置錯誤

  #

  OTHER auth required /usr/lib/security/pam_warn.so

  OTHER password required /usr/lib/security/pam_warn.so

  這樣有兩行是auth模組型別,形成模組層疊。

  在一個使用/etc/pam.d/配置的系統中,預設配置檔案如下:

  # default configuration: /etc/pam.d/other

  #

  auth required /usr/lib/security/pam_warn.so

  auth required /usr/lib/security/pam_deny.so

  account required /usr/lib/security/pam_deny.so

  password required /usr/lib/security/pam_warn.so

  password required /usr/lib/security/pam_deny.so

  session required /usr/lib/security/pam_deny.so

  對於不熟悉Linux-PAM的系統管理者,下列幾行可以作為最基本的系統配置:

  # default; standard UNIX access

  #

  OTHER auth required /usr/lib/security/pam_unix_auth.so

  OTHER account required /usr/lib/security/pam_unix_acct.so

  OTHER password required /usr/lib/security/pam_unix_passwd.so

  OTHER session required /usr/lib/security/pam_unix_session.so

  通常這足以為大多數應用程式提供驗證服務了。但是,大多數並不表示全部。如果你需要開啟FTP匿名登入功能,就無法滿足要求了。

  為了開啟匿名FTP,需要使用以下的配置命令代替預設的配置(OTHER):

  # ftpd; add ftp-specifics. These lines enable anonymous ftp over

  # standard UNIX access (the listfile entry blocks access to

  # users listed in /etc/ftpusers)

  #

  ftpd auth sufficient /usr/lib/security/pam_ftp.so

  ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass

  ftpd auth required /usr/lib/security/pam_listfile.so

  onerr=succeed item=user sense=deny file=/etc/ftpusers

  由於需要忽略預設的配置入口,所以第二行是必須要有的。這還是一個層疊模組的例子。使用sufficient控制標誌,表示如果這個模組驗證透過,就不必使用後面的層疊模組進行驗證了;use_first_pass表示使用為前面的模組(pam_ftp)輸入的密碼。

5.Linux-PAM的安全問題

  這一章我們將討論如何安全使用Linux-PAM。

5.1 如果出現錯誤

  如果發生錯誤,Linux-PAM可能會改變系統的安全性。這取決於你自己的選擇,你可以選擇不安全(開放系統)和絕對安全(拒絕任何訪問)。通常,Linux-PAM在發生錯誤時,傾向於後者。任何的配置錯誤都可能導致系統整個或者部分無法訪問。

  能夠遇到最大的問題可能就是Linux-PAM的配置檔案(/etc/pam.d/*或者/etc/pam.conf)被刪除了。如果發生這種事情,你的系統就會被鎖住。

  不過,還是有辦法進行恢復的。最好的方法就是重新啟動系統進入單使用者模式,然後進行正確地設定。下面是David Wood在郵件中提出的解決步驟:

首先,以單使用者模式啟動系統,出現LILO boot:時輸入: LILO boot:linux single >——此處假設使用的核心標籤是linux,可以按TAB鍵列出可用的核心

這樣你不用登入就可以進入系統了。

如果這個辦法不行,你還可以使用急救盤啟動系統。

假設你的PAM系統只是配置檔案被破壞,先按照如下步驟進行處理: cd /etc

mv pam.conf pam.conf.orig

mv pam.d pam.d.orig

mkdir pam.d

cd pam.d

接著,使用編輯程式編輯/etc/pam.d/other檔案,它應該包括以下四行:

auth required pam_unix_auth.so

account required pam_unix_acct.so

password required pam_unix_passwd.so

session required pam_unix_session.so

然後,你就可以登入了。如果還是不行,那有可能是因為輸入錯誤或者更嚴重的問題。如果是輸入錯誤,會在日誌檔案中留下記錄,可以使用tail /var/log/messages檢視。

現在,你已經重新登入到系統了。下面的工作就是重新安裝Linux-PAM和其它軟體(假設是RedHat系統),使用如下命令重新安裝PAM軟體包: rpm -Uvh --force pam-*

  然後,需要安裝(重新安裝)libc庫、util-linux、wuftp、NetKit等受影響的軟體包。如果使用X系統,也需要重新安裝。

5.2 不要使用脆弱的other檔案

  如果系統預設配置檔案other的配置比較脆弱,系統很可能受到攻擊的威脅。

  這是一個示例配置,pam_deny模組將拒絕所有的訪問,而pam_warn模組將向auth.notice日誌裝置傳送一條警告資訊:

  # The PAM configuration file for the `other' service

  #

  auth required pam_deny.so

  auth required pam_warn.so

  account required pam_deny.so

  account required pam_warn.so

  password required pam_deny.so

  password required pam_warn.so

  session required pam_deny.so

  session required pam_warn.so

6.模組使用參考

  這一章我們將一塊介紹Linux-PAM模組的用法

6.1 access模組

6.1.1 概要

模組名

pam_access

作者

Alexei Nogin

維護者

作者

提供的管理組功能

account

系統依賴性

需要一個配置檔案。預設情況下,使用/etc/security/access.conf作為配置檔案,也可以指定別的檔案。

網路支援

透過PAM_TTY變數獲得終端名,如果這個變數沒有設定,就透過ttyname()函式獲得標準輸入檔案描述符的終端名。還可以使用gethostname(),yp_get_default_domain(), gethostbyname()函式獲得主機名、域名等資訊,作為每個配置行的第三項。

6.1.2 綜述

  提供一種日誌監控風格的登入訪問控制機制

6.1.3 account元件

能夠識別的引數

accessfile=/path/to/file.conf

描述

這個模組提供一種日誌監控風格的登入訪問控制機制,這種機制是基於登入名、主機名、域名、internet地址、網路地址或者終端名的。A. Nogin把logdaemon-5.6(作者:Wietse Venema's)中的login_access.c檔案做了許多改動,用到了這個模組中。

這個模組的行為可以使用如下引數進行修正:

accessfile=/path/to/file.conf 使用別的配置檔案代替預設的配置檔案/etc/security/access.conf。

示例和建議

例如:在一個NIS伺服器或者一個郵件伺服器上,有很多使用者,但是你不想讓這些使用者具有登入(login)能力。這時,建議你使用這個模組。

如果你的模組放在/lib/security目錄,而且使用/etc/pam.d/風格的配置,可以在/etc/pam.d/login、 /etc/pam.d/rlogin、/etc/pam.d/rsh和/etc/pam.d/ftp檔案中加入下面一行,來啟動這個模組:

account required /lib/security/pam_access.so

注意:除非你的系統可以忽略.rhosts檔案的作用,否則這個模組無法發揮作用。其中細節請參考對pam_rhost_auth模組的介紹。

此外,在軟體的釋出中有一個示例access.conf配置檔案。

6.2 chroot模組

6.2.1 概要

模組名

pam_chrooot

作者

Bruce Campbell

維護者

作者

提供的管理組功能

account、session、authentication

網路支援

本地主機

6.2.2 綜述

  這個模組為普通使用者提供一個假的檔案系統,例如:在他們看來的/目錄實際上是/some/where/else。

  如果系統中有幾類使用者,而你對安全問題又十分重視,就可以使用這個模組。它可以對使用者能夠看到的系統資訊和能夠執行的程式進行限制。

6.2.3 account元件

  原著尚未完成

6.2.4 session元件

  同上

能夠識別的引數

可以使用PAM的通用引數和日誌級別作為其引數。

示例和建議

提供合理的程式,例如只提供cat、ls、rm、cp和ed等。

不要濫用這個模組,例如:你可以為每個使用者安裝一個隔離的環境,但是這樣非常浪費磁碟空間。

6.3 密碼強度檢查模組

6.3.1 概要

模組名

pam_cracklib

作者

Cristian Gafton

維護者

作者

提供的管理組功能

password

系統依賴性

需要libcrack庫和字典/usr/lib/cracklib.dict。

6.3.2 綜述

  這個模組可以插入到實現password管理組功能的層疊模組中,為給定的程式提供密碼強度檢查。

  這個模組以如下方式工作:首先呼叫cracklib例程檢查密碼強度,如果密碼不易破譯,就進行下面的強度檢查:

新密碼是否舊密碼的迴文。

新密碼是否只是就密碼改變了大小寫

和舊密碼是否相似。主要由difok引數控制,如果新舊密碼之間不同的字元數目大於或等於這個引數就接受新的密碼,這個引數的預設值是10或者新密碼的1/2。為了避免對一個很長、很複雜的密碼進行查詢,還可以使用 difignore引數。這個引數可以指定一個值,如果新的密碼長度超過這個值,就不必進行這種檢查,預設值是23。

是否新密碼太短。由5個引數控制:minlen、dcredit、ucredit、lcredit和ocredit。在此就不一一介紹了。

新密碼是否是舊密碼的迴環

這個密碼以前是否用過。過去用過的密碼可以在/etc/security/opasswd檔案中找到。

  對於標準的UNIX密碼加密演算法,即使沒有引數,這個模組也會工作得很好。但是,對於MD5加密演算法,密碼可以超過8個字元,使用預設的設定將使使用者很難找到滿意的密碼。MD5演算法的預設設定要求新密碼中和舊密碼相同的字元不能超過1/2,而且是強制的。例如:舊的密碼是"the quick brown fox jumped over the lazy dog",那這個密碼是很難被替換的:)。除此之外,MD5演算法的預設設定還允許密碼長度小於5個字元。因此,對於MD5系統需要對配置做一些調整,提高字元數的底限,減小對不同字元的比例限制。

6.3.3 password元件

能夠識別的引數

debug、type=XXX、retry=N、difok=N、minlen=N、dcredit=N、ucredit=N、lcredit=N、ocredit=N、use_authtok

描述

這個模組提示使用者輸入一個密碼,然後根據一個系統字典和一組規則檢查它的強度。

預設情況下,它首先提示使用者輸入一個密碼,如果認為強度足夠,就提示使用者重新輸入一遍,以保證密碼輸入正確。完成這些動作後,就把這個密碼產地給subsequent模組,由subsequent模組安裝新的驗證記號(也就是密碼)。

這個模組的動作可以透過一些引數改變:

debug

把模組詳細的行為資訊寫到syslog,但不包括密碼資訊。

type=xxx

修改提示資訊。預設的提示資訊是:"New UNIX password:"和"Retype UNIX password"。設定這個選項可以使xxx代替UNIX。

retry=N

改變輸入密碼的次數,預設值是1。就是說,如果使用者輸入的密碼強度不夠就退出。可以使用這個選項設定輸入的次數,以免一切都從頭再來。

difok=N

預設值為10。這個引數設定允許的新、舊密碼相同字元的個數。不過,如果新密碼中1/2的字元和舊密碼不同,則新密碼被接受。

minlen=N

密碼字元個數下限加一。除了限制新密碼字元的個數之外,還有一些引數可以限制每種字元(other、upper、lower和digit)的個數。minlen的預設值是9,這個值對於舊風格的UNIX密碼是非常合適的,但是對於MD5系統卻並不是很安全。

ucredit=N

限制新密碼中最多有多少個大寫字元。

lcredit=N

限制新密碼中最多有多少個小寫字元。

ocredit=N

限制新密碼中最多有多少個其它的字元。

use_authok

不讓模組執行提示使用者輸入密碼的動作,使用前面層疊的password模組提供的密碼。

示例和建議

下面我們舉一個例子,看一下這個模組是如何與pam_pwdb的password元件實現層疊的:

# These lines stack two password type modules. In this example the

# user is given 3 opportunities to enter a strong password. The

# "use_authtok" argument ensures that the pam_pwdb module does not

# prompt for a password, but instead uses the one provided by

# pam_cracklib.

#

passwd password required pam_cracklib.so retry=3

passwd password required pam_pwdb.so use_authtok

下面是一個使用MD5加密演算法的例子:

#

# These lines allow a md5 systems to support passwords of at least 14

# bytes with extra credit of 2 for digits and 2 for others the new

# password must have at least three bytes that are not present in the

# old password

#

password required pam_cracklib.so

difok=3 minlen=15 dcredit= 2 ocredit=2

password required pam_pwdb.so use_authtok nullok md5

6.4 拒絕模組

6.4.1 概要

模組名

pam_deny

作者

Andrew G. Morgan

維護者

當前Linux-PAM的維護者。

提供的管理組功能

account、authentication、password、session

clean code base

clean

6.4.2 綜述

  這個模組能夠用來拒絕任何訪問。它是嚮應用程式反饋驗證失敗的資訊。這個模組比較適合於other檔案。

6.4.3 帳戶元件

描述

這個元件只是返回一個失敗資訊。失敗的型別是PAM_ACCT_EXPIRED。

示例和建議

應用程式是透過引用Linux-PAM的帳戶管理函式pam_acct_mgmt(),讓使用者獲得系統的訪問權。但是,如果把這個模組和account型別的模組層疊,使用者將不能透過應用程式獲得系統訪問權。

下面的配置行將使任何使用者都無法登入:

# add this line to your other login entries to disable all accounts

#

login account required pam_deny.so

6.4.4 驗證元件

描述

這個元件只是返回失敗資訊,錯誤型別取決於應用程式呼叫的函式。如果應用程式試圖呼叫pam_authenticate()函式驗證使用者,則失敗型別是PAM_AUTH_ERR;如果應用程式呼叫pam_setcred()函式,以建立和設定使用者的驗證憑證,則失敗型別是 PAM_CRED_UNAVAIL。

示例和建議

如果想使應用程式拒絕為使用者提供服務,可以在配置檔案中加入以下配置行:

# add this line to your existing OTHER entries to prevent

# authentication succeeding with default applications.

#

OTHER auth required pam_deny.so

6.4.5 密碼元件

描述

這個元件能夠拒絕使用者修改密碼。如果收到修改密碼的企圖,它將返回PAM_AUTHOK_ERR型別的失敗資訊。

示例和建議

這個元件用於阻止應用程式改變使用者的密碼。例如,為了阻止login在舊密碼失效時,自動提示使用者輸入新的密碼,你可以在配置檔案中加入以下配置行:

# add this line to your other login entries to prevent the login

# application from being able to change the user's password.

#

login password required pam_deny.so

6.4.6 會話元件

描述

deny模組的這個元件能夠阻止應用程式在主機上啟動會話過程。

示例和建議

這個模組能夠阻止使用者啟動一個shell。如果和pam_motd模組層疊,我們可以在配置檔案中加入以下配置行,告訴使用者現在是系統維護時間:

# An example to see how to configure login to refuse the user a

# session (politely)

#

login session required pam_motd.so

file=/etc/system_time

login session required pam_deny.so

6.5 環境變數設定/取消模組

6.5.1 概要

模組名

pam_env

作者

Dave Kinchlea

維護者

作者

提供的管理組型別

authentication(setcred)

系統依賴性

/etc/security/pam_env.conf

6.5.2 綜述

  使用這個模組可以設定/取消環境變數的定義。

6.5.3 驗證元件

能夠識別的引數

debug、conffile=configuration-file-name、envfile=/env-file-name、readenv=/0|1

描述

你可以使用固定的字串透過這個模組設定變數或者取消對環境變數的設定。設定的環境變數值和PAM_ITEM是與或者或的關係。

這些由一個配置檔案控制,預設情況下,配置檔案是/etc/security/pam_env.conf。不過,可以透過connfile檔案指定其它的配置檔案。配置檔案的每個配置行都是以環境變數名開頭,接著是兩個選項:DEFAULT、OVERRIDE。DEFAULT表示:把這個變數設定為預設值,如果不存在就把它的值設定為一個空字串。OVERRIDE表示:使用新的值得覆蓋預設值。如果OVERRIDE之後,沒有定義變數值,就假定是空字串,而且不會執行覆蓋動作。

VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]

環境變數可以以$(string)的語法使用,而PAM_ITEM可以透過@(string)的語法使用。如果string中含有$、@字元,需要在前面加上反斜槓作為轉義符,例如:$。當需要空格時,可以使用引號,但是空格不能環境變數的名字中出現。環境變數的值必須以引號分割。

這個模組也能夠以KEY=VAL對的方式解析檔案,每個KEY=VAL對佔一行,預設檔案是/etc/environment。你可以使用envfile選項改變需要解析的檔案,使用readenv選項開啟/關閉解析的檔案。

這個模組的行為可以修改以下引數來設定:

debug

向syslog寫入更多資訊。

confile=filename

預設配置檔案是/ec/security/pam_env.conf。這個選項指定的檔案可以覆蓋預設檔案。不過,你必須使用完整的檔案路徑。

envfile=filename

預設是/etc/environment,使用這個選項指定其它的檔案。也需要使用完整的檔案路徑。

readenv=0|1

開啟(1)/關閉(0)從envfile中讀取環境變數。預設情況下,這個選項為開(1)。

示例和建議

參考/etc/security/pam_env.conf檔案。

6.6 過濾模組

6.6.1 概要

模組名

pam_filter

作者

Andrew G. Morgan

維護者

作者

提供的管理組功能

account、authentication、password、session

Clean code base

This module compiles cleanly on Linux based systems.

系統依賴性

需要安裝pam_filter程式。

6.6.2 綜述

  這個模組為應用程式提供了一個插入式的過濾器。由於為某個程式重新編寫過濾程式碼實現過濾功能是不太現實的,簡直是開玩笑。這個模組能夠對輸入流中的大小寫字元進行替換,然後輸出到輸出流。

6.6.3 Account+Authentication+Password+Session元件

能夠識別的引數

debug、new_term、non_term、runX

描述

這個模組的所有元件都可能會執行所需要的過濾程式。過濾程式是以呼叫的程式的許可權執行的,而不是以使用者的許可權執行。因此,普通使用者只能關閉他們的會話過程才能殺死過濾程式。

pam_filter模組的行為可以由Linux-PAM配置檔案傳遞的引數改變:

debug

模組執行時,syslog記錄更多的資訊。

new_term

作為一種預設的行為,過濾器會設定PAM_TTY選項,指示使用者與應用程式進行聯絡的終端。這個參數列示過濾程式應該把PAM_TTY設定為被過濾的偽終端。

no_term

不必設定PAM_TTY選項。

runX

為了使這個模組能夠執行一個過濾程式,應該讓它知道何時執行。可以使用這個引數實現上述目的。這個引數緊跟過濾程式的路徑名以及其命令列引數。

X的值可以是1和2。它表示過濾程式執行的確切時間。對於每種管理組功能,它會牽扯到不同的函式呼叫。

在authentication和session元件中,分別牽扯到兩個函式。對於authentication管理組,這兩個函式是 _authenticate和_setcred。run1表示從_authenticate函式執行過濾程式;run2表示從_setcred函式執行過濾程式。對於session管理組,run1表示過濾程式從_open_session函式執行;run2是從_close_session函式執行。

對於account元件,run1和run2是一樣的。

對於password管理組元件,run1表示過濾程式在_chauthtok函式首次執行時(PAM_PRELIM_CHECK階段)執行;而run2表示過濾程式是在_chauthtok第二次執行時(PAM_UPDATE_AUTHOK階段)執行。

示例和建議

你可以在login的配置檔案(/etc/pam.d/login)中加入下面入口,實際嘗試一下這個模組的應用:

# An example to see how to configure login to transpose upper and

# lower case letters once the user has logged in(!)

#

login session required pam_filter.so

run1 /usr/sbin/pam_filter/upperLOWER

6.7 匿名訪問模組

6.7.1 概要

模組名

pam_ftp

作者

Andrew G. Morgan

維護者

作者

提供的管理組功能

authentication

網路支援

提示使用者輸入email地址

6.7.2 綜述

  這個模組的用途是提供一種插入式的匿名FTP訪問模式。

6.7.3 authentication元件

能夠識別的引數

debug、users=xxx,yyy,....、ignore

描述

這個模組解釋使用者名稱和密碼,如果使用者名稱是ftp或者anonymous,而使用者的密碼是以@分割的,它就會把@前後兩部分分別設定為 PAM_RUSER和PAM_RHOST選項的值。使用者名稱被設定為ftp。模組驗證成功。在其它情況下,這個模組就會透過PAM_AUTHTOK選項返回需要輸入密碼和驗證失敗的資訊。

這個模組的行為可以使用如下引數修改:

debug

向syslog輸出除錯資訊

users=xxx,yyy,....

使用等號之後給出的使用者名稱代替ftp或者anonymous,作為匿名FTP的使用者名稱。

ignore

不理會使用者沒有email地址。

示例和建議

在第四章中,有一個使用匿名FTP模組的例子。

6.8 組訪問模組

6.8.1 概要

模組名

pam_group

作者

Andrew G. Morgan

維護者

作者

提供的管理組功能

suthentication

系統依賴性

需要/etc/security/group.conf檔案。可以與libpwdb連線。

網路支援

只能透過正確設定PAM_TTY選項。

6.8.2 綜述

這個模組根據使用者名稱和發起服務請求的終端,提供組分類功能。

6.8.3 authentication元件

描述

這個模組不對使用者進行驗證,而是為使用者賦予組成員關係。這種組成員關係是根據使用者請求的服務劃分的,在/etc/security/group.conf檔案中以文字的方式設定。

示例和建議

想要這個模組正常工作,需要準確設定/etc/security/group.conf檔案。其格式如下:

services; ttys; users; times; groups

前四項和pam_time配置檔案:/etc/security/pam_time.conf或者time.conf中的相同。groups是一些以逗號或者空格分開的文字字串,表示一些組名。如果使用者的應用程式滿足前四項,則使用者就被加入到第五項定義的組中。

這個模組能否起作用取決於使用者對檔案系統的訪問許可權。這一點是指,一旦使用者成為一個組的成員,這個使用者就可能利用獲得的許可權試圖建立一個 setgid程式。而以後,如果這個使用者不再屬於這個組,他就可以透過這個程式非法回到這個組中。由於這個原因,使用者具有寫許可權的檔案系統需要非常嚴格的限制,如果檔案系統在mount時,被設定為nosuid,那使用者就無法建立和執行這樣的程式。因此,使用這個模組時,使用者具有寫許可權的所有檔案系統都需要使用nosuid引數mount。

pam_group的作用和/etc/group檔案是並行的,如果使用者被加入的這個模組定義的任何組中,同時也被加入到/etc/group檔案中;反之亦然。

6.9 issue模組

6.9.1 概要

模組名

pam_issue

作者

Ben Collins

維護者

作者

提供的管理組功能

authentication(pam_sm_authenticate)

6.9.2 綜述

  這個模組能夠在提示資訊中,加入一個檔案的內容。

6.9.3 authentication元件

能夠識別的引數

issue=issue-file-name、noesc

描述

你可以使用這個模組在使用者提示資訊中加入一個issue檔案的內容。這個模組還可以解析issue檔案中的轉義詞,例如:x。

有效的轉義碼如下:

d: 當前的日期

s: 作業系統名

l: 這個終端名

m: 系統的體系(i686、spacr、pwerpc、....)

n: 系統主機名

o: 系統域名

r: 作業系統版本號

t: 當前時間

u: 當前登入的使用者數

U: 和u相同,只有字尾有所不同:u的字尾是user;U的字尾是users。

v: 作業系統的版本/建立日期

這個模組的行為可以透過一下引數修改:

issue: 指定使用的檔案

noesc: 關閉對轉義詞的解析

示例和建議

login auth pam_issue.so issue=/etc/issue

(作者:書生)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945681/,如需轉載,請註明出處,否則將追究法律責任。

相關文章