Linux – PAM 初解

Loading

PAM (Pluggable Authentication Modules)
Step 0:前言
Step 1: 簡易 PAM 的工作模式
Step 2 : 真正的 /etc/pam.d/login

Step 0:前言

在以前 Unix-like 系統每個程式都有屬於自己一套的驗證方式.現在將這些驗證集中起來管理就叫做 PAM(Pluggable Authentication Modules).而 PAM 是一種認證(authentication)和授權(authorization)的架構.任正式證實你的身份過程,而授權是依據使用者身份來決定是否有權限存取系統的過程
PAM 優點如下:

  • 為多種程式提共單一的驗證機制(Authentication scheme)
  • 提供給管理者以及程式設計者單一彈性的管理方式
  • 讓程式設計者不需再對身份密碼再做額外的處理

PAM 其主要有三項功能

  • 可動態載入函數庫( libraries )
  • 安全機制集中管理
  • 配置檔在載入時才生效

PAM 相關的設定檔
所有的函數庫( libraries )存在 /lib/sercurity 目錄下 .說明檔 /usr/share/doc/pam-xxx/html/index.html
note:其中的 xxx 是目前你使用的 PAM 版本.

log 存在 /var/log/security or /var/log/message
而設定檔存放在 /etc/pam.d 目錄下,函數庫 libraries 也有相對應的參考檔存放在 /etc/security 目錄下
.下面是 PAM 的官方網站
http://www.kernel.org/

Step 1: 簡易 PAM 的工作模式

為了了解 PAM 我們直接來看最常用的一個  PAM 是如何針對使用者驗證以及設定權限,最常用的莫過於是 PAM(/etc/pam.d/login),為了說明方便我已經精簡了 login PAM 的工作模式,所以這裡的 /etc/pam.d/login 並不會和你的系統的相同,.在修改 PAM 的時候,最好先備份舊有的資料,以免下次無法登入系統.如果真的發生無法登入時.請用 Linux 開機光碟來開機.進入救急模式 Linux rescue 再將資料備份回去即可.關於 Linux rescue 請自行參考 – Linux rescue

[root@benjr ~]# vi /etc/pam.d/login
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
account     required      /lib/security/$ISA/pam_unix.so
session     required      /lib/security/$ISA/pam_unix.so

每一行的格式為
module-type    Control flags    module-path   arguments

modules-type:
主要可分成下列幾種

  • auth:表示驗證類模組
    主要是依據使用者密碼或特殊方式來做驗證機制,如群組成員身分(group memberships)和獲得 kerberos 的證明書.
  • account:表示帳戶類模組
    限制或禁止使用者的存取機制(可依據使用者的登入使用時間,來源等…),亦可對使用者的密碼檢查是否過期.
  • password:表示密碼類模組
    可以讓使用者去更改,設定,驗證密碼
  • session:表示類模組
    執行環境的設定,如 /dev/fd0 的 owner 是依據誰掛載時決定.

Control flags
四種可能的值分別爲 required、Requisite、sufficient 或 optional

  • required
    所有的 required libraries 回傳值要為 pass ,最後的結果才會為 pass ,但 required libraries 的結果並不會影響到下一個  libraries 是否執行. 因為 PAM 並不立刻將錯誤消息返回給應用程式,而是在所有模組都作完畢後才將錯誤消息返回它的程式。
  • Requisite
    它與 required 相仿,只有帶此標記的模組返回成功後,用戶才能通過鑒別,不同之處在於其一旦失敗就不再執行堆中後面的其他模組,並且鑒別過程到此結束.
  • sufficient
    如果一個 sufficient library 回傳值為 pass .那麽PAM便立即向應用程式返回成功而不必嘗試接下來的其他模組.如果一個 sufficient library 回傳值為 faile 那接下來的 subsequent libraries 就需再做了,但這個 fail 不會影響到整體的 pass / faile (也就是說當標記爲 sufficient 的模組 Faile 時,sufficient模組當做 optional 對待.
  • optional
    在PAM體系中,帶有該標記的模組失敗後將繼續處理下一模組.(也就是 option libraries 的 pass /fail 皆不會影響到最後的結果.)

module-path
也就是 module 所在的路徑位址.

arguments
在這裡可以將參數傳送給前面指定的 module.可以看到我們都是使用相同的一個模組 pam_unix.so ,至於 pam_unix.so 會做哪些事情,請參考說明檔 /usr/share/doc/pam-xxx/html/index.html 的說明(其中的 xxx 是目前你使用的 PAM 版本).

現在回到剛剛建立的 login PAM 做個簡易的說明:

[root@benjr ~]# cat  /etc/pam.d/login
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
account     required      /lib/security/$ISA/pam_unix.so
session     required      /lib/security/$ISA/pam_unix.so

pam_unix.so 是一個比較複雜的模組,它可以同時應用在 PAM 的 4 個驗證方式:

auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
pam_unix.so 的 auth 主要會依據 /etc/nsswitch.conf 來決定身分驗證的方式,有可能為 files(本機 /etc/passwd 檔案) ldap(透過 LDAP server) winbind(透過 Windows AD server) 等不同方式來認證(suthentication).

參數 likeauth nullok

  • likeauth
    The likeauth argument makes the module return the same value when called as a credential setting module and an authentication module. This will help libpam take a sane path through the auth component of your configuration file.(這邊我還是看不太懂他的意思)
  • nullok
    系統預設不能將登入時密碼設定為空白,當使用參數 nullok 時就允許登入時密碼為空白.

如果把 pam_unix.so 的 nullok 參數移除,不管是誰都必須輸入密碼,包括了 root.先移除 root 的密碼

[root@benjr ~]# passwd -d root
[root@benjr ~]# exit
testsvr login:root
Password:

咦!密碼不是移除了嗎?怎麼還會問密碼(這時不管你按任何密碼都無法登入了),原來是 nullok 的參數被移除了.
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
pam_unix.so 的 password 主要的工作是讓可以更新使用者的密碼.如果沒有了這一行使用者將無法更改密碼.
參數nullok use_authtok md5 shadow

  • nullok
    系統預設不能將密碼修改為空白,當使用參數 nullok 時就密碼修改成空白.
  • use_authtok
    use the authentication token previously obtained by another that did the conversation with the application. If this token can not be obtained then the module will try to converse again. This option can be used for stacking different modules that need to deal with the authentication tokens.(這邊我還是看不太懂他的意思)
  • md5
    密碼將採用 md5 的方式加密.關於 md5 請參考 PKI(Public Key Infrastructure)中的 md5 說明
  • shadow
    密碼將跟使用者資料分開存放至 /etc/shadow 除了可以在這邊設定 md5 , shadow 外,還可以使用 Rehat 提供的工具 authconfig 可設定這兩個選項(1.Use Shadow Passwords, 2.Use MD5 Passwords)來決定是否使用 ms5 以及 shadow.

account     required      /lib/security/$ISA/pam_unix.so
系統會依據 /etc/shadow 的參數 : expire; last_change; max_change; min_change; warn_change,來確定使用者的帳號以及密碼是否有效並且尚未到期.
session     required      /lib/security/$ISA/pam_unix.so
會讓系統在建立完連線(session) 後會用 syslog 來記錄登入的使用者期間所做的事件.你每次登入時就可以看到 /var/log/message 中會多出類似下面這一項紀錄
Aug 29 00:50:51 dexter sshd(pam_unix)[6321]: session opened for user root by (uid=0)
所以如果你移除這一項系統就不會與使用者來建立連線了,你此時就無法登入系統,並且會得到如下的訊息在 /var/log/message.
Aug 29 00:50:46 dexter sshd(pam_unix)[6321]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.0.5  user=root
了解簡易的 /etc/pam.d/login 之後,我們再來看看真正的 /etc/pam.d/login 吧!

Step2 : 真正的 /etc/pam.d/login

剛剛為了讓我們可以先了解 PAM 的運作方式,現在我們來看看真正的 /etc/pam.d/login 是如何規劃.

[root@benjr ~]# cat /etc/pam.d/login
#%PAM-1.0
auth       required pam_securetty.so
auth       required pam_stack.so service=system-auth
auth       required pam_nologin.so
account    required pam_stack.so service=system-auth
password   required pam_stack.so service=system-auth
session    required pam_stack.so service=system-auth
session    optional pam_console.so

說明:

  • pam_securetty.so
    主要會去參考 /etc/securetty 檔案內容紀錄 root 可以經由哪些 terminal(ttys) 來登入.
  • am_nologin.so
    主要是限制一般使用者的登入,他還會去參考 /etc/nologin 檔案來決定一般使用者的登入限制.
  • pam_console.so
    主要是允許非特權使用者使用系統控制指令.這些指令存放在 /etc/security/console.apps 目錄下,當你移除 shutdown , halt , poweroff , reboot , xserver 檔案,一般使用者就沒有權力使用這些指令了.

除了上面的 PAM 設定外,還看到很多用 pam_stack.so service=system-auth 這種模式,種方式會讓系統再去呼叫 system-auth 而這樣的做法好處可以讓多個設定檔共用他們相同的認證,而不須為每個設定寫下相同的步驟.那我們來看看 /etc/pam.d/system-auth 的內容

[root@benjr ~]# 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      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
auth        required      /lib/security/$ISA/pam_deny.so
account     required      /lib/security/$ISA/pam_unix.so
password    required      /lib/security/$ISA/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password    required      /lib/security/$ISA/pam_deny.so
session     required      /lib/security/$ISA/pam_limits.so
session     required      /lib/security/$ISA/pam_unix.so

說明:
auth        required      /lib/security/$ISA/pam_env.so
This module allows the (un)setting of environment variables. Supported is the use of previously set environment variables as well as PAM_ITEMs such as PAM_RHOST.
This module allows you to (un)set crabitrary environment variables using fixed strings /etc/security/pam_env

auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
Standard Unix auth entication /etc/passwd , /etc/shadow

auth        required      /lib/security/$ISA/pam_deny.so
This module can be used to deny access. It always indicates a failure to the application through the PAM framework. As is commented in the overview section above, this module might be suitable for using for default (the oTHER) entries.

 account     required      /lib/security/$ISA/pam_unix.so likeauth nullok
請參考之前 pam_unix.so 的說明.
password    required      /lib/security/$ISA/pam_cracklib.so retry=3 type=
當使用者在更改密碼時密碼是否為字典檔的字或者為較簡易的密碼,都靠這個模組來把關.而系統會去比對是否為字典檔的字點存在 : /usr/lib/cracklib.dict 檔案中.

ex:使用者無法使用簡易或字典檔的字當密碼

[user1@benjr user1]$ passwd
Changing password for user user1.
Changing password for user1
(current) UNIX password:
New password:
BAD PASSWORD: it is too short
New password:
BAD PASSWORD: it is based on a dictionary word
New password:
BAD PASSWORD: it does not contain enough DIFFERENT characters
passwd: Authentication token manipulation error

password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
請參考之前的說明
password    required      /lib/security/$ISA/pam_deny.so
This module should be used to prevent an application from updating the applicant user’s password. For example, to prevent login from automatically prompting for a new password when the old one has expired you should include the following line in your configuration file:
This componet does nothing other than return a failure

session     required      /lib/security/$ISA/pam_limits.so

系統會依據 /etc/security/limits.conf ,來做資源存取的限制,使用者的 uid=0 是不受限制的(通常是 root),可使限制的資源如下
core – limits the core file size (KB)
data – max data size (KB)
fsize – maximum filesize (KB)
memlock – max locked-in-memory address space (KB)
nofile – max number of open files
rss – max resident set size (KB)
stack – max stack size (KB)
cpu – max CPU time (MIN)
nproc – max number of processes
as – address space limit
maxlogins – max number of logins for this user
priority – the priority to run user process with
locks – max number of file locks the user can hold
session     required      /lib/security/$ISA/pam_unix.so

請參考之前 pam_unix.so 的說明.

後面這裡還有更多的 PAM-範例 https://benjr.tw/293 說明.

沒有解決問題,試試搜尋本站其他內容

4 thoughts on “Linux – PAM 初解

  1. 自動引用通知: LDAP-用戶端 | Benjr.tw
  2. 自動引用通知: LDAP-帳號伺服器 | Benjr.tw
  3. 自動引用通知: 安全性 | Benjr.tw
  4. 自動引用通知: Telnet | Benjr.tw

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料