1.1 概述
Linux身份鑒別機制是保護操作系統(tǒng)安全的重要機制之一,是防止惡意用戶進入系統(tǒng)的一個重要環(huán)節(jié)。早期的身份鑒別機制就是傳統(tǒng)的UNIX身份鑒別機制,它采用口令加密并與原密碼進行對比的方式來對用戶身份進行鑒別。但是這種加密方式過于單一,在一個服務中用戶的帳號密碼泄露會涉及到多個服務的安全性,所以為了增強系統(tǒng)的安全性,出現(xiàn)了許多其他的身份鑒別機制,如指紋認證、USB認證等。但是這樣導致了一個問題,為了應用這些認證機制,就需要重新編寫并編譯應用程序(如系統(tǒng)登陸服務login)。
為了解決這個問題,1995年Sun公司的Vipin Samar和Charlie Lai提出了PAM(Pluggable Authentication Modules)身份鑒別機制,它采用模塊化設計和插件功能,使得系統(tǒng)在更改認證機制時不再需要修改應用程序,極大的提高了認證機制的靈活性。本報告對Linux各用戶帳號的權(quán)限區(qū)別進行了分析,對傳統(tǒng)UNIX身份鑒別機制的實現(xiàn)過程進行了研究,重點對PAM身份鑒別機制的實現(xiàn)過程進行了研究與分析,最后通過一個具體的PAM策略演示場景實現(xiàn)了身份鑒別機制的執(zhí)行過程,研究結(jié)果也發(fā)現(xiàn)Linux身份鑒別機制是在Linux用戶態(tài)下實現(xiàn)的,并不涉及內(nèi)核的具體實現(xiàn)。
1.2 涉及到的源碼范圍
由于Linux身份鑒別機制是在用戶態(tài)下實現(xiàn),本報告涉及的源碼包括Linux-PAM-1.1.6,openpam和Linux su命令的實現(xiàn)。具體范圍說明如下:
Linux-PAM-1.1.6/moudles/pam_access.c:登錄認證模塊的實現(xiàn)源碼。
Linux-PAM-1.1.6/libpam:PAM所用的頭文件。
openpam/lib/pam_acct_mgmt.c:賬號管理接口函數(shù)實現(xiàn)。
Linux su命令:Linux系統(tǒng)命令源碼包。
1.3 技術(shù)方案及原理
Linux身份鑒別機制就是對請求服務的用戶身份進行鑒別,并且賦予相應的權(quán)限的過程。本文通過查閱資料,分析Linux系統(tǒng)中對各用戶帳號的管理及其權(quán)限分配,分析傳統(tǒng)的UNIX身份鑒別機制,以su命令的代碼實現(xiàn)來進行說明,著重分析PAM身份鑒別機制,并對其代碼實現(xiàn)來進行分析說明。
1.3.1 Linux中用戶賬號管理
在Linux系統(tǒng)中,系統(tǒng)設置了多個帳號和組來進行管理,每個帳號都具有不同的權(quán)限,例如超級用戶root就具有最大的權(quán)限,對所有的文件具有讀寫執(zhí)行的權(quán)限,但是普通用戶對某些文件只具有讀有時甚至連讀的權(quán)限都沒有。Linux操作系統(tǒng)并不是以帳號名稱來識別用戶的,而是以標識符UID和GID來辨別用戶的,這些帳號的信息都存放在/etc/passwd文件當中,該文件中記錄的每個帳號信息是以行來表現(xiàn)的,如下所示:
root:x:0:0:root:/root:/bin/bash
每行是以7個字段來描述的,每個字段以冒號來進行分隔,其中對應字段的依次解釋如下:
1. 帳號名稱:用來對應UID。
2. 密碼:所有的用戶都有對該文件的訪問權(quán)限,為了防止密碼竊取,就將這個字段的密碼數(shù)據(jù)改放到/etc/shadow中了,所以這里顯示的是X。
3. UID:用戶標識符,表1-1列出了redhat系統(tǒng)中UID號的限制。
表1-1 UID限制
4. GID:用戶組標識符,具體信息存放在/etc/group中。
5. 用戶信息說明列:解釋這個帳號的意義。
6. 主文件夾:即用戶的主文件夾。
7. Shell:當用戶登錄系統(tǒng)后就會取得一個shell來與系統(tǒng)的內(nèi)核通信以進行用戶的操作任務(一個shell可以用來替代成讓帳號無法取得shell環(huán)境的登錄操作/sbin/nologin)。
/etc/shadow中也是這樣的字段,具體字段的意義這里不再做詳細解釋,這個文件主要是為了增加系統(tǒng)安全性而另外設置用來存放用戶的密碼,只有root用戶才有權(quán)限訪問,但是為了安全性顯示的仍然是加密后的密碼。
系統(tǒng)是通過UID、GID來對不同的帳號進行區(qū)分的,但是系統(tǒng)中是如何對應實現(xiàn)具體的權(quán)限設置的呢?這里就從文件的權(quán)限來進行說明。執(zhí)行l(wèi)s -al命令后,結(jié)果如圖1-1所示。
圖1-1 文件屬性
每行顯示內(nèi)容分為七列:第一列代表這個文件的類型與權(quán)限,第二列表示有多少文件名鏈接到這個節(jié)點,第三列表示這個文件的所有者的帳號,第四列表示這個文件的所屬用戶組,第五列表示這個文件的容量大小,默認單位為B,第六列為該文件的創(chuàng)建文件日期或者是最近的修改日期,第七列為該文件名。
第一列中總共有10個字符,這10個字符解釋如下:
1. 第一個字符為[d],表示為目錄,為[-]則是文件,為[l]則是鏈接文件,為[b]則表示設備文件里面的可供存儲的接口設備,為[c]則表示設備文件里面的串行端口設備,比如鍵盤、鼠標等。
2. 接下來都是以三個字符為一組,一共有三組,且每組都是以“rwx”這樣的形式組合,其中[r]代表刻度,[w]代表可寫,[x]代表可執(zhí)行,如果沒有該權(quán)限則會用[-]來表示。第一組是文件所有者的權(quán)限,第二組為同組的權(quán)限,第三組為其他非本用戶組的權(quán)限。這樣就把文件的可讀屬性與不同用戶帳號的權(quán)限對應起來了。
1.3.2 傳統(tǒng)的UNIX身份鑒別機制原理
傳統(tǒng)的UNIX身份鑒別即口令認證方式,它主要通過識別用戶的用戶名或者UID號獲取在/etc/shadow中存放的對應用戶密碼密文等信息,然后獲取用戶輸入密碼并采用crypt()函數(shù)對獲得的輸入密碼進行加密,當然加密方式是與原用戶密碼的加密方式是一致的,然后將這兩個密文進行比較,如果一致則通過驗證,如果不一致則拒絕賦予權(quán)限。接下來以登錄Linux系統(tǒng)為例,說明登錄過程中傳統(tǒng)UNIX認證方式對用戶帳號的鑒別過程。Linux用戶在登錄主機時會出現(xiàn)一個輸入賬號及密碼的界面,Linux會先找尋/etc/passwd里面是否有這個賬號,如果拒絕用戶登錄請求,如果有的話則將該賬號對應的UID、GID、該賬號的主目錄與shell設定一并讀出,接著就是將用戶輸入密碼進行加密,然后讀取/etc/shadow中存放的密碼,將這個密碼與用戶輸入并加密的密碼進行核對,如果核對成功,則進入系統(tǒng)。
Linux提供getpwnam()來獲取用戶登錄的相關(guān)信息,返回的是一個passwd型的結(jié)構(gòu)體,該結(jié)構(gòu)體就包含了用戶帳號的各種信息,該結(jié)構(gòu)體如下所示。
1.3.3 PAM身份鑒別機制原理
PAM(Pluggable Authentication Modules)即可插拔驗證模塊,它是一個非常完善的身份驗證機制,它采用模塊化設計和插件功能,從而可以輕易的在應用程序中插入新的鑒別模塊或者替換原來的組件,而不必對應用程序做任何修改,從而使軟件的定制、維持和升級更加輕松。PAM 的易用性較強,它對上層屏蔽了鑒別的具體細節(jié),用戶不必詳細知道各種鑒別機制是如何實現(xiàn)的,它還實現(xiàn)了多鑒別機制的集成問題。
1.3.3.1 PAM框架
PAM為了實現(xiàn)其插件功能和易用性,采取了分層設計思想。就是讓各鑒別模塊從應用程序中獨立出來,然后通過PAM的API、SPI作為兩者聯(lián)系的紐帶,這樣應用程序就可以根據(jù)需要靈活地在其中“插入”所需要的鑒別功能模塊,從而真正實現(xiàn)了在認證和鑒別基礎上的隨需應變。PAM框架如下圖所示:
其中的配置文件(etc/pam.d)是由系統(tǒng)管理員來設置的,用以制定認證策略。當應用程序調(diào)用PAM的API時,應用接口層按照PAM配置文件的定義來加載相應的認證鑒別模塊,然后把請求(即從應用程序那里得到的參數(shù))傳遞給底層的認證鑒別模塊,這時認證鑒別模塊就可以根據(jù)要求執(zhí)行具體的認證鑒別操作了。當認證鑒別模塊執(zhí)行完相應的操作后,再將結(jié)果返回給應用接口層,然后由接口層根據(jù)配置的具體情況將來自認證鑒別模塊的應答返回給應用程序。
上面簡單描述了PAM的運作方式,下面對它的三個層次加以介紹:
1.最上層為應用程序?qū)樱菏褂肞AM 機制的應用程序(如login、su等),調(diào)用PAM接口庫的上層接口API來實現(xiàn)認證功能;
2.中間為應用接口層:連接應用程序和服務模塊的中間層,它根據(jù)配置文件中的設置加載相應的服務模塊,將請求傳遞到具體的服務模塊,向應用程序的開發(fā)者提供API使用各種鑒別模塊,向鑒別模塊的開發(fā)者提供SPI來掛載新的鑒別模塊;
3.最下層為服務模塊:服務模塊中都為動態(tài)鏈接庫,它給應用程序提供具體的認證用戶服務,應用程序可以使用幾個服務模塊。PAM所支持的四種任務管理:account類型表示賬戶管理,它執(zhí)行賬戶管理,它主要用來限制/允許用戶對某個服務的訪問時間,當前有效的系統(tǒng)資源(最多可以有多少個用戶),限制用戶的位置(例如:root用戶只能從控制臺登錄);auth類型表示認證管理,對用戶進行認證。讓應用程序提示用戶輸入密碼或者其它的標記,確認用戶的合法性;通過它的憑證許可權(quán)限,設定組成員關(guān)系或者其它優(yōu)先權(quán);password類型表示口令管理,用于更新與用戶相關(guān)的認證特性,如更改用戶密碼;session類型表示會話管理,用于進入給定的服務之前,或者離開給定的服務之后,需要進行的會話操作,如:存儲關(guān)于與用戶交換數(shù)據(jù)的log信息、掛接目錄等?!?】
1.3.3.2 PAM的配置文件
應用PAM的服務例程是通過讀取PAM的配置文件初始化pam_handle這個句柄,用來記錄整個PAM的過程信息例如服務名、接口傳遞參數(shù)等,定義服務的配置文件存放在/etc/pam.d中,/etc/pam.conf也是pam的配置文件,該配置文件是老版本的配置文件,目前所安裝的版本當中,如果有pam.d這個文件就首要讀取這個文件,若沒有再讀取pam.conf這個文件,另外若所讀服務不存在相應配置文件,此時系統(tǒng)會讀取other這個配置文件的信息,other這個配置文件是所有服務的缺省選項。pam.d中的配置文件的語法形式如下:
module-type control-flag mudle-path arguments【3】
1.module-type:linux PAM所提供的四種服務模塊,包括auth、account、session、password;
2.control-flag:控制標志用來設置驗證成功或者失敗后PAM需要做出的反應,有四個關(guān)鍵詞如下所示:
required:表示即使某個模塊對用戶的驗證失敗,也要等所有的模塊執(zhí)行完成,PAM才可以返回錯誤信息,如此用戶就不知道被哪個模塊拒絕了。
requisite:一旦模塊對用戶的驗證失敗,PAM立馬返回出錯信息。
sufficient:一旦模塊對用戶的驗證成功,PAM立馬返回成功信息,并把控制權(quán)交給用戶。
optional:PAM會忽略這個模塊所產(chǎn)生的驗證錯誤,繼續(xù)執(zhí)行下一個模塊。
3.module-path:PAM驗證模塊的路徑;
4.arguments:傳遞給模塊的參數(shù)。參數(shù)是可選擇的,可以是讀取另外配置文件的路徑信息,也可以是各種模塊所需的傳遞參數(shù)。以下列出pam_unix模塊的參數(shù)信息:
表1-2 pam_unix模塊參數(shù)【3】
pam_conf配置文件的寫法與pam.d中的配置文件沒有太大的出入,只是在最前面多了一行具體的服務名稱,例如login,而pam.d中是將各種模塊分開來寫,這樣更便于控制。
1.1.3.3 PAM接口函數(shù)
PAM提供了多種接口函數(shù)以供用戶使用,其中包括框架API【4】、服務類型的API和服務模塊SPI。
框架API:
每個支持PAM機制的應用程序在使用PAM機制之前必須調(diào)用函數(shù)pam_start()初始化PAM上下文和PAM事務,使用完后調(diào)用pam_end()來結(jié)束PAM機制,通過pam_get_item、pam_set_item()來讀寫PAM事物的狀態(tài)信息,通過pam_get_data()、pam_set_data()來取得和設置PAM模塊及會話的相關(guān)信息,通過pam_putenv()、pam_getenv()、pam_getenvlist()來讀寫環(huán)境變量,通過pam_strerror()返回相關(guān)的錯誤信息;
服務類型的API:
1.認證管理模塊通過pam_authenticate()對用戶名和密碼進行認證,通過pam_setcred()用來修改用戶的信任參數(shù),建立數(shù)字認證;
2.賬戶管理模塊通過pam_acct_mgmt()來檢查用戶本身是否具有權(quán)限登錄系統(tǒng)、賬戶是否過期、賬戶是否有登錄時間限制等;
3.密碼管理模塊通過pam_chauthtok()來修改用戶的密碼;
4.會話管理模塊通過pam_open_session()來開始會話,以pam_close_session()來結(jié)束會話;
PAM中的API與SPI詳細解釋如表1-3所示。
表1-3 PAM中API以及SPI【3】
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209335 -
PAM
+關(guān)注
關(guān)注
2文章
52瀏覽量
13338
原文標題:Linux身份鑒別機制概述
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論