共計 29358 個字符,預計需要花費 74 分鐘才能閱讀完成。
這篇文章主要介紹“linux pam 指的是什么”的相關知識,丸趣 TV 小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“linux pam 指的是什么”文章能幫助大家解決問題。
在 linux 中,PAM 是指可動態加載驗證模塊,是一套共享庫,使本地系統管理員可以隨意選擇程序的認證方式;因為可以按需要動態的對驗證的內容進行變更,所以可以大大提高驗證的靈活性。PAM 使用配置“/etc/pam.d/”下的文件,來管理對程序的認證方式。應用程序 調用相應的配置文件,從而調用本地的認證模塊。
在 Linux 中執行有些程序時,這些程序在執行前首先要對啟動它的用戶進行認證,符合一定的要求之后才允許執行,例如 login, su 等。在 Linux 中進行身份或是狀態的驗證程序是由 PAM 來進行的,PAM(Pluggable Authentication Modules)可動態加載驗證模塊,因為可以按需要動態的對驗證的內容進行變更,所以可以大大提高驗證的靈活性。
一、PAM 模塊介紹
Linux-PAM(即 linux 可插入認證模塊)是一套共享庫,使本地系統管理員可以隨意選擇程序的認證方式。換句話說,不用 (重新編寫) 重新編譯一個包含 PAM 功能的應用程序,就可以改變它使用的認證機制,這種方式下,就算升級本地認證機制,也不用修改程序。
PAM 使用配置 /etc/pam.d/ 下的文件,來管理對程序的認證方式。應用程序 調用相應的配置文件,從而調用本地的認證模塊。模塊放置在 /lib/security 下,以加載動態庫的形式進,像我們使用 su 命令時,系統會提示你輸入 root 用戶的密碼。這就是 su 命令通過調用 PAM 模塊實現的。
PAM 的模塊類型
Linux-PAM 有四種模塊類型, 分別代表四種不同的任務,它們是:
認證管理(auth)
賬號管理(account)
會話管理(session)
密碼 (password) 管理
一個類型可能有多行,它們按順序依次由 PAM 模塊調用。
vi /etc/pam.d/system-auth
如下圖:
配置分為基本分為四列:模塊名稱、控制、模塊庫文件和參數。
其中模塊主要分四種,具體功能如下:
auth 模塊: 用來對用戶的身份進行識別。如: 提示用戶輸入密碼,或判斷用戶是否為 root 等。
auth 模塊: 對帳號的各項屬性進行檢查。如: 是否允許登錄,是否達到最大用戶數,或是 root 用戶是否允許在這個終端登錄等。
session 模塊: 這個模塊用來定義用戶登錄前的,及用戶退出后所要進行的操作。如: 登錄連接信息,用戶數據的打開與關閉,掛載文件系統等。
password 模塊: 使用用戶信息來更新。如: 修改用戶密碼。
總結:auth、account、password、session,auth 是一個標識符,說明要干的事情,auth 處理登錄時驗證方面的事,account、password、session 和登錄時驗證沒啥關系,比如 password 是處理更改密碼時的事情。
二、PAM 的配置文件說明
PAM 配置文件有下面兩種寫法:
1)寫在 /etc/pam.conf 文件中,但 centos6 之后的系統中,這個文件就沒有了。
2)將 PAM 配置文件放到 /etc/pam.d/ 目錄下, 其規則內容都是不包含 service 部分的,即不包含服務名稱,而 /etc/pam.d 目錄下文件的名字就是服務名稱。如:vsftpd,login 等,只是少了最左邊的服務名列。如:/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 模塊文件內容看,可以將 pam 配置文件分為四列,
第一列代表模塊類型
第二列代表控制標記
第三列代表模塊路徑
第四列代表模塊參數
1)第一列:PAM 的模塊類型
Linux-PAM 有四種模塊類型,分別代表四種不同的任務,它們是:
認證管理(auth),賬號管理(account),會話管理(session)和密碼(password)管理,一個類型可能有多行,它們按順序依次由 PAM 模塊調用。
對以上四種模塊類型進一步補充說明:
auth:表示鑒別類接口模塊類型用于檢查用戶和密碼,并分配權限;
這種類型的模塊為用戶驗證提供兩方面服務。讓應用程序提示用戶輸入密碼或者其他標記,確認用戶合法性;通過他的憑證許可權限,設定組成員關系或者其他優先權。
account:表示賬戶類接口,主要負責賬戶合法性檢查,確認帳號是否過期,是否有權限登錄系統等;
這種模塊執行的是基于非驗證的帳號管理。他主要用于限制 / 允許用戶對某個服務的訪問時間,當前有效的系統資源(最多可以多少用戶),限制用戶位置(例如:root 只能通過控制臺登錄)。
多數情況下 auth 和 account 會一起用來對用戶登錄和使用服務的情況進行限制。這樣的限制會更加完整。比如下面是一個具體的例子:login 是一個應用程序。Login 要完成兩件工作——首先查詢用戶,然后為用戶提供所需的服務,例如提供一個 shell 程序。通常 Login 要求用戶輸入名稱和密碼進行驗證。當用戶名輸入的時候,系統自然會去比對該用戶是否是一個合法用戶,是否在存在于本地或者遠程的用戶數據庫中。如果該賬號確實存在,那么是否過期。這些個工作是由 account 接口來負責。
如果用戶滿足上述登錄的前提條件,那么它是否具有可登錄系統的口令,口令是否過期等。這個工作就要由 auth 接口來負責了,他通常會將用戶口令信息加密并提供給本地(/etc/shadow)或者遠程的 (ldap,kerberos 等) 口令驗證方式進行驗證。
如果用戶能夠登錄成功,證明 auth 和 account 的工作已經完成。但整個驗證過程并沒有完全結束。因為還有一些其他的問題沒有得到確認。例如,用戶能夠在服務器上同時開啟多少個窗口登錄,用戶可以在登錄之后使用多少終端多長時間,用戶能夠訪問哪些資源和不能訪問哪些資源等等。也就是說登錄之后的后續驗證和環境定義等還需要其他的接口。這就是我們下面要提到的兩組接口:
session:會話類接口。實現從用戶登錄成功到退出的會話控制;
處理為用戶提供服務之前 / 后需要做的些事情。包括:開啟 / 關閉交換數據的信息,監視目錄等,設置用戶會話環境等。也就是說這是在系統正式進行服務提供之前的最后一道關口。
password:口令類接口。控制用戶更改密碼的全過程。也就是有些資料所說的升級用戶驗證標記。
注意:上述接口在使用的時候,每行只能指定一種接口類型,如果程序需要多種接口的話,可在多行中分別予以規定。
2)第二列:PAM 的控制標記
PAM 使用控制標記來處理和判斷各個模塊的返回值.(在此只說明簡單的認證標記)。
規定如何處理 PAM 模塊鑒別認證的結果,簡而言之就是鑒別認證成功或者失敗之后會發生什么事,如何進行控制。單個應用程序可以調用多種底層模塊,通常稱為“堆疊”。對應于某程序按照配置文件中出現順序執行的所有模塊成為“堆”,堆中的各模塊的地位與出錯時的處理方式由 control_flag 欄的取值決定,他的四種可能的取值分別為 required、Requisite、sufficient 或_optional:
required:表示該行以及所涉及模塊的成功是用戶通過鑒別的必要條件。換句話說,只有當對應于應用程序的所有帶 required 標記的模塊全部成功后,該程序才能通過鑒別。同時,如果任何帶 required 標記的模塊出現了錯誤,PAM 并不立刻將錯誤消息返回給應用程序,而是在所有模塊都調用完畢后才將錯誤消息返回調用他的程序。反正說白了,就是必須將所有的模塊都執行一次,其中任何一個模塊驗證出錯,驗證都會繼續進行,并在執行完成之后才返回錯誤信息。這樣做的目的就是不讓用戶知道自己被哪個模塊拒絕,通過一種隱蔽的方式來保護系統服務。就像設置防火墻規則的時候將拒絕類的規則都設置為 drop 一樣,以致于用戶在訪問網絡不成功的時候無法準確判斷到底是被拒絕還是目標網絡不可達。
requisite:與 required 相仿,只有帶此標記的模塊返回成功后,用戶才能通過鑒別。不同之處在于其一旦失敗就不再執行堆中后面的其他模塊,并且鑒別過程到此結束,同時也會立即返回錯誤信息。與上面的 required 相比,似乎要顯得更光明正大一些。
sufficient:表示該行以及所涉及模塊驗證成功是用戶通過鑒別的充分條件。也就是說只要標記為 sufficient 的模塊一旦驗證成功,那么 PAM 便立即向應用程序返回成功結果而不必嘗試任何其他模塊。即便后面的層疊模塊使用了 requisite 或者 required 控制標志也是一樣。當標記為 sufficient 的模塊失敗時,sufficient 模塊會當做 optional 對待。因此擁有 sufficient 標志位的配置項在執行驗證出錯的時候并不會導致整個驗證失敗,但執行驗證成功之時則大門敞開。所以該控制位的使用務必慎重。
optional:他表示即便該行所涉及的模塊驗證失敗用戶仍能通過認證。在 PAM 體系中,帶有該標記的模塊失敗后將繼續處理下一模塊。也就是說即使本行指定的模塊驗證失敗,也允許用戶享受應用程序提供的服務。使用該標志,PAM 框架會忽略這個模塊產生的驗證錯誤,繼續順序執行下一個層疊模塊。
include:表示在驗證過程中調用其他的 PAM 配置文件。在 RHEL 系統中有相當多的應用通過完整調用 /etc/pam.d/system-auth 來實現認證而不需要重新逐一去寫配置項。這也就意味著在很多時候只要用戶能夠登錄系統,針對絕大多數的應用程序也能同時通過認證。
另外還有一種比較復雜的格式為 value = action 的語法來設置控制標志,標志之間會以空格分開。格式如下:
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) 能夠用來設置上面的返回值無法表達的行為。
actionN 可以是一個非負整數或者是下面的記號之一:ignore、ok、done、bad、die 和 reset。如果是非負整數 J,就表示需要忽略后面 J 個同樣類型的模塊。通過這種方式,系統管理者可以更加靈活地設置層疊模塊,模塊的層疊路徑由單個模塊的反應決定。
關于這幾個記號的詳細解釋:
ignore:如果使用層疊模塊,那么這個模塊的返回值將被忽略,不會被應用程序知道。
bad:他表示這個返回碼應該被看作是模塊驗證失敗的標志。如果這個模塊是層疊模塊的第一個驗證失敗的模塊,那么他的狀態值就是整個層疊模塊驗證的狀態值和結果。
die:終止層疊模塊驗證過程,立刻返回到應用程序。
ok:告訴 PAM 這個模塊的返回值將直接作為所有層疊模塊的返回值。也就是說,如果這個模塊前面的模塊返回狀態是 PAM_SUCCESS,那這個返回值就會覆蓋前面的返回狀態。注意:如果前面的模塊的返回狀態表示模塊驗證失敗,那么不能使用這個返回值再加以覆蓋。
done:終止后續層疊模塊的驗證,把控制權立刻交回應用程序。
reset:清除所有層疊模塊的返回狀態,從下一個層疊模塊重新開始驗證。
3)模塊路徑
模塊路徑. 即要調用模塊的位置. 如果是 64 位系統,一般保存在 /lib64/security, 如: pam_unix.so,同一個模塊, 可以出現在不同的類型中. 它在不同的類型中所執行的操作都不相同. 這是由于每個模塊,針對不同的模塊類型, 編制了不同的執行函數。
4)模塊參數
模塊參數, 即傳遞給模塊的參數. 參數可以有多個, 之間用空格分隔開, 如:password required pam_unix.so nullok obscure min=4 max=8 md5。
三、PAM 模塊的工作原理和流程
以 RHEL 系統為例,當 pam 安裝之后有兩大部分:在 /lib/security 目錄下的各種 pam 模塊以及 /etc/pam.d 和 /etc/pam.d 目錄下的針對各種服務和應用已經定義好的 pam 配置文件。當某一個有認證需求的應用程序需要驗證的時候,一般在應用程序中就會定義負責對其認證的 PAM 配置文件。以 vsftpd 為例,在它的配置文件 /etc/vsftpd/vsftpd.conf 中就有這樣一行定義:
pam_service_name=vsftpd
表示登錄 FTP 服務器的時候進行認證是根據 /etc/pam.d/vsftpd 文件定義的內容進行。
那么,當程序需要認證的時候已經找到相關的 pam 配置文件,認證過程是如何進行的?下面我們將通過解讀 /etc/pam.d/system-auth 文件予以說明。
首先要聲明一點的是:system-auth 是一個非常重要的 pam 配置文件,主要負責用戶登錄系統的認證工作。而且該文件不僅僅只是負責用戶登錄系統認證,其它的程序和服務通過 include 接口也可以調用到它,從而節省了很多重新自定義配置的工作。所以應該說該文件是系統安全的總開關和核心的 pam 配置文件。
下面是 /etc/pam.d/system-auth 文件的全部內容:
[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
第一部分表示,當用戶登錄的時候,首先會通過 auth 類接口對用戶身份進行識別和密碼認證。所以在該過程中驗證會經過幾個帶 auth 的配置項。
其中的第一步是通過 pam_env.so 模塊來定義用戶登錄之后的環境變量,pam_env.so 允許設置和更改用戶登錄時候的環境變量,默認情況下,若沒有特別指定配置文件,將依據 /etc/security/pam_env.conf 進行用戶登錄之后環境變量的設置。
然后通過 pam_unix.so 模塊來提示用戶輸入密碼,并將用戶密碼與 /etc/shadow 中記錄的密碼信息進行對比,如果密碼比對結果正確則允許用戶登錄,而且該配置項的使用的是“sufficient”控制位,即表示只要該配置項的驗證通過,用戶即可完全通過認證而不用再去走下面的認證項。不過在特殊情況下,用戶允許使用空密碼登錄系統,例如當將某個用戶在 /etc/shadow 中的密碼字段刪除之后,該用戶可以只輸入用戶名直接登錄系統。
下面的配置項中,通過 pam_succeed_if.so 對用戶的登錄條件做一些限制,表示允許 uid 大于 500 的用戶在通過密碼驗證的情況下登錄,在 Linux 系統中,一般系統用戶的 uid 都在 500 之內,所以該項即表示允許使用 useradd 命令以及默認選項建立的普通用戶直接由本地控制臺登錄系統。
最后通過 pam_deny.so 模塊對所有不滿足上述任意條件的登錄請求直接拒絕,pam_deny.so 是一個特殊的模塊,該模塊返回值永遠為否,類似于大多數安全機制的配置準則,在所有認證規則走完之后,對不匹配任何規則的請求直接拒絕。
第二部分的三個配置項主要表示通過 account 賬戶類接口來識別賬戶的合法性以及登錄權限。
第一行仍然使用 pam_unix.so 模塊來聲明用戶需要通過密碼認證。第二行承認了系統中 uid 小于 500 的系統用戶的合法性。之后對所有類型的用戶登錄請求都開放控制臺。
第三部分會通過 password 口另類接口來確認用戶使用的密碼或者口令的合法性。第一行配置項表示需要的情況下將調用 pam_cracklib 來驗證用戶密碼復雜度。如果用戶輸入密碼不滿足復雜度要求或者密碼錯,最多將在三次這種錯誤之后直接返回密碼錯誤的提示,否則期間任何一次正確的密碼驗證都允許登錄。需要指出的是,pam_cracklib.so 是一個常用的控制密碼復雜度的 pam 模塊,關于其用法舉例我們會在之后詳細介紹。之后帶 pam_unix.so 和 pam_deny.so 的兩行配置項的意思與之前類似。都表示需要通過密碼認證并對不符合上述任何配置項要求的登錄請求直接予以拒絕。不過用戶如果執行的操作是單純的登錄,則這部分配置是不起作用的。
第四部分主要將通過 session 會話類接口為用戶初始化會話連接。其中幾個比較重要的地方包括,使用 pam_keyinit.so 表示當用戶登錄的時候為其建立相應的密鑰環,并在用戶登出的時候予以撤銷。不過該行配置的控制位使用的是 optional,表示這并非必要條件。之后通過 pam_limits.so 限制用戶登錄時的會話連接資源,相關 pam_limit.so 配置文件是 /etc/security/limits.conf,默認情況下對每個登錄用戶都沒有限制。關于該模塊的配置方法在后面也會詳細介紹。
可見,不同應用程序通過配置文件在認證過程中調用不同的 pam 模塊來定制具體的認證流程。其中我們不難看出,其實可以根據實際的需要對 pam 的配置文件進行修改以滿足不同的認證需求,例如下面的例子:
#%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
在其中就增加了對用戶密碼修改時復雜度的限制,用戶多次錯誤輸入密碼之后的鎖定限制以及用戶使用密碼歷史等限制選項。
所以我們通過對上述 system-auth 配置文件的修改,模塊的增加和選項的變化,從很大的程度上增加了用戶登錄驗證的安全性要求。我們會在之后的文章中對該配置進行詳細說明。
另外也一定需要注意,在整個的 PAM 配置文件當中,配置項以及模塊調用的邏輯順序非常關鍵。因為 PAM 是按照配置項的先后順序來進行驗證。錯誤的模塊調用順序很可能導致嚴重的安全問題甚至系統錯誤。所以對 PAM 配置進行修改的時候務必要考慮這一點。
四、常用的 PAM 模塊介紹
PAM 模塊結合管理類型說明 pam_unix.so
auth
提示用戶輸入密碼, 并與 /etc/shadow 文件相比對. 匹配返回 0
account 檢查用戶的賬號信息(包括是否過期等). 帳號可用時, 返回 0.password 修改用戶的密碼. 將用戶輸入的密碼, 作為用戶的新密碼更新 shadow 文件 pam_shells.so
auth
account
如果用戶想登錄系統,那么它的 shell 必須是在 /etc/shells 文件中之一的 shellpam_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
訪問應用程的控制開關 pam_cracklib.sopassword
這個模塊可以插入到一個程序的密碼棧中, 用于檢查密碼的強度.
pam_limits.sosession 定義使用系統資源的上限,root 用戶也會受此限制,可以通過 /etc/security/limits.conf 或 /etc/security/limits.d/*.conf 來設定
五、PAM 模式使用說明
1)pam_access.so 模塊
pam_access.so 模塊主要的功能和作用是根據主機名(包括普通主機名或者 FQDN)、IP 地址和用戶實現全面的訪問控制。pam_access.so 模塊的具體工作行為根據配置文件 /etc/security/access.conf 來決定。該配置文件的主體包含了三個字段——權限、用戶和訪問發起方。格式上是一個用 隔開的表。
第一個字段:權限(permission),使用 + 表示授予權限,用 – 表示禁止權限。
第二個字段:用戶(user),定義了用戶、組以及用 @ 表示的在不同主機上的同名用戶和同一主機上不同名用戶。
第三個字段:訪問發起方(origins),定義了發起訪問的主機名稱、域名稱、終端名稱。
而且 /etc/security/access.conf 文件提供了很多范例供修改時參考,并且都給出了具體的說明,例如:
# 禁止非 root 用戶通過 tty1 訪問相關服務
#-:ALL EXCEPT root:tty1
#禁止除了 wheel、shutdown 以及 sync 之外的所有用戶訪問相關服務
#-:ALL EXCEPT wheel shutdown sync:LOCAL
#禁止 wheel 用戶通過.win.tue.nl 之外的其它它終端訪問相關服務
#-:wheel:ALL EXCEPT LOCAL .win.tue.nl
# 禁止下面的用戶從任何主機登錄。其它用戶可以從任意地方訪問相關服務
#-:wsbscaro wsbsecr wsbspac wsbsym wscosor wstaiwde:ALL
# root 用戶允許通過 cron 來使用 tty1 到 tty6 終端訪問相關服務
#+ : root : cron crond :0 tty1 tty2 tty3 tty4 tty5 tty6
# 用戶 root 允許從下面的地址訪問相關服務
#+ : root : 192.168.200.1 192.168.200.4 192.168.200.9
#+ : root : 127.0.0.1
# 用戶 root 可以從 192.168.201. 網段訪問相關服務
#+ : root : 192.168.201.
# 用戶 root 可以從.foo.bar.org 中任何主機訪問相關服務
#+ : root : .foo.bar.org
# 用戶 root 不允許從任何主機訪問相關服務
#- : root : ALL
# 用戶 @nis_group 和 foo 可以從任何主機訪問相關服務
#+ : @nis_group foo : ALL
# 用戶 john 只能從 127.0.0.0/24 來對本機相關服務進行訪問
#+ : john : 127.0.0.0/24
# 用戶 john 可以通過 ipv4 和 ipv6 的地址對本機相關服務進行訪問
#+ : john : ::ffff:127.0.0.0/127
# 用戶 john 可以通過 ipv6 的地址訪問本機相關服務
#+ : john : 2001:4ca0:0:101::1
# 用戶 john 可以通過 ipv6 的主機 IP 地址來訪問本機
#+ : john : 2001:4ca0:0:101:0:0:0:1
# 用戶 john 可以通過 ipv6 的 IP 地址和掩碼來訪問相關服務
#+ : john : 2001:4ca0:0:101::/64
# 開放所有用戶對本機所有相關服務的訪問
#- : ALL : ALL
示例說明(vsftp):
如果要在網絡內架設一個 FTP 服務器,而且在該 FTP 服務器上需要強制地指定某個用戶只能通過某個 IP 地址登錄,這個時候 pam_access.so 模塊就派上用場了。假設我的 FTP 服務器是使用 vsftp 來構建的,具體操作是:
1)修改 FTP 服務器的 /etc/pam.d/vsftpd 文件,在調用 account 接口處插入 account required pam_access.so 這行內容,如下:[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 // 添加這一行內容
session required pam_loginuid.so
session include password-auth
上述配置表示當針對 FTP 訪問執行用戶類接口的時候會增加 pam_access.so 的認證。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
前提是已經在系統上事先建立了 kevin 和 grace 兩個用戶。上面的配置表示:kevin 用戶不能從 192.168.10.101 之外的任何客戶端訪問 FTP 服務器;grace 用戶不能從 192.168.10.102 之外的任何客戶端訪問 FTP 服務器。3)修改 /etc/vsftpd/vsftpd.conf 文件,禁用匿名登錄:[root@centos6-test06 ~]# vim /etc/vsftpd/vsftpd.conf
......
Anonymous_enable = NO
這樣當重啟 vsftpd 服務之后,用戶 kevin 將只能從 192.168.10.101 訪問 ftp 服務,而 grace 將只能從 192.168.10.102 訪問 ftp 服務。所以當針對這種需求而且不想使用防火墻以及應用程序自帶的認證機制的時候,通過 pam_access.so 可以實現所需的效果。
2)pam_listfile.so
pam_listfile.so 模塊的功能和 pam_access.so 模塊類似,目標也是實現基于用戶 / 組,主機名 /IP,終端的訪問控制。不過它實現的方式和 pam_access.so 會稍微有些不同,因為它沒有專門的默認配置文件。訪問控制是靠 pam 配置文件中的控制選項和一個自定義的配置文件來實現的。而且除了針對上述訪問源的控制之外,還能夠控制到 ruser,rhost,所屬用戶組和登錄 shell。所以有些用戶認為它的功能似乎比 pam_access.so 更加靈活和強大一些。
對于 pam_listfile.so 的配置方法,可以參考 vsftpd 文件中對 pam 的調用方式。熟悉 vsftpd 的人都知道,在 vsftpd 默認配置中,root 用戶是不允許通過 ftp 方式直接訪問 FTP 服務器的。這個功能實際上是由 /etc/vsftpd/vsftpd.conf,/etc/vsftpd/ftpusers 和 /etc/pam.d/vsftpd 共同控制的。因為在 /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
表示當用戶試圖登錄 FTP 服務器的時候,會調用 pam_listfile.so 模塊來驗證用戶是否可以登錄,這里 item=user 表示訪問控制是基于 user 即用戶實現的。那么哪些用戶可以登錄呢?就是除了 file 選項所定義的 /etc/vsftpd/ftpusers 文件之外的用戶,這是由另外一個選項 sense=deny 所決定的。而在 /etc/vsftpd/vsftpd.conf 中明確指定了對用戶的認證需要通過 /etc/pam.d/vsftpd 中的配置調用 pam 模塊:
[root@centos6-test06 ~]# cat /etc/vsftpd/vsftpd.conf |grep pam_service_name
pam_service_name=vsftpd
而恰好 root 用戶又在 /etc/vsftpd/ftpusers 文件中,所以這成為了制約 root 登錄 FTP 服務器的一個必要條件(但不是唯一條件)。所以針對這種情況,要開放和允許 root 用戶登錄 FTP 的權限,至少有三種改法:
1)修改 /etc/pam.d/vsftpd 文件,將 sense=deny 改成 sense=allow。這樣會正好將情況反轉過來,FTP 服務器只允許 /etc/vsftpd/ftpusers 文件內的用戶登錄;2)修改 /etc/pam.d/vsftpd 文件,注釋掉調用 pam_listfile.so 那行。這樣 FTP 服務器在認證用戶的時候將不再考慮 pam_listfile.so 模塊的任何限制;3)將 root 從 /etc/vsftpd/ftpuser 文件中注釋掉;
不過需要注意的是,root 用戶比較特殊,因為它在 vsftpd 配置中的限制不僅僅來自于 pam,vsftpd 本身的配置中也對其做了限制。當我們看 /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.
........
........
表示當 vsftpd.conf 中 userlist_deny=NO 的時候,系統將只允許 user_list 中的用戶登錄 FTP 服務器;如果 userlist_deny=YES,情況將截然相反——此時 user_list 變成了黑名單,里面的用戶將一概不允許登錄 FTP 服務器。所以要徹底開放 root 登錄 FTP 的權限,我們還要在 /etc/vsftpd/vsftpd.conf 中增加 userlist_deny=YES 或者注釋掉 user_list 中的 root。
不過不管怎么說,vsftpd 中禁用 root 用戶的直接登錄是在絕大多數 FTP 服務器上默認的安全措施,所以開放 root 權限時應該慎重。
另外除了通過 pam_listfile.so 實現基于用戶的訪問控制之外,還可以實現基于其它條件的訪問控制。這個可以具體看看 pam_listfile.so 模塊的選項就會比較清楚了,使用 pam_listfile.so 模塊配置的格式分為五個部分:分別是 item、onerr、sense、file 以及 apply。其中:
a)item=[tty|user|rhost|ruser|group|shell]:定義了對哪些列出的目標或者條件采用規則,顯然,這里可以指定多種不同的條件。
b)onerr=succeed|fail:定義了當出現錯誤(比如無法打開配置文件)時的缺省返回值。
c)sense=allow|deny:定義了當在配置文件中找到符合條件的項目時的控制方式。如果沒有找到符合條件的項目,則一般驗證都會通過。
d)file=filename:用于指定配置文件的全路徑名稱。
e)apply=user|@group:定義規則適用的用戶類型(用戶或者組)。
而至于 file 文件的寫法就簡單了,每行一個用戶或者組名稱即可。所以,當需要對其它服務進行類似的訪問控制的時候,就可以照葫蘆畫瓢。例如現在需要在 SSH 服務器上對 ssh 客戶端實現基于用戶的訪問控制
示例說明一:
不允許 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)創建 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
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 模塊進行認證,認證的對象類型是用戶,采用的動作是禁止,禁止的目標是 /etc/pam.d/denyuser 文件中所定義的用戶。這樣在該條目添加到該文件之后,使用 bobo 賬號從其它主機遠程 ssh 訪問服務器會出現密碼錯誤的提示,但是使用 root 或者其它用戶則訪問能夠成功!再次強調,要注意 pam 模塊使用的順序,剛才的規則一定要添加到 /etc/pam.d/sshd 文件的 auth 的第一行之前,否則不會生效!!!!!
示例說明二:
僅僅允許 kevin 用戶可以通過 ssh 遠程登錄。做法如下:
在 /etc/pam.d/sshd 文件中添加一條(務必添加到文件的第一行!):
auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed
添加兩個用戶 kevin 和 grace
[root@centos6-test06 ~]# useradd kevin
[root@centos6-test06 ~]# passwd kevin
[root@centos6-test06 ~]# useradd grace
[root@centos6-test06 ~]# passwd grace
編輯 file 指定的文件,添加上一個用戶 kevin(這一步是關鍵)
[root@centos6-test06 ~]# echo kevin /etc/sshdusers // 文件 /etc/sshdusers 是在上面添加到 /etc/pam.d/sshd 中定義的
然后驗證,發現使用 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 遠程連接,也會受到 pam_listfile.so 限制的。
溫馨提示:
如果發生錯誤,Linux-PAM 可能會改變系統的安全性。這取決于你自己的選擇,你可以選擇不安全 (開放系統) 和絕對安全(拒絕任何訪問)。通常,Linux-PAM 在發生錯誤時,傾向于后者。任何的配置錯誤都可能導致系統整個或者部分無法訪問。配置 Linux-PAM 時,可能遇到最大的問題可能就是 Linux-PAM 的配置文件 /etc/pam.d/* 被刪除了。如果發生這種事情,你的系統就會被鎖住。有辦法可以進行恢復,最好的方法就是用一個備份的鏡像來恢復系統,或者登錄進單用戶模式然后進行正確的配置。
3)pam_limits.so 模塊
pam_limits.so 模塊的主要功能是限制用戶會話過程中對各種系統資源的使用情況。缺省情況下該模塊的配置文件是 /etc/security/limits.conf。而該配置文件的基本格式實際上是由 4 個字段組成的表,其中具體限制的內容包括:
Domain type item value
用戶名 / 組名 軟 / 硬限制 具體值
core——core 文件大小 (KB)
data——最大數據大小(KB)
fsize——最大文件大小(KB)
memlock——最大可用內存空間(KB)
nofile——最大可以打開的文件數量
rss——最大可駐留空間(KB)
stack——最大堆棧空間(KB)
cpu——最大 CPU 使用時間(MIN) nproc——最大運行進程數
as——地址空間限制
maxlogins——用戶可以登錄到系統最多次數
locks——最大鎖定文件數目
需要注意的是,如果沒有任何限制可以使用 – 號,并且針對用戶限制的優先級一般要比針對組限制的優先級更高。使用 pam_limits.so 模塊的最常見的場景是在運行 Oracle 數據庫的 RHEL 服務器中,因為一般 Oracle 數據庫在安裝之前,按照其官方文檔的說明需要先對某些用戶(Oracle)使用系統資源的情況進行限制。所以我們總是能夠在 Oracle 數據庫服務器的 /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
結合上面的配置文件說明,可知 Oracle 數據庫需要對 Oracle 用戶使用資源的情況進行一些限制,包括:oracle 用戶最大能開啟的進程數不超過 16384,最大能打開的文件數不超過 65536。
至于 soft 和 hard 的區別,不同于磁盤配額中的軟限制和硬限制。普通用戶可以調整自己的 soft limit 但最高不能超過 hard limit,而且除了 root 以外的普通用戶也不能夠隨意更改 hard limit。該調整完成之后一般可以使用 ulimit 命令查看。
順便提一下,針對 nofile,這個只是基于用戶層面的限制和調整方法。基于系統層面的限制和調整方法是修改 /etc/sysctl.conf 文件,直接改 fs.file-max 參數,調整之后 sysctl –p 生效。
示例說明:
pam_limits.so 模塊也可以使用在對一般應用程序使用的資源限制方面。如果需要在 SSH 服務器上對來自不同用戶的 ssh 訪問進行限制,就可以調用該模塊來實現相關功能。例如,當需要限制用戶 bobo 登錄到 SSH 服務器時的最大連接數(防止同一個用戶開啟過多的登錄進程)。限制操作如下:
由于 /etc/pam.d/system-auth 中,默認就會通過 pam_limits.so 限制用戶最多使用多少系統資源
[root@centos6-test06 ~]# cat /etc/pam.d/system-auth|grep limits.so
session required pam_limits.so
因此只需要在 /etc/security/limits.conf 文件中增加一行對 bobo 用戶產生的連接數進行限定:[root@centos6-test06 ~]# vim /etc/security/limits.conf
......
bobo hard maxlogins 2
從客戶端以 bobo 身份登錄 SSH 服務器時,在客戶端上可以打開兩個控制臺登錄。但當客戶端開啟第三個登錄窗口的時候會被服務器拒絕,但其它用戶不會受到限制。注意:這樣限制的只是從客戶端以 ssh 方式登錄次數的場景,如果從 xshell 登錄,則不受限制!
4)pam_rootok.so 模塊
一般情況下,pam_rootok.so 模塊的主要作用是使 uid 為 0 的用戶,即 root 用戶能夠直接通過認證而不用輸入密碼。pam_rootok.so 模塊的一個典型應用是插入到一些應用程序的認證配置文件中,當 root 用戶執行這些命令的時候可以不用輸入口令而直接通過認證。比如說 su 命令,為什么當以 root 用戶執行 su 切換到普通用戶身份的時候是不需要輸入任何口令而可以直接切換過去?當我們查看一下 /etc/pam.d/su 文件的內容就不會奇怪了。因為該文件的第一行就是:
[root@centos6-test06 ~]# cat /etc/pam.d/su
......
auth sufficient pam_rootok.so
而如果將該行配置注釋掉的情況下,就會發現即便以 root 用戶切換普通用戶的時候仍然要求輸入口令。
另外一種方法,只需要將上述的 sufficient 改成 required 即可。因為這樣,pam_rootok.so 模塊的驗證通過就成為了必要條件之一。
pam_rootok.so 模塊的另外一個應用是在 chfn 命令中。Chfn 命令用于改變 /etc/passwd 中的用戶的說明字段。當以 root 身份執行 chfn 命令修改用戶信息的時候是不用輸入密碼的。但是以普通用戶身份執行 chfn 則需要輸入密碼之后才能改變自己的用戶說明。這實際上也是因為在 /etc/pam.d/chfn 配置文件中的第一行調用了 pam_rootok.so 的結果。
不過這里即便將該配置中的第一行注釋掉,root 用戶通過 chfn 修改自己信息的時候仍然不需要使用密碼。所以恐怕效果不是很明顯。究其原因主要是很多 PAM 模塊對 root 用戶是不會產生限制的。
示例說明(禁用用戶間使用 su 切換命令):
su 的缺點
1)不安全 su 工具在多人參與的系統管理中,并不是最好的選擇,su 只適用于一兩個人參與管理的系統,畢竟 su 并不能讓普通用戶受限的使用;超級用戶 root 密碼應該掌握在少數用戶手中。
2)麻煩:需要把 root 密碼告知每個需要 root 權限的人。
可以在 /etc/pam.d/su 文件里設置禁止用戶使用 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)以上標紅的兩行是默認狀態(即開啟第一行,注釋第二行),這種狀態下是允許所有用戶間使用 su 命令進行切換的!(或者兩行都注釋也是運行所有用戶都能使用 su 命令,但 root 下使用 su 切換到其他普通用戶需要輸入密碼;如果第一行不注釋,則 root 使用 su 切換普通用戶就不需要輸入密碼)
b)如果開啟第二行,表示只有 root 用戶和 wheel 組內的用戶才可以使用 su 命令。
c)如果注釋第一行,開啟第二行,表示只有 wheel 組內的用戶才能使用 su 命令,root 用戶也被禁用 su 命令。
5)pam_userdb.so 模塊
pam_userdb.so 模塊的主要作用是通過一個輕量級的 Berkeley 數據庫來保存用戶和口令信息。這樣用戶認證將通過該數據庫進行,而不是傳統的 /etc/passwd 和 /etc/shadow 或者其它的一些基于 LDAP 或者 NIS 等類型的網絡認證。所以存在于 Berkeley 數據庫中的用戶也稱為虛擬用戶。
pam_userdb.so 模塊的一個典型用途就是結合 vsftpd 配置基于虛擬用戶訪問的 FTP 服務器。
相對于本地用戶以及匿名用戶來說,虛擬用戶只是相對于 FTP 服務器而言才有用的用戶,這些用戶被嚴格地限定在 pam_userdb 數據庫當中。所以虛擬用戶只能訪問 FTP 服務器所提供的資源,因而可以大大提高系統安全性。另外相對于匿名用戶而言,虛擬用戶必須通過用戶名和密碼才能夠訪問 FTP 的資源。這樣也提高了對 FTP 用戶下載的可管理性。
基于虛擬用戶實現的 vsftpd 的原理基本上是這樣一個過程:先定義一些專門針對 FTP 的虛擬用戶,然后將用戶信息加入到系統自帶的數據庫中(但不是 passwd)從而生成一個訪問 FTP 的虛擬用戶列表,這里使用的數據庫是 db4 也就是 Berkeley DB。然后可以通過使用 pam_userdb.so 模塊來調用該數據庫存儲用戶信息以及實現 FTP 用戶認證。當然同時也可以在系統中通過對配置文件的定義和劃分來實現對不同虛擬用戶不同類型的訪問控制。
6)pam_cracklib.so 模塊
pam_cracklib.so 是一個常用并且非常重要的 PAM 模塊。該模塊主要的作用是對用戶密碼的強健性進行檢測。即檢查和限制用戶自定義密碼的長度、復雜度和歷史等。如不滿足上述強度的密碼將拒絕用戶使用。pam_cracklib.so 比較重要和難于理解的是它的一些參數和計數方法,其常用參數包括:
debug: 將調試信息寫入日志;type=xxx: 當添加 / 修改密碼時,系統給出的缺省提示符是 New UNIX password: 以及 Retype UNIX password:,而使用該參數可以自定義輸入密碼的提示符,比如指定 type=your own word;retry=N: 定義登錄 / 修改密碼失敗時,可以重試的次數;Difok=N: 定義新密碼中必須至少有幾個字符要與舊密碼不同。但是如果新密碼中有 1 / 2 以上的字符與舊密碼不同時,該新密碼將被接受;minlen=N: 定義用戶密碼的最小長度;dcredit=N:定義用戶密碼中必須至少包含多少個數字;ucredit=N:定義用戶密碼中必須至少包含多少個大寫字母;lcredit=N:定義用戶密碼中必須至少包含多少個小些字母;ocredit=N:定義用戶密碼中必須至少包含多少個特殊字符(除數字、字母之外);特別要注意:當 N 0 時,N 代表新密碼中最多可以有 N 個指定的字符!!當 N 0 時,N 代表新密碼中最少可以有 N 個指定的字符!!同時建議重啟系統使之生效!
/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 的一個應用實例:在 /etc/pam.d/system-auth 中使用 pam_cracklib.so 來限制用戶修改自己密碼時必須滿足一定的強健性要求。
[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 位,并且密碼中至少要包含一個大寫字母、小寫字母、數字和特殊符號。
但是實際上像 minlen 和所有 credit 所對應的數值可以是非 0 之外的正負整數,那么這些數值到底表示什么意思呢?很多人將其簡單地理解為某一類字符的位數,其實遠遠沒有那么簡單。
下面我們對這些數值和關系做一個簡短的說明:
首先要明確整個環境中密碼的長度要滿足下面的計算公式:計算公式:最小密碼長度(minlen)應該小于或者等于 dcredit+ucredit+lcredit+ocredit+ 其它分值 (同時滿足 * credit 的條件)。
*credit=- 1 表示至少有一個的意思
*credit=N(N 表示當滿足條件的時候加 N 分,例如 dcredit= 2 表示一個數字加 2 分,兩個數字加 4 分)所以這里 minlen 其實更準確的表述應該是 mincredit。
所以在下面的例子中,當 pam_cracklib.so 的參數按如下方式指定:password requisite pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=2 ucredit=0 lcredit=0 ocredit=0
那么當用戶執行命令修改密碼的時候:[bobo@centos6-test06 ~]$ passwd
Changing password for user bobo.
Changing password for bobo
(current) UNIX password:
New UNIX password: 輸入密碼 1\=poiuyt 不成功 1 個數字再加 2 分
此時密碼有一個數字,2 分,其它的字符每個 1 分,總共 10 分,不滿足 minlen 的位數需求,所以該密碼不能通過。BAD PASSWORD: is too simple
New UNIX password: 輸入密碼 12\=poiuyt 成功 2 個數字再加 2 分
Retype new UNIX password:
此時密碼有兩個數字,4 分,其它的字符每個 1 分,總共 12 分,滿足 minlen 的位數需求,所以密碼可以通過。New UNIX password: 輸入密碼 1\=poiuytre 成功 1 個數字再加 2 分
Retype new UNIX password:
此時密碼有 1 個數字,2 分,其它的字符每個 1 分,總共 12 分,滿足 minlen 的位數需求,所以密碼可以通過。
因此通過上述的配置基本可以得出這樣的結論:
當某類 credit 為正數 N 的時候,表示密碼中該類字符一個可以加 N 分;當某類 credit 為負數 N 的時候,表示密碼中某類字符必須具備 N 個。時間關系我將不會一一演示。
所以當輸入的密碼所有的字符總分大于或者等于 minlen,并且滿足所有 credit 的要求,該密碼通過; 即:輸入的密碼長度(每個輸入值都算數)+*credit(加分)=minlen
所以 pam_cracklib.so 模塊在系統安全管理策略和管理中的用途是非常重要和廣泛的。
7)pam_pwhistroy.so 模塊
pam_pwhistory.so 模塊也是一個常用模塊,一般輔助 pam_cracklib.so,pam_tally.so 以及 pam_unix.so 等模塊來加強用戶使用密碼的安全度。不過 pam_pwhistory.so 模塊起的是另一類的作用,即專門為用戶建立一個密碼歷史檔案,防止用戶在一定時間內使用已經用過的密碼。
示例說明:(特別注意:/etc/pam.d/system-auth 下的配置針對的是普通用戶,在 root 用戶下是無效的)
當需要限定用戶在 90 天之內不能重復使用以前曾經使用過的 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 并沒有什么選項可以限定密碼在多少天之內無法被重復使用,所以上述的 90 天是無法配置的。一個簡單的解決方法就是當 90 天左右的時候,手動清空一次 opasswd 文件即可。當然,如果要實現同樣的功能除了 pam_pwhistory.so 模塊之外還有其它的辦法。比較常用的是 pam_unix.so 模塊。具體方法是修改 /etc/pam.d/system-auth 文件,給 pam_unix.so 模塊里加上 remember=10 這個選項,修改之后的配置文件為:[root@centos6-test06 ~]# vim /etc/pam.d/system-auth
.......
password required pam_unix.so md5 remember=10 use_authtok
這樣系統將同樣記住 10 個已經使用的密碼。不過此時 /etc/security/opasswd 文件因為記錄了 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
========== 總結幾個 PAM 模塊比較常見的實操案例 ===========
1)怎樣才能強迫用戶設置的密碼不能與過去 3 次內的密碼重復?(特別注意:/etc/pam.d/system-auth 下的配置針對的是普通用戶,在 root 用戶下是無效的)
修改 /etc/pam.d/system-auth, 增加 pam_unix.so 的參數,如下:[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)如何要求用戶設置的密碼必須至少包含 5 個數字和 3 個特殊符號?
修改 /etc/pam.d/system-auth,在 password 使用 pam_cracklib.so 設置的最后附加 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 個數字和 n 個特殊字符不能全部放在一起!!
3)如何限制 kevin 用戶最多同時登陸 4 個?(同時可以限制 root 用戶)
這需要 pam_limits.so 模塊。由于 /etc/pam.d/system-auth 中,默認就會通過 pam_limits.so 限制用戶最多使用多少系統資源.
[root@centos6-test06 ~]# cat /etc/pam.d/system-auth|grep limits.so
session required pam_limits.so
因此只需要在 /etc/security/limits.conf 中加入以下內容:
[root@centos6-test06 ~]# vim /etc/security/limits.conf
......
kevin hard maxlogins 4
4)某用戶連續登陸失敗 2 次就鎖定該賬號,禁止登陸?(默認只能嘗試登錄三次,由 retry= N 決定的)
現在很多地方都有限制用戶登錄的功能,Linux 也是如此,當你登錄失敗多次后就可以限制用戶登錄,從而起到保護電腦安全的作用,通過 PAM 模塊即可實現。Linux 有一個 pam_tally2.so 的 PAM 模塊,來限定用戶的登錄失敗次數,如果次數達到設置的閾值,則鎖定用戶。
編譯 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
......
參數解釋:onerr=fail 表示定義了當出現錯誤(比如無法打開配置文件)時的缺省返回值;even_deny_root 表示也限制 root 用戶;deny 表示設置普通用戶和 root 用戶連續錯誤登陸的最大次數,超過最大次數,則鎖定該用戶;unlock_time 表示設定普通用戶鎖定后,多少時間后解鎖,單位是秒;root_unlock_time 表示設定 root 用戶鎖定后,多少時間后解鎖,單位是秒;
此處使用的是 pam_tally2 模塊,如果不支持 pam_tally2,可以使用 pam_tally 模塊。另外,不同的 pam 版本,設置可能有所不同,具體使用方法,可以參照相關模塊的使用規則。
特別注意:一定要將內容添加到 #%PAM-1.0 的下面,即在第二行添加內容,一定要寫在前面!!如果寫在后面,雖然用戶被鎖定,但是只要用戶輸入正確的密碼,還是可以登錄的!
------------------------------------------
也可以將上面的內容添加到 /etc/pam.d/password-auth 文件中,因為 /etc/pam.d/login 文件中包括(include)了 password-auth 配置
[root@centos6-test06 ~]# vim /etc/pam.d/system-auth // 同樣添加到 auth 區域的第一行
#%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 終端登錄,而沒有限制遠程 ssh 登錄,如果想限制遠程登錄,需要在 /etc/pam.d/sshd 文件里配置
[root@centos6-test06 ~]# vim /etc/pam.d/sshd // 同樣添加到 auth 區域的第一行
#%PAM-1.0
auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10
這樣的話,使用 ssh 遠程登錄的時候,連續輸入兩次錯誤密碼,就會被鎖定了!如果輸入錯誤次數沒有達到 deny 設置的次數,再輸入正確密碼就可以登錄。
[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: // 接著第三次再輸入正確密碼,還是無法登錄進去,因為已被鎖定 300s 了!Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
因為被鎖定 300s 了!在這個時間內,就算再輸入正確密碼也是無法順利登錄到機器的![bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost
kevin@localhost s password:
Permission denied, please try again.
接著可以解鎖!!查看用戶登錄失敗的次數。由下面命令可知,已經輸錯 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
接著,就可以輸入正確密碼登錄機器了
[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 這臺計算機使用 ssh 遠程登陸?
由于 ssh 服務器的程序文件使用 sshd, 而 sshd 剛好支持 PAM,驗證如下:[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
創建 /etc/deny_sshd 文件
[root@centos6-test06 ~]# touch /etc/deny_sshd
[root@centos6-test06 ~]# vim /etc/deny_sshd
-:root:ALL EXCEPT kevin.com
關于“linux pam 指的是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注丸趣 TV 行業資訊頻道,丸趣 TV 小編每天都會為大家更新不同的知識點。
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!