基於PAM的用戶權能分配

這篇報告實際上是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手冊

配置實驗

  1. 創建一個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即可。

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章