○ 本文導航算法
關於PAM安全
PAM身份驗證配置文件bash
PAM配置文件語法格式session
PAM模塊接口ssh
PAM控制標誌ide
PAM配置方法工具
PAM身份驗證安全配置實例測試
- 強制使用強密碼(用戶密碼安全配置)ui
- 用戶SSH登陸失敗嘗試次數超出限制後鎖定帳戶(賬戶鎖定/解鎖和時間設置)加密
- 容許普通用戶使用sudo而不是su(限制普通用戶登陸到root用戶)
- 禁止直接使用root用戶經過SSH登陸
pwgen複雜密碼隨機生成工具
關於PAM
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,沒有輸出,則沒有使用。
PAM身份驗證配置文件
/etc/pam.d/目錄包含應用程序的PAM配置文件。例如,login程序將其程序/服務名稱定義爲login,與之對應的PAM配置文件爲/etc/pam.d/login。
PAM配置文件語法格式
每一個PAM配置文件都包含一組指令,用於定義模塊以及控制標誌和參數。每條指令都有一個簡單的語法,用於標識模塊的目的(接口)和模塊的配置設置,語法格式以下:
module_interface control_flag module_name module_arguments |
如在/etc/pam.d/password-auth-ac配置文件中(CentOS),其中一行PAM模塊接口定義以下
PAM模塊接口(模塊管理組)
PAM爲認證任務提供四種類型可用的模塊接口,它們分別提供不一樣的認證服務:
√ auth | - 認證模塊接口,如驗證用戶身份、檢查密碼是否能夠經過,並設置用戶憑據 |
√ account | - 帳戶模塊接口,檢查指定帳戶是否知足當前驗證條件,如用戶是否有權訪問所請求的服務,檢查帳戶是否到期 |
√ password | - 密碼模塊接口,用於更改用戶密碼,以及強制使用強密碼配置 |
√ session | - 會話模塊接口,用於管理和配置用戶會話。會話在用戶成功認證以後啓動生效 |
單個PAM庫模塊能夠提供給任何或全部模塊接口使用。例如,pam_unix.so提供給四個模塊接口使用。
PAM控制標誌
全部的PAM模塊被調用時都會返回成功或者失敗的結果,每一個PAM模塊中由多個對應的控制標誌決定結果是否經過或失敗。每個控制標誌對應一個處理結果,PAM庫將這些經過/失敗的結果整合爲一個總體的經過/失敗結果,而後將結果返回給應用程序。模塊能夠按特定的順序堆疊。控制標誌是實現用戶在對某一個特定的應用程序或服務身份驗證的具體實現細節。該控制標誌是PAM配置文件中的第二個字段,PAM控制標誌以下:
> required | - 模塊結果必須成功才能繼續認證,若是在此處測試失敗,則繼續測試引用在該模塊接口的下一個模塊,直到全部的模塊測試完成,纔將結果通知給用戶。 |
> requisite | - 模塊結果必須成功才能繼續認證,若是在此處測試失敗,則會當即將失敗結果通知給用戶。 |
> sufficient | - 模塊結果若是測試失敗,將被忽略。若是sufficient模塊測試成功,而且以前的required模塊沒有發生故障,PAM會嚮應用程序返回經過的結果,不會再調用堆棧中其餘模塊。 |
> optional | - 該模塊返回的經過/失敗結果被忽略。當沒有其餘模塊被引用時,標記爲optional模塊而且成功驗證時該模塊纔是必須的。該模塊被調用來執行一些操做,並不影響模塊堆棧的結果。 |
> include | - 與其餘控制標誌不一樣,include與模塊結果的處理方式無關。該標誌用於直接引用其餘PAM模塊的配置參數 |
PAM配置方法
全部的PAM配置方法都在man手冊中有說明,好比要查找某個程序支持PAM模塊的配置,可使用man 加模塊名(去掉.so)查找說明,如# man pam_unix。(模塊名能夠在目錄/lib/security/或/lib64/security/中找到。)
PAM身份驗證安全配置實例
1、強制使用強密碼(用戶密碼安全配置)
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’,默認狀況下即便沒有這個參數配置,通常大多數這樣的密碼都不會經過,除非序列只是密碼的一小部分 maxcla***epeat=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配置文件以下圖所示
須要注意的是,我在這裏展現的是在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程序更新密碼,若是輸入的密碼不符合要求,將不能修改
root@HMing ~ # su - hm #登陸到hm用戶 hm@HMing ~ $ passwd #修改密碼 Changing password for user hm. Changing password for hm. (current) UNIX password: #提示輸入舊密碼 New password: #提示輸入新密碼,若是不知足要求,將會提示相關錯誤信息 Password unchanged New password: BAD PASSWORD: is too simple New password: #當輸入的密碼知足要求時,才提示再次輸入 Retype new password: passwd: all authentication tokens updated successfully.
2、用戶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用戶下使用以下命令解鎖用戶:
# pam_tally2 -u username -r --reset
查看用戶登陸失敗信息:
# pam_tally2 -u username
若是要在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用戶在登陸失敗次數超出限制後被鎖定指定時間 |
3、容許普通用戶使用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組中,以下:
# usermod -a -G wheel username
其次,若是你不想使用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執行任何命令(須要輸入密碼) |
4、禁止直接使用root用戶經過SSH登陸
在/etc/pam.d/password-auth-ac或者/etc/pam.d/sshd配置文件中添加如下配置(該配置禁止SSH的口令認證,但仍然可使用SSH密鑰登陸)
auth required pam_securetty.so |
此外還能夠配置/etc/securetty 文件禁止root用戶經過全部tty終端登陸系統
# cp /etc/securetty /etc/securetty.saved # echo "" >/etc/securetty
5、pwgen複雜密碼隨機生成工具
pwgen是一個在Linux隨機生成密碼的工具,在CnetOS6下安裝:
# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm # yum install pwgen
使用pwgen命令隨機生成字符長度爲12的密碼
# pwgen -s 12 -c -n -y |
-n 至少包含一個數字
-c 至少包含一個大寫字母
-y 至少包含一個特殊字符
-s 徹底隨機生成密碼