這篇報告實際上是OS安全的一個小作業,放上來感覺可能會對未來的學弟學妹有所幫助。
基於PAM用戶權限設置系統
PAM簡要介紹
PAM,全稱Pluggable Authentication Modules for Linux,即Linux下的可拔插驗證模塊,可以允許系統管理員選擇應用驗證用戶的方式。
早期,如果一個應用需要驗證一個用戶,需要在編譯層面上加入特殊的驗證機制。而傳統的UNIX系統驗證用戶身份的方式是讓用戶輸入一個正確的密碼。這個密碼,在經過加鹽處理後,進行加密。然後如果這個加密的密碼與系統密碼數據庫相同,用戶就通過認證了。在這樣的系統中,不是所有的權限都是按這種單一的驗證機制來授予,大部分是通過組機制來授予的。
Linux-PAM的目的是將權限授予軟件的開發與合適驗證方案的開發分開來。應用通過使用PAM的庫函數來實現用戶認證機制。PAM的設置通常在/etc/pam.d/
路徑下,原理圖如下。
+----------------+
| application: X |
+----------------+ / +----------+ +================+
| authentication-[---->--\--] Linux- |--<--| PAM config file|
| + [----<--/--] PAM | |================|
|[conversation()][--+ \ | | | X auth .. a.so |
+----------------+ | / +-n--n-----+ | X auth .. b.so |
| | | __| | | _____/
| service user | A | | |____,-----'
| | | V A
+----------------+ +------|-----|---------+ -----+------+
+---u-----u----+ | | |
| auth.... |--[ a ]--[ b ]--[ c ]
+--------------+
| acct.... |--[ b ]--[ d ]
+--------------+
| password |--[ b ]--[ c ]
+--------------+
| session |--[ e ]--[ c ]
+--------------+
使用PAM的方式就是在設置下添加相應的規則。PAM設置語法如下:
service type control module-path module-arguments
- service:表示服務的名字,比如telnet,login,ftp等。
- type:表示四種模塊類型,有auth、account、open_session、close_session、password。
- control:用來告訴PAM庫該如何處理與該服務相關的PAM模塊的成功或失敗的情況,有四個可能的值:required、requisite、sufficient、optional。
- module-path:表示用來指明本模塊對應的程序文件的路徑名,一般採用絕對路徑。
- module-arguments:傳遞給該模塊的參數
具體的說明可以查看PAM手冊。
配置實驗
- 創建一個testping用戶
以root權限清除ping命令的setuid位和各種權能
setcap -r /bin/ping
chmod u-s /bin/ping
切換到userping用戶,並進行ping操作,發現無法ping成功。
切換到iskindar用戶,同樣進行ping操作,仍然無法成功
在/usr/local/bin/
目錄下新建ping_cap.sh
腳本文件,實現功能:當userping用戶登錄時,給/bin/ping添加權能
#!/bin/sh
[ "$PAM_TYPE" == "open_session" ] || exit 0
if [ "$PAM_USER" == "testping" ]; then
setcap cap_net_raw=eip /bin/ping
echo "SUCCESS"
else
setcap -r /bin/ping
echo "Clear Capabilities"
fi
chmod u+x /usr/loca/bin/ping_cap.sh
由於所有登錄都是使用common-session
模塊
在/etc/pam.d/common-session
文件中添加如下規則:
vim /etc/pam.d/common-session
session optional pam_exec.so debug log=/tmp/pam_exec.log seteuid /usr/local/bin/ping_cap.sh
pam_exec是PAM的一個可以使用外部命令的模塊。
- session:在用戶登陸前把事情給幹完,比如掛載目錄、記錄一些關鍵信息等
- optional:可選的,一般不會對身份認證起作用。這裏是爲了防止腳本賦權失敗導致用戶無法登錄。
- debug:打印debug信息
- log=/tmp/pam_exec.log:命令的打印信息會打印到這個文件
- seteuid: pam_exec.so會用真實用戶ID執行外部命令。
- /usr/local/bin/ping_cap.sh:外部命令
切換到userping用戶,使用ping命令,這次就可以ping通了。
切換到iskindar用戶,會發現仍然無法ping
查看pam_exec的日誌,發現剛剛切換用戶時的日誌信息都成功打印了。
實驗總結
本實驗參考了網上挺多的博客,取長補短,解決了其userping用戶退出會影響其他用戶對ping的使用的缺點。這次實驗基於PAM來設置用戶權限。利用了PAM的pam_exec模塊來執行外部命令,進而爲userping用戶賦予允許使用原生套接字的權能,從而來userping用戶能夠使用ping命令。當userping用戶退出時,切換到別的用戶時,會自動執行清除/bin/ping
的權能,從而避免不該使用ping命令的用戶執行ping。值得注意的是,這個外部命令的權限很大,能夠賦予userping權能,但對於userping來說是可執行、不可讀和不可寫的狀態,也避免了userping用戶利用這個外部命令濫用權力。
遇到的兩個小問題
1.執行腳本文件出現錯誤:
[: missing ]
這裏是語法錯誤,中括號需要和前面的字符空一個空格。
錯誤代碼:
[ "$PAM_TYPE" == "open_session"] || exit 0
在session的引號後面加個空格:
[ "$PAM_TYPE" == "open_session" ] || exit 0
2.執行腳本文件時出現以下錯誤:
[: XXXX: unexpected operator
原因:ubuntu默認的sh是dash,dash跟bash不兼容導致出錯。
解決方法:將ubuntu解釋器修改默認連接到bash
輸入命令:
sudo dpkg-reconfigure dash
彈出一個窗口,選擇NO即可。