○ 本文導航
關于PAM
PAM身份驗證配置檔案
PAM配置檔案文法格式
PAM子產品接口
PAM控制标志
PAM配置方法
PAM身份驗證安全配置執行個體
- 強制使用強密碼(使用者密碼安全配置)
- 使用者SSH登入失敗嘗試次數超出限制後鎖定賬戶(帳戶鎖定/解鎖和時間設定)
- 允許普通使用者使用sudo而不是su(限制普通使用者登入到root使用者)
- 禁止直接使用root使用者通過SSH登入
pwgen複雜密碼随機生成工具
Linux-PAM (Pluggable Authentication Modules for Linux)可插拔認證子產品。Linux-PAM是一套适用于Linux的身份驗證共享庫系統,它為系統中的應用程式或服務提供動态身份驗證子產品支援。在Linux中,PAM是可動态配置的,本地系統管理者可以自由選擇應用程式如何對使用者進行身份驗證。PAM應用在許多程式與服務上,比如登入程式(login、su)的PAM身份驗證(密碼認證、限制登入),passwd強制密碼,使用者程序實時管理,向使用者配置設定系統資源等。
PAM的主要特征是認證的性質是可動态配置的。PAM的核心部分是庫(libpam)和PAM子產品的集合,它們是位于檔案夾/lib/security/中的動态連結庫(.so)檔案,以及位于/etc/pam.d/目錄中(或者是/etc/pam.conf配置檔案)的各個PAM子產品配置檔案。/etc/pam.d/目錄中定義了各種程式和服務的PAM配置檔案,其中system-auth檔案是PAM子產品的重要配置檔案,它主要負責使用者登入系統的身份認證工作,不僅如此,其他的應用程式或服務可以通過include接口來調用它(該檔案是system-auth-ac的軟連結)。此外password-auth配置檔案也是與身份驗證相關的重要配置檔案,比如使用者的遠端登入驗證(SSH登入)就通過它調用。而在Ubuntu、SuSE Linux等發行版中,PAM主要配置檔案是common-auth、common-account、common-password、common-session這四個檔案,所有的應用程式和服務的主要PAM配置都可以通過它們來調用。
使用如下指令判斷程式是否使用了PAM:
root@HMing ~ # ldd /usr/bin/passwd | grep libpam
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fb74f748000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007fb74eb45000)
如看到有類似的輸出,說明該程式使用了PAM,沒有輸出,則沒有使用。
/etc/pam.d/目錄包含應用程式的PAM配置檔案。例如,login程式将其程式/服務名稱定義為login,與之對應的PAM配置檔案為/etc/pam.d/login。
每個PAM配置檔案都包含一組指令,用于定義子產品以及控制标志和參數。每條指令都有一個簡單的文法,用于辨別子產品的目的(接口)和子產品的配置設定,文法格式如下:
module_interface control_flag module_name module_arguments
如在/etc/pam.d/password-auth-ac配置檔案中(CentOS),其中一行PAM子產品接口定義如下
<a href="https://s5.51cto.com/wyfs02/M00/95/39/wKioL1kS5LnCkOKIAAAu27gBlu8683.png" target="_blank"></a>
PAM子產品接口(子產品管理組)
PAM為認證任務提供四種類型可用的子產品接口,它們分别提供不同的認證服務:
√ auth
- 認證子產品接口,如驗證使用者身份、檢查密碼是否可以通過,并設定使用者憑據
√ account
- 賬戶子產品接口,檢查指定賬戶是否滿足目前驗證條件,如使用者是否有權通路所請求的服務,檢查賬戶是否到期
√ password
- 密碼子產品接口,用于更改使用者密碼,以及強制使用強密碼配置
√ session
- 會話子產品接口,用于管理和配置使用者會話。會話在使用者成功認證之後啟動生效
單個PAM庫子產品可以提供給任何或所有子產品接口使用。例如,pam_unix.so提供給四個子產品接口使用。
所有的PAM子產品被調用時都會傳回成功或者失敗的結果,每個PAM子產品中由多個對應的控制标志決定結果是否通過或失敗。每一個控制标志對應一個處理結果,PAM庫将這些通過/失敗的結果整合為一個整體的通過/失敗結果,然後将結果傳回給應用程式。子產品可以按特定的順序堆疊。控制标志是實作使用者在對某一個特定的應用程式或服務身份驗證的具體實作細節。該控制标志是PAM配置檔案中的第二個字段,PAM控制标志如下:
> required
- 子產品結果必須成功才能繼續認證,如果在此處測試失敗,則繼續測試引用在該子產品接口的下一個子產品,直到所有的子產品測試完成,才将結果通知給使用者。
> requisite
- 子產品結果必須成功才能繼續認證,如果在此處測試失敗,則會立即将失敗結果通知給使用者。
> sufficient
- 子產品結果如果測試失敗,将被忽略。如果sufficient子產品測試成功,并且之前的required子產品沒有發生故障,PAM會向應用程式傳回通過的結果,不會再調用堆棧中其他子產品。
> optional
- 該子產品傳回的通過/失敗結果被忽略。當沒有其他子產品被引用時,标記為optional子產品并且成功驗證時該子產品才是必須的。該子產品被調用來執行一些操作,并不影響子產品堆棧的結果。
> include
- 與其他控制标志不同,include與子產品結果的處理方式無關。該标志用于直接引用其他PAM子產品的配置參數
所有的PAM配置方法都在man手冊中有說明,比如要查找某個程式支援PAM子產品的配置,可以使用man 加子產品名(去掉.so)查找說明,如# man pam_unix。(子產品名可以在目錄/lib/security/或/lib64/security/中找到。)
一、強制使用強密碼(使用者密碼安全配置)
PAM配置檔案:/etc/pam.d/system-auth-ac
子產品名稱:pam_cracklib(僅适用于password子產品接口)
子產品參數:
minlen=12 密碼字元長度不少于12位(預設為9)
lcredit=-1 至少包含1個小寫字母
ucredit=-1 至少包含1個大寫字母
dcredit=-1 至少包含1個數字
ocredit=-1 至少包含1個特殊字元
retry=3 配置密碼時,提示3次使用者密碼錯誤輸入
difok=6 配置密碼時,新密碼中至少6個字元與舊密碼不同(預設為5)
其他常用參數:
reject_username 新密碼中不能包含與使用者名稱相同的字段
maxrepeat=N 拒絕包含超過N個連續字元的密碼,預設值為0表示此檢查已禁用
maxsequence=N 拒絕包含大于N的單調字元序列的密碼,例如’1234’或’fedcb’,預設情況下即使沒有這個參數配置,一般大多數這樣的密碼都不會通過,除非序列隻是密碼的一小部分
maxclassrepeat=N 拒絕包含相同類别的N個以上連續字元的密碼。預設值為0表示此檢查已禁用。
use_authtok 強制使用先前的密碼,不提示使用者輸入新密碼(不允許使用者修改密碼)
子產品名稱:pam_unix (适用于account,auth, password和session子產品接口)
remember=N 儲存每個使用者使用過的N個密碼,強制密碼不能跟曆史密碼重複
其他常見參數:
sha512 當使用者下一次更改密碼時,使用SHA256算法進行加密
md5 當使用者更改密碼時,使用MD5算法對其進行加密。
try_first_pass 在提示使用者輸入密碼之前,子產品首先嘗試先前的密碼,以測試是否滿足該子產品的需求。
use_first_pass 該子產品強制使用先前的密碼(不允許使用者修改密碼),如果密碼為空或者密碼不對,使用者将被拒絕通路
shadow 使用者保護密碼
nullok 預設不允許空密碼通路服務
use_authtok 強制使用先前的密碼,不提示使用者輸入新密碼(不允許使用者修改密碼)
例 修改配置/etc/pam.d/system-auth-ac檔案,在password子產品接口行修改或添加配置參數如下:
password requisite pam_cracklib.so try_first_pass retry=3 type= reject_username minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=6
修改後的/etc/pam.d/system-auth-ac配置檔案如下圖所示
<a href="https://s1.51cto.com/wyfs02/M00/95/3F/wKiom1kTFdGxIfOtAABrEkhupCg013.png" target="_blank"></a>
需要注意的是,我在這裡展示的是在RHEL/CentOS下的配置,passwd程式的PAM配置檔案涉及主配置檔案/etc/pam.d/passwd和/etc/pam.d/system-auth-ac(也可以是/etc/pam.d/password-auth-ac),其中/etc/pam.d/passwd配置檔案預設隻包含了/etc/pam.d/system-auth-ac配置檔案,是以對于以上PAM身份驗證密碼子產品配置,隻修改/配置該檔案即可。或者在Ubuntu中,配置檔案包括:/etc/pam.d/common-password、/etc/pam.d/common-account、/etc/pam.d/common-auth、/etc/pam.d/common-session。
測試PAM配置:
登入(su)普通使用者使用passwd程式更新密碼,如果輸入的密碼不符合要求,将不能修改
<code>root@HMing ~ </code><code># su - hm #登入到hm使用者</code>
<code>hm@HMing ~ $ </code><code>passwd</code> <code>#修改密碼</code>
<code>Changing password </code><code>for</code> <code>user hm.</code>
<code>Changing password </code><code>for</code> <code>hm.</code>
<code>(current) UNIX password: </code><code>#提示輸入舊密碼</code>
<code>New password: </code><code>#提示輸入新密碼,如果不滿足要求,将會提示相關錯誤資訊</code>
<code>Password unchanged</code>
<code>New password: </code>
<code>BAD PASSWORD: is too simple</code>
<code>New password: </code><code>#當輸入的密碼滿足要求時,才提示再次輸入</code>
<code>Retype new password: </code>
<code>passwd</code><code>: all authentication tokens updated successfully.</code>
二、使用者SSH登入失敗嘗試次數超出限制後鎖定賬戶(帳戶鎖定/解鎖和時間設定)
為了進一步提高安全性,可以指定超過失敗登入嘗試次數後鎖定使用者。使用者賬戶可以被解鎖(可以由root使用者主動解鎖),或者在設定的時間後自動解鎖。如在三次失敗的登入嘗試後鎖定使用者十分鐘。需要在/etc/pam.d/password-auth-ac(或者在/etc/pam.d/sshd)檔案添加以下參數:
auth required pam_tally2.so deny=3 unlock_time=600 onerr=succeed file=/var/log/tallylog
在Ubuntu、SuSE Linux中,需要修改/etc/pam.d/common-auth配置檔案
另外,使用PAM還可以限制在console控制台上登入,需要修改/etc/pam.d/system-auth配置檔案(或者/etc/pam.d/login),添加如上auth配置字段即可。
一旦使用者失敗登入嘗試次數達到3次,該帳戶立刻被鎖定,除非root使用者解鎖。root使用者下使用如下指令解鎖使用者:
<code># pam_tally2 -u username -r --reset</code>
檢視使用者登入失敗資訊:
<code># pam_tally2 -u username</code>
如果要在3次失敗登入嘗試後永久鎖定使用者,那麼需要删除unlock_time字段,除非root使用者解鎖該賬戶,否則将永久鎖定。
pam_tally/pam_tally2子產品參數:
全局選項
onerr=[succeed|fail]
file=/path/to/log 失敗登入日志檔案,預設為/var/log/tallylog
audit 如果登入的使用者沒有找到,則将使用者名資訊記錄到系統日志中
silent 不列印相關的資訊
no_log_info 不通過syslog記錄日志資訊
AUTH選項
deny=n 失敗登入次數超過n次後拒絕通路
lock_time=n 失敗登入後鎖定的時間(秒數)
unlock_time=n 超出失敗登入次數限制後,解鎖的時間
no_lock_time 不在日志檔案/var/log/faillog 中記錄.fail_locktime字段
magic_root root使用者(uid=0)調用該子產品時,計數器不會遞增
even_deny_root root使用者失敗登入次數超過deny=n次後拒絕通路
root_unlock_time=n 與even_deny_root相對應的選項,如果配置該選項,則root使用者在登入失敗次數超出限制後被鎖定指定時間
三、允許普通使用者使用sudo而不是su(限制普通使用者登入到root使用者)
Linux系統上預設存在一個wheel組,用于限制普通使用者通過su登入到root使用者,隻有屬于wheel組的使用者成員才能使用su。但是在預設情況下,系統并沒有啟用這個功能,我們可以通過PAM啟用它,或者修改為指定的組/使用者使用su,當然指定為什麼組可以按照要求而定。該配置通過pam_wheel子產品指定。
首先啟用whell組,使得隻屬于wheel組的使用者可以使用su指令
需要在/etc/pam.d/su配置檔案添加以下配置:
auth required pam_wheel.so use_uid
需要注意應該将這一行參數添加在/etc/pam.d/su檔案的首部,否則PAM子產品可能會跳過該項檢查。配置完之後,我們就可以将需要用su權限的使用者添加到wheel組中,如下:
<code># usermod -a -G wheel username</code>
其次,如果你不想使用wheel組,而是使用其他的組代替,比如指定組名為myadmingroup的組擁有su的權限,需要這麼做:
auth required pam_wheel.so use_uid group=myadmingroup
最後配置指定使用者擁有sudo權限,要知道我們的目的是盡量少使用root身份的權限,sudo可以讓使用者僅僅在需要調用root使用者權限的情況下調用。我們可以指定特定的組/使用者使用sudo(不需要root密碼)調用root權限。visudo打開配置檔案:
hmm ALL=(ALL) NOPASSWD: ALL #允許hmm使用者通過sudo執行任何指令(不需要輸入密碼)
%wheel ALL=(ALL) ALL #允許wheel組成員使用sudo執行任何指令(需要輸入密碼)
四、禁止直接使用root使用者通過SSH登入
在/etc/pam.d/password-auth-ac或者/etc/pam.d/sshd配置檔案中添加以下配置(該配置禁止SSH的密碼認證,但仍然可以使用SSH密鑰登入)
auth required pam_securetty.so
此外還可以配置/etc/securetty 檔案禁止root使用者通過所有tty終端登入系統
<code># cp /etc/securetty /etc/securetty.saved</code>
<code># echo "" >/etc/securetty</code>
五、pwgen複雜密碼随機生成工具
pwgen是一個在Linux随機生成密碼的工具,在CnetOS6下安裝:
<code># rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm</code>
<code># yum install pwgen</code>
使用pwgen指令随機生成字元長度為12的密碼
# pwgen -s 12 -c -n -y
-n 至少包含一個數字
-c 至少包含一個大寫字母
-y 至少包含一個特殊字元
-s 完全随機生成密碼
<a href="https://s5.51cto.com/wyfs02/M00/95/3A/wKiom1kS6GzzW69AAACVMDklzZA841.png" target="_blank"></a>
本文轉自 HMLinux 51CTO部落格,原文連結:http://blog.51cto.com/7424593/1924260