linux中PAM的配置和使用方法
(2014-12-17 12:38:16
???可插入認證模塊(簡稱PAM)是基于模塊化設計、具有可插入功能的一種獨立于應用程序之外的驗證方式。使用PAM后,應用程序可以不需要集成驗證功能,而由PAM來完成。例如,在Linux系統中,Login服務為用戶提供系統登錄服務,它提示用戶輸入相應的用戶名和密碼來驗證用戶的有效性,當使用PAM后,這個驗證過程可以由PAM來代替。PAM具有很大的靈活性,系統管理員可以通過它為應用程序自由選擇需要使用的驗證方式。鑒于PAM有這么多優點,在本文中,將以RedHat企業Linux3為應用平臺,來討論如何使用PAM來增強Linux服務器的安全性能。
當LINUX服務器中的某個應用程序或服務需要使用PAM來進行驗證時,只要此應用程序或服務支持PAM驗證功能,就可以通過修改其相應的PAM配置文件,加放相應的驗證方式,當重新啟用些服務或應用程序時,PAM模塊就會通過其專用API來讀取它的配置文件,根據配置文件中的內容來提供相應的驗證功能。所有驗證功能都是通過一些庫文件來提供的。
因此,在使用PAM之前,先掌握PAM配置文件的設置方法,了解一些常用的驗證模塊就顯得非常必要。
當某個支持PAM驗證的應用程序啟動時,就會通過PAM的API讀取它的PAM配置文件,然后根據配置文件中驗證項指定的內容,再由API調用所需的驗證模塊來完成配置文件中指定的驗證任務。從這里可以看出,要掌握PAM的使用,就必需了解配置文件的配置規則,以及各種驗證模塊的意義和作用。
在這里還要注意的是,一個Linux系統下的應用程序能夠使用PAM功能,最關鍵的是它已經將支持PAM功能的代碼集成到了原代碼當中。如果你能夠得到一個應用程序的原代碼,你也可以自行將支持PAM的功能代碼加入其中。但是,如果你得到的二進制文件不具有這些PAM功能代碼,那么,此應用程序就不支持PAM驗證功能。查看應用程序是否具有PAM驗證功能,可以使用ldd命令查看其動態連接庫中有沒有libpam和libpam_misc,有就支持。
1、設置PAM的配置文件
在RedHat企業Linux3系統中,每個支持PAM驗證的應用程序或服務,都有一個相應的PAM配置文件,存放在/etc/pam.d/目錄。要想這些配置文件有效,就必需將這些配置文件名字編寫進程序源代碼中。通常,這些配置文件的名字與其對應的應用程序的名字是一樣的。
???要想設置這些配置文件,只需要通過VI或VIM來打開它們,然后添加或刪除其中的驗證項就可以。
???打開/etc/pam.d/目錄下的任何一個配置文件,其中每行的驗證規則都使用如下所示的語法格式:
???Type??Control-flag??Module-path??Module-arguments
???其中每行代表一個獨立的驗證方式,每個配置文件可以由多種驗證規則相互疊加而成。驗證時PAM-API會按照從上往下的方式一一讀取這些驗證規則,并根據其中的控制標志做出相應的動作。
在編輯配置文件時一定要小心謹慎,由于規則的驗證是有上下順序之分的,因此你要小心確定某些危險的驗證規則處于配置文件中的正確位置。因為一旦出錯,可能會導致系統的部分功能或整個系統不能訪問,這樣你就不得不重新恢復它們的備份。
???要正常配置PAM配置文件,就應當了解配置文件方法格式中每列的所包括的內容,下面是這些列的簡短說明:
(1)、Type列,主要用來指定需要驗證的類型。一共有以下四種驗證類型:
1、?auth 驗證使用者身份,提示輸入帳號和密碼;
2、?account 提供對帳戶的進一步驗證,例如驗證帳戶的此操作是否已經過期,權限多大,擁有此權限的時間期限是否已經過期等等;
3、?password 提供對密碼的細致控制,例如控制密碼的使用期限,重復輸入的次數,密碼鎖定后的解禁時限等等。
4、?session 對每個會話進行跟蹤和記錄,記錄的內容包括登錄的用戶名及登錄的時間和次數等等。
???(2)、Control-flag列,主要用來控制在驗證過程中動作和返回結果的方式。它有兩種類型的表達方式:簡單的就是使用一個簡單的關鍵字,復雜的可以使用方括號來嵌套控制標志,并可在方括號中使用value=action的方式表達。
簡單的關鍵字有四個:
1、?required
當使用此控制標志時,當驗證失敗時仍然會繼續進行其下的驗證過程,它會返回一個錯誤信息,但是,由于它不會由于驗證失敗而停止繼續驗證過程,因此用戶不會知道是哪個規則項驗證失敗。
2、?requisite
此控制標志與required的驗證方式大體相似,但是,只要某個規則項驗證失敗則立即結束整個驗證過程,并返回一個錯誤信息。使用此關鍵字可以防止一些通過暴力猜解密碼的攻擊,但是,由于它會返回信息給用戶,因此,它也有可能將系統的用戶結構信息透露給攻擊者。
3、?sufficient
只要有此控制標志的一個規則項驗證成功,那么PAM構架將會立即終止其后所有的驗證,并且不論其前面的required標志的項沒有成功驗證,它依然將被忽略,然后驗證通過。
4、?optional
表明對驗證的成功或失敗都是可有可無的,所有的都會被忽略。(通常用于session類型)
復雜的控制標志能夠讓管理員可以指定在驗證過程中發生某種事件時可以執行的動作。這些控制標志用方括號包括起來,并由一系列的value=action 所構成,每個值之間用空格分開。
在新版PAM中,可供你選擇的value列表存在于/usr/include/security/_pam_types.h文件中。其中的內容包括:success,open_err,symbol_err,ervice_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,conv_again,incomplete,和default。
???action 可以是一個無符號的整數,當在某行驗證規則的控制標志的value指定期一個無符號的整數時n,就表明由此行往下的n行驗證模塊將被直接跳過。
Action還可以是下列所示的值:
????????ignore:設定此值后,指定的事件將會被忽略。
bad :設定此值后,當發生指定的事時的返回值將被認為是驗證模塊失敗。如果此驗證模塊是整個驗證堆疊中的第一個失敗的模塊, 它的狀態值將作為整個堆疊的狀態。
die:它的作用與bad 相同,但是,當設定此值的此類事件發生時,會終止整個驗證模塊的后續驗證工作,立即返回到應用程序。
ok :設定此值可以用來覆蓋此行驗證規則前面已經返回了PAM_SUCCESS的所有值,但是如果前面有驗證規則返回了一個錯誤的值,那么就不會被它覆蓋。
done:它的作用與ok 相同,但是,當設定此值的此類事件發生時,會終止整個驗證模塊的后續驗證工作,立即返回到應用程序。
reset :設定此值的作用是用來清除內存中原先的驗證模塊狀態,并重新開始下一組的驗證。
???第三列是Module-path,用來為要驗證的服務提供需要使用的驗證模塊。在Fedora Core 6系統中,當要引用的模塊處于/lib/security/或/lib64/security/目錄時,可以只輸入模塊的完整名稱;如果要引用的模塊不存在這兩個默認的保存目錄,就必需在模塊的完整名稱前加上完整的模塊路徑名。例如/usr/lib/security/。
???????第四列是Module-arguments,用來為引用的模塊指定特殊的選項,多個選項之間可以通過空格隔開,還可在選項中使用“[ ]”來輸入嵌套的命令或字串,當選項超過一行時用“\”符號連接下一行。
3、PAM中常用的驗證模塊說明
???要掌握PAM的使用,我們還應當去了解一些常用的PAM驗證模塊的作用,畢竟PAM的具體驗證功能都是由這些可插入的驗證模塊來完成的。在RedHat企業Linux3系統中,默認的PAM驗證文件存在于/lib/security/或/lib64/security/目錄,它們都是以“.so”為后綴的文件。
???每個PAM驗證模塊的使用對象,總是與PAM的驗證類型相對應的。有些驗證模塊只針對某一種驗證方法,例如pam_access.so驗證模塊只與account驗證類型配套使用,而有些驗證模塊卻可以與所有的驗證類型一起使用,例如pam_unix.so驗證模塊。你在了解這些驗證模塊時,應當同時了解它們的所屬于驗證類別。
???下面是一些常用的驗證模塊的簡要說明:
(1)、pam_access驗證模塊
pam_access驗證模塊一般與account驗證類型一同使用。它主要用于對訪問進入管理,提供基于登錄名、主機名或域名、公網IP地址或網絡號,以及非網絡登錄時的tty名稱的訪問控制。pam_access驗證模塊主要是根據/etc/security/access.conf配置文件中的內容,來進行相應的驗證工作的。如果access.conf文件不在缺省的/etc/security/目錄,你可以在其后使用accessfile參數指定自定義配置文件的絕對路徑。
/etc/security/access.conf配置文件中的每一行都由如下三個字段構成,中間用冒號隔開:
permission:users/groups:origins
permission(權限)字段可以用“+”,即允許訪問,“-”禁止訪問來表示相應的權限。
users/groups(用戶或組)字段可以是一個或幾個登錄名、組名及ALL(表示任何人)的一個清單。要區分哪個是用戶名,哪個是組名,可以將組名加入到一個括號中,例如(groups)。
origins(來源)字段可以是非網絡登錄時的tty名稱、主機名、域名(以“.”開始)、主機地址、網絡號(以“.”結束)、帶有子網掩碼的公網IP地址,以及ALL(表示任何主機)和LOCAL只要不包含“.”的所有字符)。還可以使用EXCEPT操作符來表示除…之外。
(2)、pam_cracklib驗證模塊
???pam_cracklib驗證模塊通常只與password驗證類型一起使用。這個驗證模塊可以通過插入password堆棧,為特殊的應用提供可插入式密碼強度性檢測。它的工作方式就是先提示用戶輸入密碼,然后使用一個系統字典和一套規則來檢測輸入的密碼是否不能滿足強壯性要求。密碼的強度檢測分二次進行,第一次只是檢測密碼是否是提供的對比字典中的一部分,如果檢測結果是否定的,那么就會提供一些附加的檢測來進一步檢測其強度,例如檢測新密碼中的字符占舊密碼字符的比例,密碼的長度,所用字符大小寫狀況,以及是否使用了特殊字符等等。
由于pam_cracklib驗證模塊提供了細致的密碼強度檢測,因此,當我們在使用時,必需為它指定相應的額外檢測選項。這些選項包括:
debug:此選項表示將模塊信息寫入系統日志
type=xxx:此選項用來修改缺省的密碼提示文本,例如,如果缺省提示輸入密碼的文本為“New Passwork:”,那么你就可以通過設置type=my password:來改變提示文本。
retry=N:此選項定義用戶在重試輸入多少次密碼后,返回一個錯誤信息,然后不準繼續輸入。缺省是1次。
difok=N:此選項用來定義新密碼中必須有幾個字符要與舊密碼不同,如果新密碼中有1/2以上的字符與舊密碼不同時,該新密碼就會被接受。
???difignore=N:此選項用來設定在difok之前收到多少個字符時,difok設置會被忽略,缺省為23。
minlen=N:此選項用來設置新密碼的最小長度。
?dcredit=N:此選項用來設定新密碼中可以包含數字的最大數目。
ucredit=N:此選項用來設定新密碼中可以包含的大寫字母的最大數目。
?lcredit=N:此選項用來設定新密碼中可以包含的小寫字母的最大數目。
ocredit=N:此選項用來設定新密碼中可以包含的特殊字符的最大數目。
???minclass=N:此選項用來規定新密碼中的字符類別的最小數目,字符一般有四種類別:數字、大寫字母、小寫字母,以及特殊字符。
???use_authtok:在某個與密碼相關的驗證模塊后使用此選項,例如pam_unix.so驗證模塊,可以強迫此模塊不提示輸入密碼,而使用上面設置的另一種方式,例如pam_cracklib.so。
???dictpath=/path/to/dict:指定cracklib目錄路徑。
(3)、pam_limit驗證模塊
pam_limits驗證模塊通常與session驗證類別一同使用。它主要用來限制用戶在會話過程中對系統資源的使用,即使UID=0的用戶也受它的限制。此模塊使用一個獨立的配置文件來設置對系統資源的限制情況,默認的配置文件是/etc/security/limits.conf,在使用中可以用conf選項來指定配置文件所在的位置。當你使用pam_limits驗證模塊時,先對此配置文件進行相應的設置總是一個不錯的選擇。
???/etc/security/limits.conf配置文件的設置語法如下:
??
配置文件語法格式中的“domain”列可以是用戶名、采用@group語法的組名,還可以用通配符“*”來表示任何用戶,以及使用“%”通配符來只限制maxlogins,并可以采用%group的語法格式。
配置文件語法格式中的“type”列有兩個值:
soft:用來設置對系統資源的軟限制,它允許用戶所使用的系統資源可以在設定的硬限制值的規定范圍來上下浮動。
hard:用來設置對系統資源的硬限制,這些硬限制由超級用戶設置,并由系統內核來執行。普通用戶對系統資源的使用率不能超過設置的硬限制設定值。
???配置文件語法格式中的“item”和“value”是成對使用的,“item”表示某類具體的系
統資源,而“value”就是“item”的值。在limits.conf配置文件中可以設置的系統資源有:
core:????核心文件的大小 (KB)
data:?????最大的數據包大小(KB)
fsize:?????最大的文件大小(KB)
memlock: 最大可用的內存空間(KB)
nofile:????最大可以打開的文件數量
rss:??????最大的可駐留空間(KB)
stack:????最大的堆??臻g(KB)
cpu:??????最大的CPU占用時間(minutes)
nproc:????最大允許運行的進程數量
as:???????地址空間限制(KB)
maxlogins: 用戶可以登錄到系統的最多次數,UID=0的用戶除外
???priority:????優先運行的用戶進程(負值越高的進程優先)
???sigpending: 最大數量的等待信號(Linux2.6及以上內核)
???msqqueue:??POSIX信息隊列的最大可使用的內存(bytes)(Linux2.6及以上內核)
???locks:??????最大可鎖定文件的數目(Linux2.4及以上內核的系統)
上面這些“item”項目是一些對系統資源使用情況非常有用的,新版本的PAM中還新加入了其它一些項目,你可以通過它的幫助文檔得到它們的說明。需要注意的是,用戶的限制優先級要高于組的限制,如果你為一個組設置了某種系統資源限制,但是其中的某個用戶設置了另一級別的系統資源限制,那么,系統將會優先按用戶級別的限制處理。另外,如果無限制可以使用“-”號表示。
優先級高。
(4)、pam_time驗證模塊
pam_time驗證模塊通常與account驗證類型一起使用。它并不對用戶提供驗證服務,而是用來限制用戶在指定的日期、時間及終端線路上對系統或特定應用程序進行訪問。
要正確使用Pam_time驗證模塊,必需有一個正確的/etc/security/time.conf相配套。此配置文件中每一行的語法格式為:
services;ttys;users;times
services字段:表示應用PAM功能的服務名稱。
ttys字段:應用此規則的終端名,可以“*”號表示任何終端,“!”表示非。
users字段:應用此規則的用戶名單或網絡組名,可以“*”號表示任何用戶,“!”表示非。
times字段:指定時間,通常使用日期/時間范圍的格式來表示。可以用星期幾英文單詞前兩個字母來表示具體的日期,例如MoTuSa就是指星期一星期二和星期六。注意:重復的日期將會被取消,比如MoMo表示任何一天都沒有。兩個字母的組合有: Mo、Tu、We、Th、Fr、Sa、Su、Wk、Wd、Al, Mo到Su分別指從星期一到星期天,Wk指每一天,Wd指周末,Al也指每一天,例如AlFr指除星期五外的每一天。 時間采用24小時制,即HHMM(時分)的形式。日期/時間范圍前可有“!”表表除此以外的所有日期/時間,用“-”連接指定的時間范圍,如果結束時間小于開始時間,就表明時間持續到第二天的結束時間,例如Al1800-0800就是指每天下午6點整到第二天的早晨8點整。
(5)、pam_listfile驗證模塊
pam_listfile驗證模塊通常與auth驗證類型一起使用。此模塊提供根據某個指定的文件來允許或禁止用戶訪問某個應用程序或服務的功能,這些被指定的文件必需事先存在,然后通過file參數來指定該文件。pam_listfile驗證模塊可以根據用戶名、tty、rhost、ruser、用戶組、使用的shell來對用戶進行訪問控制。
Pam_listfile驗證模塊可以使用的選項有:
item=[tty|user|rhost|ruser|group|shell]:設置訪問控制的對象類型。
sense=allow|deny:用來指定當在保存“item”對象的文件中找不到item指定的對象時的動作方式,如果在文件中找不到相應的對象,則執行相反的動作。
onerr=succeed|fail:用來指定當某類事件(如無法打開配置文件)發生時的返回值。
file=filename:指定保存有“item”對象的文件位置。
apply=[user|@group]:用指定使用非用戶和組類別時,這些規則所適用的對象。當item=[user|ruser|group]時,這個選項沒有任何意義,只有當item=[tty|rhost|shell]時才有意思。
(6)、pam_unix驗證模塊
pam_unix提供基于/etc/passwd 和 /etc/shadow文件的類UNIX風格的認證。它適用所有的驗證類型,包括:auth、account、 password、session。
當pam_unix驗證模塊與auth驗證類型一起使用時,此模塊可以使用的選項有debug、audit、use_first_pass、try_first_pass、nullok和nodelay,主要功能是驗證用戶密碼的有效性,在缺省情況下(即不帶任何參數時),該模塊的主要功能是禁止密碼為空的用戶提供服務;
在作為account類型使用時,此時該模塊可識別的參數有debug、audit,該模塊主要執行建立用戶帳號和密碼狀態的任務,然后執行提示用戶修改密碼,用戶采用新密碼后才提供服務之類的任務;
在作為password類型使用時,此時該模塊可識別的參數有debug、 audit、 nullok;、not_set_pass、use_authtok、try_first_pass、use_first_pass、md5、bigcrypt、shadow、nis、
remember,該模塊完成讓用戶更改密碼的任務;
在作為session類型使用時,此時該模塊沒有可識別的參數,該模塊僅僅完成記錄用戶名和服務名到日志文件的工作。
Pam_unix驗證模塊可以使用的選項有:
debug:將調試信息寫入系統日志,當pam_unix驗證模塊與所有驗證類別使用時都有效。
audit:提供比debug更多診斷調試,它只有當pam_unix驗證模塊與 auth、account及password驗證類型使用時有效。
nullok:默認情況下,如果密碼為空,那么就不允許用戶訪某項服務,而使用此項后將則覆蓋這個默認動作。它只有當pam_unix驗證模塊與 auth、和password驗證類型使用時有效。
nodelay:當用戶驗證失敗后,系統在給出錯誤信息時會有一個延遲,默認為2秒鐘。當使用此選項后,將取消這個延遲。它只有當pam_unix驗證模塊與 auth驗證類型使用時有效。
try_first_pass:當pam_unix驗證模塊與auth驗證類型一起使用時,使用該選項將在提示用戶輸入密碼前,嘗試使用以往的密碼驗證方式來對用戶進行驗證。而當pam_unix驗證模塊與password驗證類型一起使用時,該選項主要用來防止用戶新設定的密碼與以前的舊密碼相同。
use_first_pass:當pam_unix驗證模塊與auth驗證類型一起使用時,使用該選項將在提示用戶輸入密碼前,直接使用以往的密碼驗證方式來對用戶進行驗證。而當pam_unix驗證模塊與password驗證類型一起使用時,該選項主要用來防止用戶新設定的密碼與前面password提供的密碼相同。
use_authok:當用戶修改時,使用此選項強制用戶使用前面堆疊驗證模塊提供的密碼,例如由pam_cracklib驗證模塊提供的新密碼。當pam_unix驗證模塊與password驗證類型一起使用時有效。
md5:采用md5對用戶密碼進行加密, 當pam_unix驗證模塊與password驗證類型一起使用時有效。
shadow:使用用shadow密碼,當pam_unix驗證模塊與password驗證類型一起使用時有效。
sha256:使用此選項,當下次修改密碼時將用SHA256算法加密,如果SHA256的libcrypt不存在,就會重新使用MD5加密密碼。Sha512與此選項相同,只是加密強大不同而已。當pam_unix驗證模塊與password驗證類型一起使用時有效。
rounds=n:用來指定使用SHA256和SHA512算法加密密碼時重復哈希算法的次數。當pam_unix驗證模塊與password驗證類型一起使用時有效。
remember=n:使用此選項將會將n個使用過的舊密碼,以MD5的方式加密后保存到/etc/security/opasswd文件中。當pam_unix驗證模塊與password驗證類型一起使用時有效。
(7)、pam_deny驗證模塊可以用來禁止所有的訪問,當你設置PAM配置文件時,為了安全,在開始的行可以使用它來禁止所有的訪問,以減少錯誤配置引起的安全風險。而pam_permit驗證模塊卻總是允許所有的訪問,你要謹慎的使用此驗證模塊。它們都適用于所有的驗證類型。
(8)、pam_rootok驗證模塊允許/etc/pam.d/su中的用戶不需要任何驗證就可以登錄系統。因此,你應當小心設置/etc/pam.d/su文件,并且在使用時要與pam_wheel驗證模塊一同使用,以保證root權限只允許在pam_wheel的限制中進行。它只適用于auth驗證類型。
(9)、pam_security驗證模塊只對root用戶有影響。當root用戶登錄時,pam_security驗證模塊會參考/etc/securetty目錄中的控制終端列表,來保證root用戶不會從不安全的終端登錄。它一般與auth驗證類型一現使用。
(10)、pam_nologin驗證模塊,如果/etc/nologin文件存在,此模塊將禁止所有的登錄。它一般與auth和account驗證類型一同使用。
(11)、pam_echo驗證模塊用來給用戶顯示通過file選項指定的文件中的內容,它適用于所有的驗證類型。pam_motd驗證模塊允許將/etc/motd文件中的內容顯示給用戶,它只適用于session驗證類型。
(12)、pam_lastlog顯示用戶上次登錄的日期和時間,它主要通過讀取/var/log/lastlog文件來顯示。它只適用與session驗證類型。
(13)、pam_warn將剛登錄的信息記錄到系統日志當中,它一般與auth和password驗證類型一同使用。
(15)、pam_wheel驗證模塊,當使用此驗證模塊后,只有加入到了一個wheel group中的的根用戶,并且提交的密碼有效,才能訪問指定的服務或系統。將它與pam_rootok一同使用能增加對根用戶的限制。它只適用于auth和account驗證類型。
???在/lib/security/或/lib64/security/目錄中還有許多沒有在上面列出的驗證模塊,由于它們的使用頻率不高,加上文章篇幅的限制,就不再在此對它們做相應的說明,大家可以參考PAM管理員指南來得到它們的詳細說明。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99197