1. 程式人生 > >鳥哥的Linux私房菜讀書筆記--使用者的特殊shell與PAM模組

鳥哥的Linux私房菜讀書筆記--使用者的特殊shell與PAM模組

問題:我們能否建立一個僅能使用的mail server相關郵件服務的賬號,而該賬號並不能登入Linux主機

1、特殊的shell、/sbin/nologin

由於系統賬號不需要登入,我們就給這個無法登入的合法shell。所謂的無法登入是指這個使用者無法使用bash或其它shell來登入系統。如果我想讓某個具有/sbin/nologin的使用者知道,他們不能登入主機時,可以建立/etc/nologin.txt這個檔案,並且說明不能登入的原因,下次使用者登陸的時候就會顯示登入失敗的原因。

2、PAM模組簡介

在過去,我們對使用者進行認證的時候,要求使用者輸入賬號密碼,然後通過自行撰寫的程式判斷賬號密碼是否正確。由此,可以使用不同的機制來判斷賬號密碼,導致一部主機上有多種認證系統,造成賬號密碼可能不同步的驗證問題。因此有了PAM 機制。PAM是一套應用程式程式設計介面(Application Programming Interface,API)它提供了一連串的驗證機制,只要使用者將驗證階段的需求告知PAM,PAM就能回報使用者驗證的結果。由於PAM是一套驗證機制,有可以提供給其他程式呼叫引用,因此無論什麼程式,都可以使用PAM來進行驗證。PAM是一個獨立的API存在,只要任何程式有需求的時候就可以向PAM發出驗證要求的通知。PAM用來驗證的資料成為模組,每個模組的功能都不太相同 ,例如passwd的pam_cracklib.so模組的功能,它能夠判斷密碼是否在字典裡面,並彙報給密碼修改程式,此時就可以瞭解你的密碼強度了。所以當你有任何需要判斷是否在字典當中的密碼字串時,就可以使用pam_cracklib.so模組的功能,並根據驗證的回報結果來撰寫你的程式。

3、PAM模組語法設定

呼叫PAM的流程:

(1) 使用者開始執行 /usr/bin/passwd 這支程式,並輸入密碼;
(2)passwd 呼叫 PAM 模組進行驗證;
(3) PAM 模組會到 /etc/pam.d/ 找尋與程式 (passwd) 同名的配置檔案;
(4) 依據 /etc/pam.d/passwd 內的設定,引用相關的 PAM 模組逐步進行驗證分析;
(5)將驗證結果 (成功、失敗以及其他訊息) 回傳給 passwd 這支程式;
(6) passwd 這支程式會根據 PAM 回傳的結果決定下一個動作 (重新輸入新密碼或者通過驗證!)

由上可以看出,重點其實是/etc/pam.d裡面的配置檔案,以及配置檔案呼叫的PAM模組進行的驗證。

/etc/pam.d/passwd配置檔案內容:

以上出現include這個關鍵詞,其代表的是請呼叫後面的檔案來這個類別的認證,所以上述每一行都要重複呼叫/etc/pam.d/system-auth這個檔案來進行驗證。

<1>第一個欄位:驗證類別(type)

(1)auth:是 authentication (認證) 的縮寫,所以這種類別主要用來檢驗使用者的身份驗證,這種類別通常是需要密碼來檢驗的, 所以後續接的模組是用來檢驗使用者的身份。
(2)account:account (賬號) 則大部分是在進行 authorization (授權),這種類別則主要在檢驗使用者是否具有正確的許可權,舉例來說,當你使用一個過期的密碼來登入時,當然就無法正確的登入了。
(3)session:session 是會議期間的意思,所以 session 管理的就是使用者在這次登入 (或使用這個指令) 期間,PAM 所給予的環境設定。這個類別通常用在記錄使用者登入與登出時的資訊!例如,如果你常常使用 su 或者是 sudo 指令的話, 那麼應該可以在 /var/log/secure 裡面發現很多關於 pam 的說明,而且記載的資料是『session open, session close』的資訊!
(4)password:password 就是密碼嘛!所以這種類別主要在提供驗證的修訂工作,舉例來說,就是修改/變更密碼啦!

這四個驗證的型別通常是有順序的,不過也有例外。 原因是,(1)我們總是得要先驗證身份 (auth) 後, (2)系統才能夠藉由使用者的身份給予適當的授權與許可權設定 (account),而且(3)登入與登出期間的環境才需要設定, 也才需要記錄登入與登出的資訊 (session)。如果在運作期間需要密碼修訂時,(4)才給予 password 的類別。

<2>第二欄位:驗證的控制企標(control flag)

四種控制方式:

(1) required:此驗證若成功則帶有 success (成功) 的標誌,若失敗則帶有 failure 的標誌,但不論成功或失敗都會繼續後續的驗證流程。 由於後續的驗證流程可以繼續進行,因此相當有利於資料的登入 (log) ,這也是 PAM 最常使用 required 的原因。
(2)requisite:若驗證失敗則立刻回報原程式 failure 的標誌,並終止後續的驗證流程。若驗證成功則帶有 success 的標誌並繼續後續的驗證流程。 這個專案與 required 最大的差異,就在於失敗的時候還要不要繼續驗證下去?由於 requisite 是失敗就終止, 因此失敗時所產生的 PAM 資訊就無法透過後續的模組來記錄了。
(3)sufficient:若驗證成功則立刻回傳 success 給原程式,並終止後續的驗證流程;若驗證失敗則帶有 failure 標誌並繼續
後續的驗證流程。 這玩意兒與 requisits 剛好相反!
(4)optional:這個模組控制元件目大多是在顯示訊息而已,並不是用在驗證方面的。

控制旗標所造成的回報流程

4、常用模組簡介

模組資訊:

· /etc/pam.d/*:每個程式個別的 PAM 配置檔案;
· /lib64/security/*:PAM 模組檔案的實際放置目錄;
· /etc/security/*:其他 PAM 環境的配置檔案;
· /usr/share/doc/pam-*/:詳細的 PAM 說明檔案。
常見模組:

· pam_securetty.so:
限制系統管理員 (root) 只能夠從安全的 (secure) 終端機登入;那什麼是終端機?例如 tty1, tty2 等就是傳統的終端機裝置名稱。安全的終端機設定寫在 /etc/securetty 這個檔案中。你可以查閱一下該檔案, 就知道為什麼 root 可以從 tty1~tty7 登入,但卻無法透過 telnet 登入 Linux 主機了!

· pam_nologin.so:
這個模組可以限制一般使用者是否能夠登入主機之用。當 /etc/nologin 這個檔案存在時,則所有一般使用者均無法再登入系統了!若 /etc/nologin 存在,則一般使用者在登入時, 在他們的終端機上會將該檔案的內容顯示出來!所以,正常的情況下,這個檔案應該是不能存在系統中的。 但這個模組對 root 以及已經登入系統中的一般賬號並沒有影響。 (注意這與 /etc/nologin.txt 並不相同)

· pam_selinux.so:
SELinux 是個針對程式來進行細部管理許可權的功能,SELinux 這玩意兒我們會在第十六章的時候再來詳細談論。由於 SELinux 會影響到使用者執行程式的許可權,因此我們利用 PAM 模組,將 SELinux 暫時關閉,等到驗證通過後, 再予以啟動!

· pam_console.so:
當系統出現某些問題,或者是某些時刻你需要使用特殊的終端介面 (例如 RS232 之類的終端聯機裝置) 登入主機時, 這個模組可以幫助處理一些檔案許可權的問題,讓使用者可以透過特殊終端介面 (console) 順利的登入系統。

· pam_loginuid.so:
我們知道系統賬號與一般賬號的 UID 是不同的!一般賬號 UID 均大於 1000 才合理。 因此,為了驗證
使用者的 UID 真的是我們所需要的數值,可以使用這個模組來進行規範!

· pam_env.so:
用來設定環境變數的一個模組,如果你有需要額外的環境變數設定,可以參考 /etc/security/pam_env.conf 這個檔案的詳細說明。

· pam_unix.so:
這是個很複雜且重要的模組,這個模組可以用在驗證階段的認證功能,可以用在授權階段的賬號許可證管理, 可以用在會議階段的登入檔案記錄等,甚至也可以用在密碼更新階段的檢驗!非常豐富的功能! 這個模組在早期使用得相當頻繁喔!

· pam_pwquality.so:
可以用來檢驗密碼的強度!包括密碼是否在字典中,密碼輸入幾次都失敗就斷掉此次聯機等功能,都是這模組提供的! 最早之前其實使用的是 pam_cracklib.so 這個模組,後來改成 pam_pwquality.so 這個模組,但此模組完全兼容於 pam_cracklib.so, 同時提供了 /etc/security/pwquality.conf 這個檔案可以額外指定預設值!比較容易處理修改!

· pam_limits.so:
還記得我們在第十章談到的 ulimit 嗎? 其實那就是這個模組提供的能力!還有更多細部的設定可以考:/etc/security/limits.conf 內的說明。

 login 的 PAM 驗證機制流程:
(1) 驗證階段 (auth):首先,(a)會先經過 pam_securetty.so 判斷,如果使用者是 root 時,則會參考 /etc/securetty 的設定; 接下來(b)經過 pam_env.so 設定額外的環境變數;再(c)透過 pam_unix.so 檢驗密碼,若通過則回報 login 程式;若不通過則(d)繼續往下以 pam_succeed_if.so 判斷 UID 是否大於 1000 ,若小於 1000 則回報失敗,否則再往下 (e)以 pam_deny.so 拒絕聯機。
(2) 授權階段 (account):(a)先以 pam_nologin.so 判斷 /etc/nologin 是否存在,若存在則不許一般使用者登入;(b)接下來以 pam_unix.so 及 pam_localuser.so 進行賬號管理,再以 (c) pam_succeed_if.so 判斷 UID 是否小於 1000 ,若小於 1000 則不記錄登入資訊。(d)最後以 pam_permit.so 允許該賬號登入。
(3)密碼階段 (password):(a)先以 pam_pwquality.so 設定密碼僅能嘗試錯誤 3 次;(b)接下來以 pam_unix.so 透
過 sha512, shadow 等功能進行密碼檢驗,若通過則回報 login 程式,若不通過則 (c)以 pam_deny.so 拒絕登入。
(4)會議階段 (session):(a)先以 pam_selinux.so 暫時關閉 SELinux;(b)使用 pam_limits.so 設定好使用者能夠操作的系統資源; (c)登入成功後開始記錄相關資訊在登入檔案中; (d)以 pam_loginuid.so 規範不同的 UID 許可權;(e)開啟 pam_selinux.so 的功能。

例題:
為什麼 root 無法以 telnet 直接登入系統,但是卻能夠使用 ssh 直接登入?
答:一般來說, telnet 會引用 login 的 PAM 模組,而 login 的驗證階段會有 /etc/securetty 的限制! 由於遠端聯機屬於 pts/n (n 為數字) 的動態終端機介面裝置名稱,並沒有寫入到 /etc/securetty , 因此 root 無法以 telnet 登入遠端主機。至於 ssh 使用的是 /etc/pam.d/sshd 這個模組, 你可以查閱一下該模組,由於該模組的驗證階段並沒有加入 pam_securetty ,因此就沒有/etc/securetty 的限制!故可以從遠端直接聯機到伺服器端。

5、其他相關檔案

/etc/securetty 會影響到 root 可登入的安全終端機, /etc/nologin 會影響到一般使用者是否能夠登入的功能之外,我們也知道 PAM 相關的配置檔案在 /etc/pam.d , 說明檔案在/usr/share/doc/pam-(版本) ,模組實際在 /lib64/security/ 。相關的 PAM 檔案主要都在 /etc/security 這個目錄內

<1>limits.conf
我們在第十章談到的 ulimit 功能中, 除了修改使用者的 ~/.bashrc 配置檔案之外,其實系統管理員可以統一藉由 PAM 來管理的! 那就是 /etc/security/limits.conf 這個檔案的設定。這個檔案的設定很簡單,你可以自行參考一下該檔案內容。 我們這裡僅作個簡單的介紹:
範例一:vbird1 這個使用者只能建立 100MB 的檔案,且大於 90MB 會警告
[[email protected] ~]# vim /etc/security/limits.conf
vbird1    soft          fsize         90000
vbird1   hard          fsize       100000
#賬號  限制依據  限制專案   限制值
# 第一欄位為賬號,或者是群組!若為群組則前面需要加上 @ ,例如 @projecta
# 第二欄位為限制的依據,是嚴格(hard),還是僅為警告(soft);
# 第三欄位為相關限制,此例中限制檔案容量,
# 第四欄位為限制的值,在此例中單位為 KB。
[[email protected] ~]$ ulimit -a
....(前面省略)....
file size (blocks, -f) 90000
....(後面省略)....
[[email protected] ~]$ dd if=/dev/zero of=test bs=1M count=110
File size limit exceeded
[[email protected] ~]$ ll --block-size=K test
-rw-rw-r--. 1 vbird1 vbird1 90000K Jul 22 01:33 test
# 果然有限制到了
範例二:限制 pro1 這個群組,每次僅能有一個使用者登入系統 (maxlogins)
[[email protected] ~]# vim /etc/security/limits.conf
@pro1 hard maxlogins 1
# 如果要使用群組功能的話,這個功能似乎對初始群組才有效喔!而如果你嘗試多個 pro1 的登入時,
# 第二個以後就無法登入了。而且在 /var/log/secure 檔案中還會出現如下的資訊:
# pam_limits(login:session): Too many logins (max 1) for pro1
這個檔案挺有趣的,而且是設定完成就生效了

<2> /var/log/secure, /var/log/messages
如果發生任何無法登入或者是產生一些你無法預期的錯誤時,由於 PAM 模組都會將資料記載在/var/log/secure 當中,所以發生了問題請務必到該檔案內去查詢一下問題點!舉例來說, 我們在 limits.conf 的介紹內的範例二,就有談到多重登入的錯誤可以到 /var/log/secure 內查閱了。