溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux pam指的是什么

發(fā)布時間:2023-04-25 09:52:55 來源:億速云 閱讀:149 作者:iii 欄目:建站服務(wù)器

這篇文章主要介紹“l(fā)inux pam指的是什么”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“l(fā)inux pam指的是什么”文章能幫助大家解決問題。

在linux中,PAM是指可動態(tài)加載驗(yàn)證模塊,是一套共享庫,使本地系統(tǒng)管理員可以隨意選擇程序的認(rèn)證方式;因?yàn)榭梢园葱枰獎討B(tài)的對驗(yàn)證的內(nèi)容進(jìn)行變更,所以可以大大提高驗(yàn)證的靈活性。PAM使用配置“/etc/pam.d/”下的文件,來管理對程序的認(rèn)證方式。應(yīng)用程序 調(diào)用相應(yīng)的配置文件,從而調(diào)用本地的認(rèn)證模塊。

在Linux中執(zhí)行有些程序時,這些程序在執(zhí)行前首先要對啟動它的用戶進(jìn)行認(rèn)證,符合一定的要求之后才允許執(zhí)行,例如login, su等。在Linux中進(jìn)行身份或是狀態(tài)的驗(yàn)證程序是由PAM來進(jìn)行的,PAM(Pluggable Authentication Modules)可動態(tài)加載驗(yàn)證模塊,因?yàn)榭梢园葱枰獎討B(tài)的對驗(yàn)證的內(nèi)容進(jìn)行變更,所以可以大大提高驗(yàn)證的靈活性。

一、PAM模塊介紹

Linux-PAM(即linux可插入認(rèn)證模塊)是一套共享庫,使本地系統(tǒng)管理員可以隨意選擇程序的認(rèn)證方式。換句話說,不用(重新編寫)重新編譯一個包含PAM功能的應(yīng)用程序,就可以改變它使用的認(rèn)證機(jī)制,這種方式下,就算升級本地認(rèn)證機(jī)制,也不用修改程序。

PAM使用配置/etc/pam.d/下的文件,來管理對程序的認(rèn)證方式。應(yīng)用程序 調(diào)用相應(yīng)的配置文件,從而調(diào)用本地的認(rèn)證模塊。模塊放置在/lib/security下,以加載動態(tài)庫的形式進(jìn),像我們使用su命令時,系統(tǒng)會提示你輸入root用戶的密碼。這就是su命令通過調(diào)用PAM模塊實(shí)現(xiàn)的。

PAM的模塊類型

Linux-PAM有四種模塊類型,分別代表四種不同的任務(wù),它們是:

  • 認(rèn)證管理(auth)

  • 賬號管理(account)

  • 會話管理(session)

  • 密碼(password)管理

一個類型可能有多行,它們按順序依次由PAM模塊調(diào)用。

vi /etc/pam.d/system-auth

如下圖:

配置分為基本分為四列:模塊名稱、控制、模塊庫文件和參數(shù)。

linux pam指的是什么

其中模塊主要分四種,具體功能如下:

  • auth模塊: 用來對用戶的身份進(jìn)行識別。如:提示用戶輸入密碼,或判斷用戶是否為root等。

  • auth模塊: 對帳號的各項(xiàng)屬性進(jìn)行檢查。如:是否允許登錄,是否達(dá)到最大用戶數(shù),或是root用戶是否允許在這個終端登錄等。

  • session模塊: 這個模塊用來定義用戶登錄前的,及用戶退出后所要進(jìn)行的操作。如:登錄連接信息,用戶數(shù)據(jù)的打開與關(guān)閉,掛載文件系統(tǒng)等。

  • password模塊: 使用用戶信息來更新。如:修改用戶密碼。

總結(jié): auth、account、password、session,auth是一個標(biāo)識符,說明要干的事情,auth處理登錄時驗(yàn)證方面的事,account、password、session和登錄時驗(yàn)證沒啥關(guān)系,比如password是處理更改密碼時的事情。

二、PAM的配置文件說明

PAM配置文件有下面兩種寫法:
1)寫在/etc/pam.conf文件中,但centos6之后的系統(tǒng)中,這個文件就沒有了。
2)將PAM配置文件放到/etc/pam.d/目錄下,其規(guī)則內(nèi)容都是不包含 service 部分的,即不包含服務(wù)名稱,而/etc/pam.d 目錄下文件的名字就是服務(wù)名稱。如: vsftpd,login等,只是少了最左邊的服務(wù)名列。如:/etc/pam.d/sshd

[root@centos6-test06 ~]# cat /etc/pam.d/sshd 
#%PAM-1.0
auth	   required	pam_sepermit.so
auth       include      password-auth
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so      close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so      open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so      force revoke
session    include      password-auth

由上面的pam模塊文件內(nèi)容看,可以將pam配置文件分為四列

  • 第一列代表模塊類型

  • 第二列代表控制標(biāo)記

  • 第三列代表模塊路徑

  • 第四列代表模塊參數(shù)

1)第一列:PAM的模塊類型
Linux-PAM有四種模塊類型,分別代表四種不同的任務(wù),它們是:
認(rèn)證管理(auth),賬號管理(account),會話管理(session)和密碼(password)管理,一個類型可能有多行,它們按順序依次由PAM模塊調(diào)用。

linux pam指的是什么

對以上四種模塊類型進(jìn)一步補(bǔ)充說明:
auth:表示鑒別類接口模塊類型用于檢查用戶和密碼,并分配權(quán)限;
這種類型的模塊為用戶驗(yàn)證提供兩方面服務(wù)。讓應(yīng)用程序提示用戶輸入密碼或者其他標(biāo)記,確認(rèn)用戶合法性;通過他的憑證許可權(quán)限,設(shè)定組成員關(guān)系或者其他優(yōu)先權(quán)。

account:表示賬戶類接口,主要負(fù)責(zé)賬戶合法性檢查,確認(rèn)帳號是否過期,是否有權(quán)限登錄系統(tǒng)等;
這種模塊執(zhí)行的是基于非驗(yàn)證的帳號管理。他主要用于限制/允許用戶對某個服務(wù)的訪問時間,當(dāng)前有效的系統(tǒng)資源(最多可以多少用戶),限制用戶位置(例如:root只能通過控制臺登錄)。

多數(shù)情況下auth和account會一起用來對用戶登錄和使用服務(wù)的情況進(jìn)行限制。這樣的限制會更加完整。比如下面是一個具體的例子:login是一個應(yīng)用程序。Login要完成兩件工作——首先查詢用戶,然后為用戶提供所需的服務(wù),例如提供一個shell程序。通常Login要求用戶輸入名稱和密碼進(jìn)行驗(yàn)證。當(dāng)用戶名輸入的時候,系統(tǒng)自然會去比對該用戶是否是一個合法用戶,是否在存在于本地或者遠(yuǎn)程的用戶數(shù)據(jù)庫中。如果該賬號確實(shí)存在,那么是否過期。這些個工作是由account接口來負(fù)責(zé)。

如果用戶滿足上述登錄的前提條件,那么它是否具有可登錄系統(tǒng)的口令,口令是否過期等。這個工作就要由auth接口來負(fù)責(zé)了,他通常會將用戶口令信息加密并提供給本地(/etc/shadow)或者遠(yuǎn)程的(ldap,kerberos等)口令驗(yàn)證方式進(jìn)行驗(yàn)證。

如果用戶能夠登錄成功,證明auth和account的工作已經(jīng)完成。但整個驗(yàn)證過程并沒有完全結(jié)束。因?yàn)檫€有一些其他的問題沒有得到確認(rèn)。例如,用戶能夠在服務(wù)器上同時開啟多少個窗口登錄,用戶可以在登錄之后使用多少終端多長時間,用戶能夠訪問哪些資源和不能訪問哪些資源等等。也就是說登錄之后的后續(xù)驗(yàn)證和環(huán)境定義等還需要其他的接口。這就是我們下面要提到的兩組接口:

session:會話類接口。實(shí)現(xiàn)從用戶登錄成功到退出的會話控制;
處理為用戶提供服務(wù)之前/后需要做的些事情。包括:開啟/關(guān)閉交換數(shù)據(jù)的信息,監(jiān)視目錄等,設(shè)置用戶會話環(huán)境等。也就是說這是在系統(tǒng)正式進(jìn)行服務(wù)提供之前的最后一道關(guān)口。

password:口令類接口。控制用戶更改密碼的全過程。也就是有些資料所說的升級用戶驗(yàn)證標(biāo)記。

注意:上述接口在使用的時候,每行只能指定一種接口類型,如果程序需要多種接口的話,可在多行中分別予以規(guī)定。

2)第二列:PAM的控制標(biāo)記

PAM使用控制標(biāo)記來處理和判斷各個模塊的返回值.(在此只說明簡單的認(rèn)證標(biāo)記)。

linux pam指的是什么

規(guī)定如何處理PAM模塊鑒別認(rèn)證的結(jié)果,簡而言之就是鑒別認(rèn)證成功或者失敗之后會發(fā)生什么事,如何進(jìn)行控制。單個應(yīng)用程序可以調(diào)用多種底層模塊,通常稱為“堆疊”。對應(yīng)于某程序按照配置文件中出現(xiàn)順序執(zhí)行的所有模塊成為“堆”,堆中的各模塊的地位與出錯時的處理方式由control_flag欄的取值決定,他的四種可能的取值分別為required、Requisite、sufficient或_optional:

required:表示該行以及所涉及模塊的成功是用戶通過鑒別的必要條件。換句話說,只有當(dāng)對應(yīng)于應(yīng)用程序的所有帶 required標(biāo)記的模塊全部成功后,該程序才能通過鑒別。同時,如果任何帶required標(biāo)記的模塊出現(xiàn)了錯誤,PAM并不立刻將錯誤消息返回給應(yīng)用程序,而是在所有模塊都調(diào)用完畢后才將錯誤消息返回調(diào)用他的程序。 反正說白了,就是必須將所有的模塊都執(zhí)行一次,其中任何一個模塊驗(yàn)證出錯,驗(yàn)證都會繼續(xù)進(jìn)行,并在執(zhí)行完成之后才返回錯誤信息。這樣做的目的就是不讓用戶知道自己被哪個模塊拒絕,通過一種隱蔽的方式來保護(hù)系統(tǒng)服務(wù)。就像設(shè)置防火墻規(guī)則的時候?qū)⒕芙^類的規(guī)則都設(shè)置為drop一樣,以致于用戶在訪問網(wǎng)絡(luò)不成功的時候無法準(zhǔn)確判斷到底是被拒絕還是目標(biāo)網(wǎng)絡(luò)不可達(dá)。

requisite:與required相仿,只有帶此標(biāo)記的模塊返回成功后,用戶才能通過鑒別。不同之處在于其一旦失敗就不再執(zhí)行堆中后面的其他模塊,并且鑒別過程到此結(jié)束,同時也會立即返回錯誤信息。與上面的required相比,似乎要顯得更光明正大一些。

sufficient:表示該行以及所涉及模塊驗(yàn)證成功是用戶通過鑒別的充分條件。也就是說只要標(biāo)記為sufficient的模塊一旦驗(yàn)證成功,那么PAM便立即向應(yīng)用程序返回成功結(jié)果而不必嘗試任何其他模塊。即便后面的層疊模塊使用了requisite或者required控制標(biāo)志也是一樣。當(dāng)標(biāo)記為sufficient的模塊失敗時,sufficient模塊會當(dāng)做 optional對待。因此擁有sufficient 標(biāo)志位的配置項(xiàng)在執(zhí)行驗(yàn)證出錯的時候并不會導(dǎo)致整個驗(yàn)證失敗,但執(zhí)行驗(yàn)證成功之時則大門敞開。所以該控制位的使用務(wù)必慎重。

optional:他表示即便該行所涉及的模塊驗(yàn)證失敗用戶仍能通過認(rèn)證。在PAM體系中,帶有該標(biāo)記的模塊失敗后將繼續(xù)處理下一模塊。也就是說即使本行指定的模塊驗(yàn)證失敗,也允許用戶享受應(yīng)用程序提供的服務(wù)。使用該標(biāo)志,PAM框架會忽略這個模塊產(chǎn)生的驗(yàn)證錯誤,繼續(xù)順序執(zhí)行下一個層疊模塊。

include:表示在驗(yàn)證過程中調(diào)用其他的PAM配置文件。在RHEL系統(tǒng)中有相當(dāng)多的應(yīng)用通過完整調(diào)用/etc/pam.d/system-auth來實(shí)現(xiàn)認(rèn)證而不需要重新逐一去寫配置項(xiàng)。這也就意味著在很多時候只要用戶能夠登錄系統(tǒng),針對絕大多數(shù)的應(yīng)用程序也能同時通過認(rèn)證。

另外還有一種比較復(fù)雜的格式為value = action的語法來設(shè)置控制標(biāo)志,標(biāo)志之間會以空格分開。格式如下:

value1 = action1 value2 = action2 ……

其中value可以是下列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)能夠用來設(shè)置上面的返回值無法表達(dá)的行為。

actionN可以是一個非負(fù)整數(shù)或者是下面的記號之一:ignore、ok、done、bad、die和reset。如果是非負(fù)整數(shù)J,就表示需要忽略后面J個同樣類型的模塊。通過這種方式,系統(tǒng)管理者可以更加靈活地設(shè)置層疊模塊,模塊的層疊路徑由單個模塊的反應(yīng)決定。

關(guān)于這幾個記號的詳細(xì)解釋:

  • ignore:如果使用層疊模塊,那么這個模塊的返回值將被忽略,不會被應(yīng)用程序知道。

  • bad:他表示這個返回碼應(yīng)該被看作是模塊驗(yàn)證失敗的標(biāo)志。如果這個模塊是層疊模塊的第一個驗(yàn)證失敗的模塊,那么他的狀態(tài)值就是整個層疊模塊驗(yàn)證的狀態(tài)值和結(jié)果。

  • die:終止層疊模塊驗(yàn)證過程,立刻返回到應(yīng)用程序。

  • ok:告訴PAM這個模塊的返回值將直接作為所有層疊模塊的返回值。也就是說,如果這個模塊前面的模塊返回狀態(tài)是PAM_SUCCESS,那這個返回值就會覆蓋前面的返回狀態(tài)。注意:如果前面的模塊的返回狀態(tài)表示模塊驗(yàn)證失敗,那么不能使用這個返回值再加以覆蓋。

  • done:終止后續(xù)層疊模塊的驗(yàn)證,把控制權(quán)立刻交回應(yīng)用程序。

  • reset:清除所有層疊模塊的返回狀態(tài),從下一個層疊模塊重新開始驗(yàn)證。

3)模塊路徑
模塊路徑.即要調(diào)用模塊的位置. 如果是64位系統(tǒng),一般保存在/lib64/security,如: pam_unix.so,同一個模塊,可以出現(xiàn)在不同的類型中.它在不同的類型中所執(zhí)行的操作都不相同.這是由于每個模塊,針對不同的模塊類型,編制了不同的執(zhí)行函數(shù)。

4)模塊參數(shù)
模塊參數(shù),即傳遞給模塊的參數(shù).參數(shù)可以有多個,之間用空格分隔開,如:password   required   pam_unix.so nullok obscure min=4 max=8 md5。

三、PAM模塊的工作原理和流程

以RHEL系統(tǒng)為例,當(dāng)pam安裝之后有兩大部分:在/lib/security目錄下的各種pam模塊以及/etc/pam.d和/etc/pam.d目錄下的針對各種服務(wù)和應(yīng)用已經(jīng)定義好的pam配置文件。當(dāng)某一個有認(rèn)證需求的應(yīng)用程序需要驗(yàn)證的時候,一般在應(yīng)用程序中就會定義負(fù)責(zé)對其認(rèn)證的PAM配置文件。以vsftpd為例,在它的配置文件/etc/vsftpd/vsftpd.conf中就有這樣一行定義:

pam_service_name=vsftpd

表示登錄FTP服務(wù)器的時候進(jìn)行認(rèn)證是根據(jù)/etc/pam.d/vsftpd文件定義的內(nèi)容進(jìn)行。

那么,當(dāng)程序需要認(rèn)證的時候已經(jīng)找到相關(guān)的pam配置文件,認(rèn)證過程是如何進(jìn)行的?下面我們將通過解讀/etc/pam.d/system-auth文件予以說明。

首先要聲明一點(diǎn)的是:system-auth是一個非常重要的pam配置文件,主要負(fù)責(zé)用戶登錄系統(tǒng)的認(rèn)證工作。而且該文件不僅僅只是負(fù)責(zé)用戶登錄系統(tǒng)認(rèn)證,其它的程序和服務(wù)通過include接口也可以調(diào)用到它,從而節(jié)省了很多重新自定義配置的工作。所以應(yīng)該說該文件是系統(tǒng)安全的總開關(guān)和核心的pam配置文件。

下面是/etc/pam.d/system-auth文件的全部內(nèi)容:

[root@centos6-test06 ~]# grep -v ^# /etc/pam.d/system-auth
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

第一部分表示,當(dāng)用戶登錄的時候,首先會通過auth類接口對用戶身份進(jìn)行識別和密碼認(rèn)證。所以在該過程中驗(yàn)證會經(jīng)過幾個帶auth的配置項(xiàng)。

其中的第一步是通過pam_env.so模塊來定義用戶登錄之后的環(huán)境變量, pam_env.so允許設(shè)置和更改用戶登錄時候的環(huán)境變量,默認(rèn)情況下,若沒有特別指定配置文件,將依據(jù)/etc/security/pam_env.conf進(jìn)行用戶登錄之后環(huán)境變量的設(shè)置。

然后通過pam_unix.so模塊來提示用戶輸入密碼,并將用戶密碼與/etc/shadow中記錄的密碼信息進(jìn)行對比,如果密碼比對結(jié)果正確則允許用戶登錄,而且該配置項(xiàng)的使用的是“sufficient”控制位,即表示只要該配置項(xiàng)的驗(yàn)證通過,用戶即可完全通過認(rèn)證而不用再去走下面的認(rèn)證項(xiàng)。不過在特殊情況下,用戶允許使用空密碼登錄系統(tǒng),例如當(dāng)將某個用戶在/etc/shadow中的密碼字段刪除之后,該用戶可以只輸入用戶名直接登錄系統(tǒng)。

下面的配置項(xiàng)中,通過pam_succeed_if.so對用戶的登錄條件做一些限制,表示允許uid大于500的用戶在通過密碼驗(yàn)證的情況下登錄,在Linux系統(tǒng)中,一般系統(tǒng)用戶的uid都在500之內(nèi),所以該項(xiàng)即表示允許使用useradd命令以及默認(rèn)選項(xiàng)建立的普通用戶直接由本地控制臺登錄系統(tǒng)。

最后通過pam_deny.so模塊對所有不滿足上述任意條件的登錄請求直接拒絕,pam_deny.so是一個特殊的模塊,該模塊返回值永遠(yuǎn)為否,類似于大多數(shù)安全機(jī)制的配置準(zhǔn)則,在所有認(rèn)證規(guī)則走完之后,對不匹配任何規(guī)則的請求直接拒絕。

第二部分的三個配置項(xiàng)主要表示通過account賬戶類接口來識別賬戶的合法性以及登錄權(quán)限。

第一行仍然使用pam_unix.so模塊來聲明用戶需要通過密碼認(rèn)證。第二行承認(rèn)了系統(tǒng)中uid小于500的系統(tǒng)用戶的合法性。之后對所有類型的用戶登錄請求都開放控制臺。

第三部分會通過password口另類接口來確認(rèn)用戶使用的密碼或者口令的合法性。第一行配置項(xiàng)表示需要的情況下將調(diào)用pam_cracklib來驗(yàn)證用戶密碼復(fù)雜度。如果用戶輸入密碼不滿足復(fù)雜度要求或者密碼錯,最多將在三次這種錯誤之后直接返回密碼錯誤的提示,否則期間任何一次正確的密碼驗(yàn)證都允許登錄。需要指出的是,pam_cracklib.so是一個常用的控制密碼復(fù)雜度的pam模塊,關(guān)于其用法舉例我們會在之后詳細(xì)介紹。之后帶pam_unix.so和pam_deny.so的兩行配置項(xiàng)的意思與之前類似。都表示需要通過密碼認(rèn)證并對不符合上述任何配置項(xiàng)要求的登錄請求直接予以拒絕。不過用戶如果執(zhí)行的操作是單純的登錄,則這部分配置是不起作用的。

第四部分主要將通過session會話類接口為用戶初始化會話連接。其中幾個比較重要的地方包括,使用pam_keyinit.so表示當(dāng)用戶登錄的時候?yàn)槠浣⑾鄳?yīng)的密鑰環(huán),并在用戶登出的時候予以撤銷。不過該行配置的控制位使用的是optional,表示這并非必要條件。之后通過pam_limits.so限制用戶登錄時的會話連接資源,相關(guān)pam_limit.so配置文件是/etc/security/limits.conf,默認(rèn)情況下對每個登錄用戶都沒有限制。關(guān)于該模塊的配置方法在后面也會詳細(xì)介紹。

可見,不同應(yīng)用程序通過配置文件在認(rèn)證過程中調(diào)用不同的pam模塊來定制具體的認(rèn)證流程。其中我們不難看出,其實(shí)可以根據(jù)實(shí)際的需要對pam的配置文件進(jìn)行修改以滿足不同的認(rèn)證需求,例如下面的例子:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth    required    pam_env.so
auth    required    pam_tally.so onerr=fail deny=5
auth    sufficient  pam_unix.so nullok try_first_pass
auth    requisite   pam_succeed_if.so uid >= 500 quiet
auth    required    pam_deny.so

account required    pam_unix.so
account sufficient  pam_succeed_if.so uid < 500 quiet
account required    pam_permit.so

password    requisite pam_cracklib.so try_first_pass retry=3 minlen=10 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=6
password    requisite pam_passwdqc.so use_first_pass enforce=everyone
password    sufficient pam_unix.so md5 remember=6 shadow nullok try_first_pass use_authtok
password    required pam_deny.so

session     optional pam_keyinit.so revoke
session     required pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required pam_unix.so

在其中就增加了對用戶密碼修改時復(fù)雜度的限制,用戶多次錯誤輸入密碼之后的鎖定限制以及用戶使用密碼歷史等限制選項(xiàng)。

所以我們通過對上述system-auth配置文件的修改,模塊的增加和選項(xiàng)的變化,從很大的程度上增加了用戶登錄驗(yàn)證的安全性要求。我們會在之后的文章中對該配置進(jìn)行詳細(xì)說明。

另外也一定需要注意,在整個的PAM配置文件當(dāng)中,配置項(xiàng)以及模塊調(diào)用的邏輯順序非常關(guān)鍵。因?yàn)镻AM是按照配置項(xiàng)的先后順序來進(jìn)行驗(yàn)證。錯誤的模塊調(diào)用順序很可能導(dǎo)致嚴(yán)重的安全問題甚至系統(tǒng)錯誤。所以對PAM配置進(jìn)行修改的時候務(wù)必要考慮這一點(diǎn)。

四、常用的PAM模塊介紹

PAM模塊結(jié)合管理類型說明
pam_unix.so

auth

提示用戶輸入密碼,并與/etc/shadow文件相比對.匹配返回0

account檢查用戶的賬號信息(包括是否過期等).帳號可用時,返回0.
password修改用戶的密碼. 將用戶輸入的密碼,作為用戶的新密碼更新shadow文件
pam_shells.so

auth

account

如果用戶想登錄系統(tǒng),那么它的shell必須是在/etc/shells文件中之一的shell
pam_deny.so

account

auth

password

session

該模塊可用于拒絕訪問
pam_permit.so

auth

account

password

session

模塊任何時候都返回成功.
pam_securetty.soauth如果用戶要以root登錄時,則登錄的tty必須在/etc/securetty之中.
pam_listfile.so

auth

account

password session

訪問應(yīng)用程的控制開關(guān)
pam_cracklib.sopassword

這個模塊可以插入到一個程序的密碼棧中,用于檢查密碼的強(qiáng)度.

pam_limits.sosession定義使用系統(tǒng)資源的上限,root用戶也會受此限制,可以通過/etc/security/limits.conf或/etc/security/limits.d/*.conf來設(shè)定

五、PAM模式使用說明

1)pam_access.so模塊

pam_access.so模塊主要的功能和作用是根據(jù)主機(jī)名(包括普通主機(jī)名或者FQDN)、IP地址和用戶實(shí)現(xiàn)全面的訪問控制。pam_access.so模塊的具體工作行為根據(jù)配置文件/etc/security/access.conf來決定。該配置文件的主體包含了三個字段——權(quán)限、用戶和訪問發(fā)起方。格式上是一個用""隔開的表。
第一個字段:權(quán)限(permission),使用"+"表示授予權(quán)限,用"-"表示禁止權(quán)限。
第二個字段:用戶(user),定義了用戶、組以及用"@"表示的在不同主機(jī)上的同名用戶和同一主機(jī)上不同名用戶。
第三個字段:訪問發(fā)起方(origins),定義了發(fā)起訪問的主機(jī)名稱、域名稱、終端名稱。

而且/etc/security/access.conf文件提供了很多范例供修改時參考,并且都給出了具體的說明,例如:

#禁止非root用戶通過tty1訪問相關(guān)服務(wù)
#-:ALL EXCEPT root:tty1

#禁止除了wheel、shutdown以及sync之外的所有用戶訪問相關(guān)服務(wù)
#-:ALL EXCEPT wheel shutdown sync:LOCAL

#禁止wheel用戶通過.win.tue.nl之外的其它它終端訪問相關(guān)服務(wù)
#-:wheel:ALL EXCEPT LOCAL .win.tue.nl

# 禁止下面的用戶從任何主機(jī)登錄。其它用戶可以從任意地方訪問相關(guān)服務(wù)
#-:wsbscaro wsbsecr wsbspac wsbsym wscosor wstaiwde:ALL

# root用戶允許通過cron來使用tty1到tty6終端訪問相關(guān)服務(wù)
#+ : root : cron crond :0 tty1 tty2 tty3 tty4 tty5 tty6

# 用戶root允許從下面的地址訪問相關(guān)服務(wù)
#+ : root : 192.168.200.1 192.168.200.4 192.168.200.9
#+ : root : 127.0.0.1

# 用戶root可以從192.168.201.網(wǎng)段訪問相關(guān)服務(wù)
#+ : root : 192.168.201.

# 用戶root可以從.foo.bar.org中任何主機(jī)訪問相關(guān)服務(wù)
#+ : root : .foo.bar.org

# 用戶root不允許從任何主機(jī)訪問相關(guān)服務(wù)
#- : root : ALL

# 用戶@nis_group和foo可以從任何主機(jī)訪問相關(guān)服務(wù)
#+ : @nis_group foo : ALL

# 用戶john只能從127.0.0.0/24來對本機(jī)相關(guān)服務(wù)進(jìn)行訪問
#+ : john : 127.0.0.0/24

# 用戶john可以通過ipv4和ipv6的地址對本機(jī)相關(guān)服務(wù)進(jìn)行訪問
#+ : john : ::ffff:127.0.0.0/127

# 用戶john可以通過ipv6的地址訪問本機(jī)相關(guān)服務(wù)
#+ : john : 2001:4ca0:0:101::1

# 用戶john可以通過ipv6的主機(jī)IP地址來訪問本機(jī)
#+ : john : 2001:4ca0:0:101:0:0:0:1

# 用戶john可以通過ipv6的IP地址和掩碼來訪問相關(guān)服務(wù)
#+ : john : 2001:4ca0:0:101::/64

# 開放所有用戶對本機(jī)所有相關(guān)服務(wù)的訪問
#- : ALL : ALL

示例說明(vsftp):
如果要在網(wǎng)絡(luò)內(nèi)架設(shè)一個FTP服務(wù)器,而且在該FTP服務(wù)器上需要強(qiáng)制地指定某個用戶只能通過某個IP地址登錄,這個時候pam_access.so模塊就派上用場了。假設(shè)我的FTP服務(wù)器是使用vsftp來構(gòu)建的,具體操作是:

1)修改FTP服務(wù)器的/etc/pam.d/vsftpd文件,在調(diào)用account接口處插入"account    required     pam_access.so"這行內(nèi)容,如下:
[root@centos6-test06 ~]# vim /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required pam_shells.so
auth       include  password-auth
account    include  password-auth
account    required     pam_access.so                 //添加這一行內(nèi)容
session    required     pam_loginuid.so
session    include  password-auth

上述配置表示當(dāng)針對FTP訪問執(zhí)行用戶類接口的時候會增加pam_access.so的認(rèn)證。

2)修改/etc/security/access.conf配置文件,
在文件底部添加下面的兩行:
[root@centos6-test06 ~]# vim /etc/security/access.conf
- : kevin : ALL EXCEPT 192.168.10.101
- : grace : ALL EXCEPT 192.168.10.102

前提是已經(jīng)在系統(tǒng)上事先建立了kevin和grace兩個用戶。上面的配置表示:
kevin用戶不能從192.168.10.101之外的任何客戶端訪問FTP服務(wù)器;
grace用戶不能從192.168.10.102之外的任何客戶端訪問FTP服務(wù)器。

3)修改/etc/vsftpd/vsftpd.conf文件,禁用匿名登錄:
[root@centos6-test06 ~]# vim /etc/vsftpd/vsftpd.conf
......
Anonymous_enable = NO 

這樣當(dāng)重啟vsftpd服務(wù)之后,用戶kevin將只能從192.168.10.101訪問ftp服務(wù),而grace將只能從192.168.10.102訪問ftp服務(wù)。
所以當(dāng)針對這種需求而且不想使用防火墻以及應(yīng)用程序自帶的認(rèn)證機(jī)制的時候,通過pam_access.so可以實(shí)現(xiàn)所需的效果。

2)pam_listfile.so

pam_listfile.so模塊的功能和pam_access.so模塊類似,目標(biāo)也是實(shí)現(xiàn)基于用戶/組,主機(jī)名/IP,終端的訪問控制。不過它實(shí)現(xiàn)的方式和pam_access.so會稍微有些不同,因?yàn)樗鼪]有專門的默認(rèn)配置文件。訪問控制是靠pam配置文件中的控制選項(xiàng)和一個自定義的配置文件來實(shí)現(xiàn)的。而且除了針對上述訪問源的控制之外,還能夠控制到ruser,rhost,所屬用戶組和登錄shell。所以有些用戶認(rèn)為它的功能似乎比pam_access.so更加靈活和強(qiáng)大一些。

對于pam_listfile.so的配置方法,可以參考vsftpd文件中對pam的調(diào)用方式。熟悉vsftpd的人都知道,在vsftpd默認(rèn)配置中,root用戶是不允許通過ftp方式直接訪問FTP服務(wù)器的。這個功能實(shí)際上是由/etc/vsftpd/vsftpd.conf,/etc/vsftpd/ftpusers和/etc/pam.d/vsftpd共同控制的。 因?yàn)樵?etc/pam.d/vsftpd中有這樣的一行配置:

[root@centos6-test06 ~]# cat /etc/pam.d/vsftpd
......
auth       required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

表示當(dāng)用戶試圖登錄FTP服務(wù)器的時候,會調(diào)用pam_listfile.so模塊來驗(yàn)證用戶是否可以登錄,這里item=user表示訪問控制是基于user即用戶實(shí)現(xiàn)的。那么哪些用戶可以登錄呢?就是除了file選項(xiàng)所定義的/etc/vsftpd/ftpusers文件之外的用戶,這是由另外一個選項(xiàng)sense=deny所決定的。而在/etc/vsftpd/vsftpd.conf中明確指定了對用戶的認(rèn)證需要通過/etc/pam.d/vsftpd中的配置調(diào)用pam模塊:

[root@centos6-test06 ~]# cat /etc/vsftpd/vsftpd.conf |grep pam_service_name
pam_service_name=vsftpd

而恰好root用戶又在/etc/vsftpd/ftpusers文件中,所以這成為了制約root登錄FTP服務(wù)器的一個必要條件(但不是唯一條件)。所以針對這種情況,要開放和允許root用戶登錄FTP的權(quán)限,至少有三種改法:

1)修改/etc/pam.d/vsftpd文件,將sense=deny改成sense=allow。這樣會正好將情況反轉(zhuǎn)過來,F(xiàn)TP服務(wù)器只允許/etc/vsftpd/ftpusers文件內(nèi)的用戶登錄;
2)修改/etc/pam.d/vsftpd文件,注釋掉調(diào)用pam_listfile.so那行。這樣FTP服務(wù)器在認(rèn)證用戶的時候?qū)⒉辉倏紤]pam_listfile.so模塊的任何限制;
3)將root從/etc/vsftpd/ftpuser文件中注釋掉;

不過需要注意的是,root用戶比較特殊,因?yàn)樗趘sftpd配置中的限制不僅僅來自于pam,vsftpd本身的配置中也對其做了限制。當(dāng)我們看/etc/vsftpd/user_list文件的時候,還將會看到這樣的配置說明:

[root@centos6-test06 vsftpd]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
........
........

表示當(dāng)vsftpd.conf中userlist_deny=NO的時候,系統(tǒng)將只允許user_list中的用戶登錄FTP服務(wù)器;如果userlist_deny=YES,情況將截然相反——此時user_list變成了黑名單,里面的用戶將一概不允許登錄FTP服務(wù)器。所以要徹底開放root登錄FTP的權(quán)限,我們還要在/etc/vsftpd/vsftpd.conf中增加userlist_deny=YES或者注釋掉user_list中的root。

不過不管怎么說,vsftpd中禁用root用戶的直接登錄是在絕大多數(shù)FTP服務(wù)器上默認(rèn)的安全措施,所以開放root權(quán)限時應(yīng)該慎重。

另外除了通過pam_listfile.so實(shí)現(xiàn)基于用戶的訪問控制之外,還可以實(shí)現(xiàn)基于其它條件的訪問控制。這個可以具體看看pam_listfile.so模塊的選項(xiàng)就會比較清楚了,使用pam_listfile.so模塊配置的格式分為五個部分:分別是item、onerr、sense、file以及apply。 其中:
a)item=[tty|user|rhost|ruser|group|shell]:定義了對哪些列出的目標(biāo)或者條件采用規(guī)則,顯然,這里可以指定多種不同的條件。
b)onerr=succeed|fail:定義了當(dāng)出現(xiàn)錯誤(比如無法打開配置文件)時的缺省返回值。
c)sense=allow|deny:定義了當(dāng)在配置文件中找到符合條件的項(xiàng)目時的控制方式。如果沒有找到符合條件的項(xiàng)目,則一般驗(yàn)證都會通過。
d)file=filename:用于指定配置文件的全路徑名稱。
e)apply=user|@group:定義規(guī)則適用的用戶類型(用戶或者組)。

而至于file文件的寫法就簡單了,每行一個用戶或者組名稱即可。所以,當(dāng)需要對其它服務(wù)進(jìn)行類似的訪問控制的時候,就可以照葫蘆畫瓢。例如現(xiàn)在需要在SSH服務(wù)器上對ssh客戶端實(shí)現(xiàn)基于用戶的訪問控制

示例說明一:
不允許bobo賬號通過ssh方式登錄。做法如下:

1)針對這種需求只需要更改/etc/pam.d/sshd文件,并在該文件中添加一行(一定要添加到第一行):
[root@centos6-test06 ~]# vim /etc/pam.d/sshd
auth required pam_listfile.so  item=user sense=deny file=/etc/pam.d/denyusers onerr=succeed
......

2)創(chuàng)建bobo賬號
[root@centos6-test06 ~]# useradd bobo
[root@centos6-test06 ~]# passwd bobo
Changing password for user bobo.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

3)建立文件/etc/pam.d/denyusers,并在文件中寫入用戶信息。
[root@centos6-test06 ~]# echo "bobo" > /etc/pam.d/denyusers
[root@centos6-test06 ~]# cat /etc/pam.d/denyusers
bobo

4)測試使用bobo賬號通過ssh方式登錄不上了
[root@centos6-test06 ~]# ssh -p22 bobo@localhost
bobo@localhost's password: 
Permission denied, please try again.
bobo@localhost's password:

表示用戶以ssh登錄必須要通過pam_listfile.so模塊進(jìn)行認(rèn)證,認(rèn)證的對象類型是用戶,采用的動作是禁止,禁止的目標(biāo)是/etc/pam.d/denyuser文件中所定義的用戶。
這樣在該條目添加到該文件之后,使用bobo賬號從其它主機(jī)遠(yuǎn)程ssh訪問服務(wù)器會出現(xiàn)密碼錯誤的提示,但是使用root或者其它用戶則訪問能夠成功!

再次強(qiáng)調(diào),要注意pam模塊使用的順序,剛才的規(guī)則一定要添加到/etc/pam.d/sshd文件的auth的第一行之前,否則不會生效?。。。?!

示例說明二:
僅僅允許kevin用戶可以通過ssh遠(yuǎn)程登錄。做法如下:

在/etc/pam.d/sshd文件中添加一條(務(wù)必添加到文件的第一行?。?br/>auth       required     pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed

linux pam指的是什么

添加兩個用戶kevin和grace

[root@centos6-test06 ~]# useradd kevin
[root@centos6-test06 ~]# passwd kevin
[root@centos6-test06 ~]# useradd grace
[root@centos6-test06 ~]# passwd grace

編輯file指定的文件,添加上一個用戶kevin(這一步是關(guān)鍵)

[root@centos6-test06 ~]# echo "kevin" >/etc/sshdusers          //文件/etc/sshdusers是在上面添加到/etc/pam.d/sshd中定義的

然后驗(yàn)證,發(fā)現(xiàn)使用kevin賬號能正常ssh登錄,使用grace賬號就不能正常ssh登錄了!

[root@centos6-test06 ~]# ssh -p22 kevin@localhost
kevin@localhost's password: 
Last login: Thu Mar 29 12:02:18 2018 from 192.168.10.206

[root@centos6-test06 ~]# ssh -p22 grace@localhost
grace@localhost's password: 
Permission denied, please try again.

[root@centos6-test06 ~]# ssh -p22 root@localhost
root@localhost's password: 
Permission denied, please try again.

注:此處如果root也使用ssh遠(yuǎn)程連接,也會受到pam_listfile.so限制的。

溫馨提示:
如果發(fā)生錯誤,Linux-PAM 可能會改變系統(tǒng)的安全性。這取決于你自己的選擇,你可以選擇不安全(開放系統(tǒng))和絕對安全(拒絕任何訪問)。通常,Linux-PAM 在發(fā)生錯誤時,傾向于后者。任何的配置錯誤都可能導(dǎo)致系統(tǒng)整個或者部分無法訪問。配置 Linux-PAM 時,可能遇到最大的問題可能就是 Linux-PAM 的配置文件/etc/pam.d/*被刪除了。如果發(fā)生這種事情,你的系統(tǒng)就會被鎖住。有辦法可以進(jìn)行恢復(fù),最好的方法就是用一個備份的鏡像來恢復(fù)系統(tǒng),或者登錄進(jìn)單用戶模式然后進(jìn)行正確的配置。

3)pam_limits.so模塊

pam_limits.so模塊的主要功能是限制用戶會話過程中對各種系統(tǒng)資源的使用情況。缺省情況下該模塊的配置文件是/etc/security/limits.conf。而該配置文件的基本格式實(shí)際上是由4個字段組成的表,其中具體限制的內(nèi)容包括:

Domain            type            item                                     value
用戶名/組名       軟/硬限制                                                   具體值
                                core——core文件大小 (KB)
                                data——最大數(shù)據(jù)大小(KB)
                                fsize——最大文件大小(KB)
                                memlock——最大可用內(nèi)存空間(KB)
                                nofile——最大可以打開的文件數(shù)量
                                rss——最大可駐留空間(KB)
                                stack——最大堆??臻g(KB)
                                cpu——最大CPU使用時間(MIN)
                                nproc——最大運(yùn)行進(jìn)程數(shù)
                                as——地址空間限制
                                maxlogins——用戶可以登錄到系統(tǒng)最多次數(shù)
                                locks——最大鎖定文件數(shù)目

需要注意的是,如果沒有任何限制可以使用"-"號,并且針對用戶限制的優(yōu)先級一般要比針對組限制的優(yōu)先級更高。使用pam_limits.so模塊的最常見的場景是在運(yùn)行Oracle數(shù)據(jù)庫的RHEL服務(wù)器中,因?yàn)橐话鉕racle數(shù)據(jù)庫在安裝之前,按照其官方文檔的說明需要先對某些用戶(Oracle)使用系統(tǒng)資源的情況進(jìn)行限制。所以我們總是能夠在Oracle數(shù)據(jù)庫服務(wù)器的/etc/security/limits.conf文件中看到類似這樣的配置:

[root@centos6-test06 ~]# vim /etc/security/limits.conf
.......
oracle           soft    nproc   2047
oracle           hard    nproc   16384
oracle           soft    nofile  1024
oracle           hard    nofile  65536

結(jié)合上面的配置文件說明,可知Oracle數(shù)據(jù)庫需要對Oracle用戶使用資源的情況進(jìn)行一些限制,包括: oracle用戶最大能開啟的進(jìn)程數(shù)不超過16384,最大能打開的文件數(shù)不超過65536。

至于soft和hard的區(qū)別,不同于磁盤配額中的軟限制和硬限制。普通用戶可以調(diào)整自己的soft limit但最高不能超過hard limit,而且除了root以外的普通用戶也不能夠隨意更改hard limit。該調(diào)整完成之后一般可以使用ulimit命令查看。

順便提一下,針對nofile,這個只是基于用戶層面的限制和調(diào)整方法?;谙到y(tǒng)層面的限制和調(diào)整方法是修改/etc/sysctl.conf文件,直接改fs.file-max參數(shù),調(diào)整之后sysctl –p生效。

示例說明:
pam_limits.so模塊也可以使用在對一般應(yīng)用程序使用的資源限制方面。如果需要在SSH服務(wù)器上對來自不同用戶的ssh訪問進(jìn)行限制,就可以調(diào)用該模塊來實(shí)現(xiàn)相關(guān)功能。例如,當(dāng)需要限制用戶bobo登錄到SSH服務(wù)器時的最大連接數(shù)(防止同一個用戶開啟過多的登錄進(jìn)程)。限制操作如下:

由于/etc/pam.d/system-auth中,默認(rèn)就會通過pam_limits.so 限制用戶最多使用多少系統(tǒng)資源
[root@centos6-test06 ~]# cat /etc/pam.d/system-auth|grep limits.so
session     required      pam_limits.so

因此只需要在/etc/security/limits.conf文件中增加一行對bobo用戶產(chǎn)生的連接數(shù)進(jìn)行限定:
[root@centos6-test06 ~]# vim /etc/security/limits.conf
......
bobo             hard    maxlogins       2

最后測試
從客戶端以bobo身份登錄SSH服務(wù)器時,在客戶端上可以打開兩個控制臺登錄。
但當(dāng)客戶端開啟第三個登錄窗口的時候會被服務(wù)器拒絕,但其它用戶不會受到限制。

注意:這樣限制的只是從客戶端以ssh方式登錄次數(shù)的場景,如果從xshell登錄,則不受限制!

4)pam_rootok.so模塊

一般情況下,pam_rootok.so模塊的主要作用是使uid為0的用戶,即root用戶能夠直接通過認(rèn)證而不用輸入密碼。pam_rootok.so模塊的一個典型應(yīng)用是插入到一些應(yīng)用程序的認(rèn)證配置文件中,當(dāng)root用戶執(zhí)行這些命令的時候可以不用輸入口令而直接通過認(rèn)證。比如說"su"命令,為什么當(dāng)以root用戶執(zhí)行"su"切換到普通用戶身份的時候是不需要輸入任何口令而可以直接切換過去?當(dāng)我們查看一下/etc/pam.d/su文件的內(nèi)容就不會奇怪了。因?yàn)樵撐募牡谝恍芯褪牵?/p>

[root@centos6-test06 ~]# cat /etc/pam.d/su
......
auth        sufficient  pam_rootok.so

而如果將該行配置注釋掉的情況下,就會發(fā)現(xiàn)即便以root用戶切換普通用戶的時候仍然要求輸入口令。

另外一種方法,只需要將上述的"sufficient"改成"required"即可。因?yàn)檫@樣,pam_rootok.so模塊的驗(yàn)證通過就成為了必要條件之一。

pam_rootok.so模塊的另外一個應(yīng)用是在chfn命令中。Chfn命令用于改變/etc/passwd中的用戶的說明字段。當(dāng)以root身份執(zhí)行chfn命令修改用戶信息的時候是不用輸入密碼的。但是以普通用戶身份執(zhí)行chfn則需要輸入密碼之后才能改變自己的用戶說明。這實(shí)際上也是因?yàn)樵?etc/pam.d/chfn配置文件中的第一行調(diào)用了pam_rootok.so的結(jié)果。

不過這里即便將該配置中的第一行注釋掉,root用戶通過chfn修改自己信息的時候仍然不需要使用密碼。所以恐怕效果不是很明顯。究其原因主要是很多PAM模塊對root用戶是不會產(chǎn)生限制的。

示例說明(禁用用戶間使用su切換命令):

su的缺點(diǎn)
1)不安全su工具在多人參與的系統(tǒng)管理中,并不是最好的選擇,su只適用于一兩個人參與管理的系統(tǒng),畢竟su并不能讓普通用戶受限的使用;超級用戶root密碼應(yīng)該掌握在少數(shù)用戶手中。
2)麻煩:需要把root密碼告知每個需要root權(quán)限的人。

可以在/etc/pam.d/su文件里設(shè)置禁止用戶使用su命令
[root@centos6-test06 ~]# vim /etc/pam.d/su
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
...........

a)以上標(biāo)紅的兩行是默認(rèn)狀態(tài)(即開啟第一行,注釋第二行),這種狀態(tài)下是允許所有用戶間使用su命令進(jìn)行切換的?。ɑ蛘邇尚卸甲⑨屢彩沁\(yùn)行所有用戶都能使用su命令,但root下使用su切換到其他普通用戶需要輸入密碼;如果第一行不注釋,則root使用su切換普通用戶就不需要輸入密碼)
b)如果開啟第二行,表示只有root用戶和wheel組內(nèi)的用戶才可以使用su命令。
c)如果注釋第一行,開啟第二行,表示只有wheel組內(nèi)的用戶才能使用su命令,root用戶也被禁用su命令。

5) pam_userdb.so模塊

pam_userdb.so模塊的主要作用是通過一個輕量級的Berkeley數(shù)據(jù)庫來保存用戶和口令信息。這樣用戶認(rèn)證將通過該數(shù)據(jù)庫進(jìn)行,而不是傳統(tǒng)的/etc/passwd和/etc/shadow或者其它的一些基于LDAP或者NIS等類型的網(wǎng)絡(luò)認(rèn)證。所以存在于Berkeley數(shù)據(jù)庫中的用戶也稱為虛擬用戶。

pam_userdb.so模塊的一個典型用途就是結(jié)合vsftpd配置基于虛擬用戶訪問的FTP服務(wù)器。

相對于本地用戶以及匿名用戶來說,虛擬用戶只是相對于FTP服務(wù)器而言才有用的用戶,這些用戶被嚴(yán)格地限定在pam_userdb數(shù)據(jù)庫當(dāng)中。所以虛擬用戶只能訪問FTP服務(wù)器所提供的資源,因而可以大大提高系統(tǒng)安全性。另外相對于匿名用戶而言,虛擬用戶必須通過用戶名和密碼才能夠訪問FTP的資源。這樣也提高了對FTP用戶下載的可管理性。

基于虛擬用戶實(shí)現(xiàn)的vsftpd的原理基本上是這樣一個過程:先定義一些專門針對FTP的虛擬用戶,然后將用戶信息加入到系統(tǒng)自帶的數(shù)據(jù)庫中(但不是passwd)從而生成一個訪問FTP的虛擬用戶列表,這里使用的數(shù)據(jù)庫是db4也就是Berkeley DB。然后可以通過使用pam_userdb.so模塊來調(diào)用該數(shù)據(jù)庫存儲用戶信息以及實(shí)現(xiàn)FTP用戶認(rèn)證。當(dāng)然同時也可以在系統(tǒng)中通過對配置文件的定義和劃分來實(shí)現(xiàn)對不同虛擬用戶不同類型的訪問控制。

6)pam_cracklib.so模塊

pam_cracklib.so是一個常用并且非常重要的PAM模塊。該模塊主要的作用是對用戶密碼的強(qiáng)健性進(jìn)行檢測。即檢查和限制用戶自定義密碼的長度、復(fù)雜度和歷史等。如不滿足上述強(qiáng)度的密碼將拒絕用戶使用。pam_cracklib.so比較重要和難于理解的是它的一些參數(shù)和計(jì)數(shù)方法,其常用參數(shù)包括:

debug:    將調(diào)試信息寫入日志;
type=xxx: 當(dāng)添加/修改密碼時,系統(tǒng)給出的缺省提示符是"New UNIX password:"以及"Retype UNIX password:",而使用該參數(shù)可以自定義輸入密碼的提示符,比如指定type=your own word;
retry=N:  定義登錄/修改密碼失敗時,可以重試的次數(shù);
Difok=N:  定義新密碼中必須至少有幾個字符要與舊密碼不同。但是如果新密碼中有1/2以上的字符與舊密碼不同時,該新密碼將被接受;
minlen=N: 定義用戶密碼的最小長度;
dcredit=N:定義用戶密碼中必須至少包含多少個數(shù)字;
ucredit=N:定義用戶密碼中必須至少包含多少個大寫字母;
lcredit=N:定義用戶密碼中必須至少包含多少個小些字母;
ocredit=N:定義用戶密碼中必須至少包含多少個特殊字符(除數(shù)字、字母之外);

特別要注意:
當(dāng)N>0時,N代表新密碼中最多可以有N個指定的字符?。?
當(dāng)N<0時,N代表新密碼中最少可以有N個指定的字符??!

同時建議重啟系統(tǒng)使之生效!

/etc/pam.d/login文件里包含了/etc/pam.d/system-auth文件的配置

[root@centos6-test06 ~]# cat /etc/pam.d/login|grep system-auth
auth       include      system-auth
account    include      system-auth
password   include      system-auth
session    include      system-auth

如下看pam_cracklib.so的一個應(yīng)用實(shí)例:在/etc/pam.d/system-auth中使用pam_cracklib.so來限制用戶修改自己密碼時必須滿足一定的強(qiáng)健性要求。

[root@centos6-test06 ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
 
-----------------------------------------------------------------------------
從上面使用pam_cracklib.so的策略看,要求用戶修改密碼時必須要滿足9位,并且密碼中至少要包含一個大寫字母、小寫字母、數(shù)字和特殊符號。
 
但是實(shí)際上像minlen和所有credit所對應(yīng)的數(shù)值可以是非0之外的正負(fù)整數(shù),那么這些數(shù)值到底表示什么意思呢?
很多人將其簡單地理解為某一類字符的位數(shù),其實(shí)遠(yuǎn)遠(yuǎn)沒有那么簡單。
 
下面我們對這些數(shù)值和關(guān)系做一個簡短的說明:
 
首先要明確整個環(huán)境中密碼的長度要滿足下面的計(jì)算公式:
計(jì)算公式:
最小密碼長度(minlen)應(yīng)該小于或者等于 dcredit+ucredit+lcredit+ocredit+其它分值 (同時滿足 * credit的條件)。
 
注意:
*credit=-1表示至少有一個的意思
*credit=N(N表示當(dāng)滿足條件的時候加N分,例如dcredit=2表示一個數(shù)字加2分,兩個數(shù)字加4分)
所以這里minlen其實(shí)更準(zhǔn)確的表述應(yīng)該是mincredit。
 
所以在下面的例子中,當(dāng)pam_cracklib.so的參數(shù)按如下方式指定:
password    requisite     pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=2 ucredit=0 lcredit=0 ocredit=0
 
那么當(dāng)用戶執(zhí)行命令修改密碼的時候:
[bobo@centos6-test06 ~]$ passwd
Changing password for user bobo.
Changing password for bobo
(current) UNIX password:
New UNIX password:                   輸入密碼"1\=poiuyt"   不成功      1個數(shù)字再加2分
 
此時密碼有一個數(shù)字,2分,其它的字符每個1分,總共10分,不滿足minlen的位數(shù)需求,所以該密碼不能通過。
BAD PASSWORD: is too simple
New UNIX password:                   輸入密碼"12\=poiuyt"   成功     2個數(shù)字再加2分
Retype new UNIX password:
 
此時密碼有兩個數(shù)字,4分,其它的字符每個1分,總共12分,滿足minlen的位數(shù)需求,所以密碼可以通過。
New UNIX password:                   輸入密碼"1\=poiuytre"   成功     1個數(shù)字再加2分
Retype new UNIX password:
 
此時密碼有1個數(shù)字,2分,其它的字符每個1分,總共12分,滿足minlen的位數(shù)需求,所以密碼可以通過。
 
因此通過上述的配置基本可以得出這樣的結(jié)論:
 
當(dāng)某類credit為正數(shù)N的時候,表示密碼中該類字符一個可以加N分;當(dāng)某類credit為負(fù)數(shù)N的時候,表示密碼中某類字符必須具備N個。時間關(guān)系我將不會一一演示。
 
所以當(dāng)輸入的密碼所有的字符總分大于或者等于minlen,并且滿足所有credit的要求,該密碼通過; 即:輸入的密碼長度(每個輸入值都算數(shù))+*credit(加分)>=minlen
 
所以pam_cracklib.so模塊在系統(tǒng)安全管理策略和管理中的用途是非常重要和廣泛的。

7)pam_pwhistroy.so模塊

pam_pwhistory.so模塊也是一個常用模塊,一般輔助pam_cracklib.so,pam_tally.so以及pam_unix.so等模塊來加強(qiáng)用戶使用密碼的安全度。不過pam_pwhistory.so模塊起的是另一類的作用,即專門為用戶建立一個密碼歷史檔案,防止用戶在一定時間內(nèi)使用已經(jīng)用過的密碼。

示例說明:(特別注意:/etc/pam.d/system-auth下的配置針對的是普通用戶,在root用戶下是無效的)
當(dāng)需要限定用戶在90天之內(nèi)不能重復(fù)使用以前曾經(jīng)使用過的10個密碼,那么具體操作方法是去修改/etc/pam.d/system-auth文件,在password接口處增加:

[root@centos6-test06 ~]# vim /etc/pam.d/system-auth
......
password  required  pam_cracklib.so  retry=3  password  required  pam_pwhistory.so enforce_for_root remember=10

----------------------------------------------------------------
此時用戶使用過的密碼將會記錄到/etc/security/opasswd文件中。但是pam_pwhistory.so并沒有什么選項(xiàng)可以限定密碼在多少天之內(nèi)無法被重復(fù)使用,
所以上述的90天是無法配置的。一個簡單的解決方法就是當(dāng)90天左右的時候,手動清空一次opasswd文件即可。

當(dāng)然,如果要實(shí)現(xiàn)同樣的功能除了pam_pwhistory.so模塊之外還有其它的辦法。比較常用的是pam_unix.so模塊。
具體方法是修改/etc/pam.d/system-auth文件,給pam_unix.so模塊里加上remember=10這個選項(xiàng),修改之后的配置文件為:
[root@centos6-test06 ~]# vim /etc/pam.d/system-auth
.......
password required pam_unix.so md5 remember=10 use_authtok

這樣系統(tǒng)將同樣記住10個已經(jīng)使用的密碼。

不過此時/etc/security/opasswd文件因?yàn)橛涗浟薔個使用過的密碼,所以安全性就十分關(guān)鍵了,所以要確保該文件只能被root用戶讀取和編輯:
[root@centos6-test06 ~]# touch /etc/security/opasswd
[root@centos6-test06 ~]# chown root:root /etc/security/opasswd
[root@centos6-test06 ~]# chmod 600 /etc/security/opasswd

==========總結(jié)幾個PAM模塊比較常見的實(shí)操案例===========

1)怎樣才能強(qiáng)迫用戶設(shè)置的密碼不能與過去3次內(nèi)的密碼重復(fù)?(特別注意:/etc/pam.d/system-auth下的配置針對的是普通用戶,在root用戶下是無效的)

修改/etc/pam.d/system-auth,增加pam_unix.so的參數(shù),如下:
[root@centos6-test06 ~]# vim /etc/pam.d/system-auth
......
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=3

2)如何要求用戶設(shè)置的密碼必須至少包含5個數(shù)字和3個特殊符號?

修改/etc/pam.d/system-auth,在password使用pam_cracklib.so設(shè)置的最后附加 dcredit=-5 ocredit=-3
[root@centos6-test06 ~]# vim /etc/pam.d/system-auth
......
password    requisite     pam_cracklib.so try_first_pass retry=3 dcredit=-5 ocredit=-3  

----------------------------------------------------------------------
同時注意:
密碼中的n個數(shù)字和n個特殊字符不能全部放在一起?。?/pre>

3)如何限制kevin用戶最多同時登陸4個?(同時可以限制root用戶)

這需要pam_limits.so模塊。由于/etc/pam.d/system-auth中,默認(rèn)就會通過pam_limits.so 限制用戶最多使用多少系統(tǒng)資源.
[root@centos6-test06 ~]# cat /etc/pam.d/system-auth|grep limits.so
session     required      pam_limits.so

因此只需要在/etc/security/limits.conf 中加入以下內(nèi)容:
[root@centos6-test06 ~]# vim /etc/security/limits.conf
......
kevin        hard       maxlogins       4

4)某用戶連續(xù)登陸失敗2次就鎖定該賬號,禁止登陸?(默認(rèn)只能嘗試登錄三次,由retry=N決定的)

現(xiàn)在很多地方都有限制用戶登錄的功能,Linux也是如此,當(dāng)你登錄失敗多次后就可以限制用戶登錄,從而起到保護(hù)電腦安全的作用,通過PAM模塊即可實(shí)現(xiàn)。
Linux有一個pam_tally2.so的PAM模塊,來限定用戶的登錄失敗次數(shù),如果次數(shù)達(dá)到設(shè)置的閾值,則鎖定用戶。
 
編譯PAM的配置文件
[root@centos6-test06 ~]# vi  /etc/pam.d/login    //在#%PAM-1.0下面添加一行
#%PAM-1.0
auth       required     pam_tally2.so  onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10
......
 
參數(shù)解釋:
onerr=fail         表示定義了當(dāng)出現(xiàn)錯誤(比如無法打開配置文件)時的缺省返回值;
even_deny_root     表示也限制root用戶;
deny               表示設(shè)置普通用戶和root用戶連續(xù)錯誤登陸的最大次數(shù),超過最大次數(shù),則鎖定該用戶;
unlock_time        表示設(shè)定普通用戶鎖定后,多少時間后解鎖,單位是秒;
root_unlock_time   表示設(shè)定root用戶鎖定后,多少時間后解鎖,單位是秒;
 
此處使用的是 pam_tally2模塊,如果不支持pam_tally2,可以使用pam_tally模塊。
另外,不同的pam版本,設(shè)置可能有所不同,具體使用方法,可以參照相關(guān)模塊的使用規(guī)則。
 
特別注意:
一定要將內(nèi)容添加到#%PAM-1.0的下面,即在第二行添加內(nèi)容,一定要寫在前面?。?
如果寫在后面,雖然用戶被鎖定,但是只要用戶輸入正確的密碼,還是可以登錄的!
 
------------------------------------------
也可以將上面的內(nèi)容添加到/etc/pam.d/password-auth文件中,因?yàn)?etc/pam.d/login文件中包括(include)了password-auth配置
[root@centos6-test06 ~]# vim /etc/pam.d/system-auth      //同樣添加到auth區(qū)域的第一行
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth       required     pam_tally2.so  onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10
 
========================================================================================
特別注意:
上面的配置只是限制了用戶從tty終端登錄,而沒有限制遠(yuǎn)程ssh登錄,如果想限制遠(yuǎn)程登錄,需要在/etc/pam.d/sshd文件里配置
[root@centos6-test06 ~]# vim /etc/pam.d/sshd            //同樣添加到auth區(qū)域的第一行
#%PAM-1.0
auth       required     pam_tally2.so  onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10
 
這樣的話,使用ssh遠(yuǎn)程登錄的時候,連續(xù)輸入兩次錯誤密碼,就會被鎖定了!
如果輸入錯誤次數(shù)沒有達(dá)到deny設(shè)置的次數(shù),再輸入正確密碼就可以登錄。
 
 
驗(yàn)證:
[bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost
kevin@localhost's password:                     //第一次輸入密碼錯誤
Permission denied, please try again.   
kevin@localhost's password:                     //第二次輸入密碼錯誤,此時已被鎖定
Permission denied, please try again.
kevin@localhost's password:                     //接著第三次再輸入正確密碼,還是無法登錄進(jìn)去,因?yàn)橐驯绘i定300s了!
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
 
因?yàn)楸绘i定300s了!在這個時間內(nèi),就算再輸入正確密碼也是無法順利登錄到機(jī)器的!
[bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost
kevin@localhost's password:
Permission denied, please try again.
 
接著可以解鎖!!
查看用戶登錄失敗的次數(shù)。由下面命令可知,已經(jīng)輸錯3次了
[root@centos6-test06 ~]# pam_tally2 --user kevin
Login           Failures Latest failure     From
kevin               3    03/30/18 07:35:49  ::1
 
解鎖指定用戶
[root@centos6-test06 ~]# pam_tally2 -r -u kevin
Login           Failures Latest failure     From
kevin               3    03/30/18 07:35:49  ::1
[root@centos6-test06 ~]# pam_tally2 --user kevin
Login           Failures Latest failure     From
kevin               0
 
接著,就可以輸入正確密碼登錄機(jī)器了
[bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost
kevin@localhost's password:
Last login: Fri Mar 30 07:40:04 2018 from ::1
[kevin@centos6-test06 ~]$

5)如何限制root只能從kevin.com這臺計(jì)算機(jī)使用ssh遠(yuǎn)程登陸?

由于ssh服務(wù)器的程序文件使用sshd,而sshd剛好支持PAM,驗(yàn)證如下:
[root@centos6-test06 ~]# ldd /usr/sbin/sshd | grep libpam.so  
    libpam.so.0 => /lib64/libpam.so.0 (0x00007f36f254d000)

修改/etc/pam.d/sshd,加入第二行,如下:
[root@centos6-test06 ~]# vim /etc/pam.d/sshd 
auth       include      system-auth  
account    required     pam_access.so accessfile=/etc/deny_sshd  
account    required     pam_nologin.so  

創(chuàng)建/etc/deny_sshd文件
[root@centos6-test06 ~]# touch /etc/deny_sshd
[root@centos6-test06 ~]# vim /etc/deny_sshd
-:root:ALL EXCEPT kevin.com

關(guān)于“l(fā)inux pam指的是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI