pam模塊的配置使用
先看一個配置文件
cat /etc/pam.d/sshd
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
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
#session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
第一列: 是認證類型
第二列:控制標記
第三列:認證模塊
下邊仔細說明一下這三列
先說第二列控制標記
解釋:控制標記簡單的解釋是就是各個模塊的重要程度。
- required
該標記的模塊認證成功是用戶通過的必要條件。就是說required標記的模塊如果認證失敗,就一定不會通過認證。認證失敗以后也不會立刻返回給用戶錯誤消息,而是在所有的模塊調用完畢以后統一返回,就是說該模塊認證失敗以后其他的模塊認證沒有意義了。這樣做的目的是為了迷惑“敵人”,讓他們不知道是哪個模塊認證失敗導致的問題。 - requisite
該標記的模塊 required的相似,它標記的模塊認證失敗以后會直接返回給應用,不會執行接下來的模塊,而該標記一般用在認證一開始,用來判斷用戶的登錄環境是否合法,如果不合法的話直接返回認證失敗,就算是合法的用戶,如果登錄環境不對也不會通過認證。 - sufficient
該標記的模塊標識的是用戶通過認證的充分條件,意思就是只要該模塊通過了認證就會立刻返回給用戶認證成功。當然sufficient的優先級低於required,如果required認證失敗了最終結果也是失敗。當sufficient認證失敗的時候就相當於optional - optional
該標記的模塊認證失敗,用戶也能通過認證。就是該標記的模塊一般只做信息的展示,不去做認證相關的東西,用戶的認證能否通過全部取決於上邊三個標記。 - include
該標記實際上就是引用這個pam文件相同的目錄下的另一個文件。但是不會將另一個pam配置文件中的所有內容引入,只會對“模板類型”字段所標記的一類模塊起到作用。即便system-auth可能包含了全部的四種類型的模塊,也只有當前記錄所對應的哪一類模塊的那些記錄包含進來。解釋一下
auth include postlogin
account include password-auth
password include password-auth
session include password-auth
上邊的配置文件中有這三條記錄,password-auth這個文件被引用了三次,查看password-auth中的記錄auth account password session四種類型的模塊都有。如下配置文件
# cat password-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 required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_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 optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
account include password-auth
該條記錄只會引用password-auth中的如下這些配置
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password include password-auth
該條記錄只會引用password-auth中的如下這些配置
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
你懂得
- 認證的流程

在配置文件有存在邏輯的一些認證
一下內容是我從pam.d下的配置文件中摘取出來的一些具有邏輯的配置。
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
account sufficient pam_succeed_if.so uid < 1000 quiet
session optional pam_keyinit.so force revoke
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
[]中的就是細致定義的控制標記,意思是:user_unknown的返回忽略, seccess的返回執行ok動作,ignore的返回執行ignore動作,default狀態返回執行bad動作
問題:[user_unknown=ignore success=ok ignore=ignore default=bad]列表中的認證是順序認證還是與或非或者是模塊只會給與一個返回??????
這些就是細致描述模塊的返回狀態的處理方式,類似user_unknown、sucess、ignored等這些內容就是某個模塊的返回狀態。那么相應的ignore、ok、bad等就是對這些返回狀態的處理方式,或者說是動作
- pam所支持的動作列表
| 標記 | 說明 |
|---|---|
| ignore | 忽略這個狀態,不會對驗證結果產生影響 |
| bad | 表示這個返回狀態代表驗證失敗、余下的模塊調用也永遠失敗 |
| die | 與bad相同,但是應該立即返回到應用,不在繼續調用余下模塊 |
| ok | 標識這個返回狀態應該被看作是驗證成功,繼續調用余下模塊 |
| done | 與ok相同,但是應該立即返回到應用,不在繼續調用余下模塊 |
| N | 與ok相同,但是要跳過N個模塊才能繼續 |
| reset | 清楚所有的返回狀態、繼續調用余下模塊 |
- pam常見的返回狀態
| 狀態 | 說明 |
|---|---|
| success | 認證成功 |
| auth_err | 認證失敗 |
| new_authtok_reqd | 需要新的認證令牌。有三種情況會返回這個狀態:1. 根據安全策略需要更密碼,2. 是密碼為空;3. 是密碼已經過期 |
| ignore | 忽略底層account類型模塊的返回狀態,而且無論是否被required、sufficient和optional修飾。處於安全考慮,這個返回狀態通常需要被忽略掉,這樣其他模塊的返回狀態會被參考 |
| user_unknown | 未知用戶 |
| try_again | 已經通過了密碼服務的初步檢測 |
| default | 所有沒有注明的返回狀態 |
account sufficient pam_succeed_if.so uid < 1000 quiet
這種配置和這個模塊有關的,能在pam配置文件中實現一些分支結構,就像uid < 1000如果登錄用戶是uid返回1000那么就會返回sucess狀態
-session optional pam_ck_connector.so
這個-session的意思是這個模塊的返回信息不回記錄在日志中,日志一半就是在/var/log/secure
