PAM 教程:二、Linux-PAM 的配置文件

本系列講解了 Linux-PAM 的工作機(jī)制和配置方式帽揪,并利用幾個(gè) Linux-PAM 模塊做一些有趣的小實(shí)驗(yàn)。附錄中介紹了一些常用的 Linux-PAM 模塊辅斟。

本文的目標(biāo)讀者是期望了解 PAM 認(rèn)證機(jī)制的 Linux 用戶或者系統(tǒng)管理員转晰。如果您是開(kāi)發(fā)人員,希望編寫一個(gè)使用 PAM 認(rèn)證的應(yīng)用程序士飒,或者是為 PAM 寫插件的開(kāi)發(fā)人員查邢,本文的內(nèi)容可能并不能滿足您的需求,請(qǐng)參閱《Linux-PAM應(yīng)用開(kāi)發(fā)指南》(英文)和《Linux-PAM 模塊開(kāi)發(fā)指南》(英文)酵幕。

目錄

  1. PAM 簡(jiǎn)介

  2. Linux-PAM 的配置文件(本文)

  3. Linux-PAM 小實(shí)驗(yàn)

  4. Linux-PAM 模塊一覽(未完成)

  5. 參考文獻(xiàn)(未完成)


2. Linux-PAM 的配置文件綜述

PAM 的各個(gè)模塊一般存放在 /lib/security//lib64/security/ 中扰藕,以動(dòng)態(tài)庫(kù)文件的形式存在(可參閱 dlopen(3)),文件名格式一般為 pam_*.so芳撒。PAM 的配置文件可以是 /etc/pam.conf 這一個(gè)文件邓深,也可以是 /etc/pam.d/ 文件夾內(nèi)的多個(gè)文件。如果 /etc/pam.d/ 這個(gè)文件夾存在笔刹,Linux-PAM 將自動(dòng)忽略 /etc/pam.conf芥备。

/etc/pam.conf 類型的格式如下:

服務(wù)名稱  工作類別  控制模式  模塊路徑  模塊參數(shù)

/etc/pam.d/ 類型的配置文件通常以每一個(gè)使用 PAM 的程序的名稱來(lái)命令。比如 /etc/pam.d/su舌菜,/etc/pam.d/login 等等萌壳。還有些配置文件比較通用,經(jīng)常被別的配置文件引用,也放在這個(gè)文件夾下讶凉,比如 /etc/pam.d/system-auth染乌。這些文件的格式都保持一致:

工作類別  控制模式  模塊路徑  模塊參數(shù)

不難看出山孔,文件夾形式的配置文件中只是沒(méi)有了服務(wù)名稱這一列:服務(wù)名稱已經(jīng)是文件名了懂讯。

由于很難在時(shí)下的發(fā)行版本中找到使用 /etc/pam.conf 這一獨(dú)立文件作為 PAM 配置的例子,此處僅就 /etc/pam.d/ 格式舉例台颠。在筆者安裝的 CentOS(x64) 7.2.1511 中褐望,/etc/pam.d/login 的內(nèi)容如下:

#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

# 表示注釋。

每一行代表一條規(guī)則串前。但也可以用 \\ 來(lái)放在行末瘫里,來(lái)連接該行和下一行。

例子的最后一行開(kāi)頭有一個(gè)短橫線 -荡碾,意思是如果找不到這個(gè)模塊谨读,導(dǎo)致無(wú)法被加載時(shí),這一事件不會(huì)被記錄在日志中坛吁。這個(gè)功能適用于那些認(rèn)證時(shí)非必需的劳殖、安裝時(shí)可能沒(méi)被安裝進(jìn)系統(tǒng)的模塊。

工作類別(type)拨脉、流程棧(stack)和控制模式(control)

我們?cè)赱第一篇]({% post_url 2016-03-30-pam-tutorial-1-intro %})中接觸了 Linux-PAM 的四種工作類別(type)哆姻。在上面的例子中,工作類別作為第一列出現(xiàn)玫膀。

講到這里矛缨,我們有必要聊一聊 PAM 的流程棧(stack)概念:它是認(rèn)證時(shí)執(zhí)行步驟和規(guī)則的堆疊。在某個(gè)服務(wù)的配置文件中帖旨,它體現(xiàn)在了配置文件中的自上而下的執(zhí)行順序中箕昭。棧是可以被引用的,即在一個(gè)棧(或者流程)中嵌入另一個(gè)棧解阅。我們之后和它會(huì)有更多的接觸落竹。

第二列為控制模式(control),用于定義各個(gè)認(rèn)證模塊在給出各種結(jié)果時(shí) PAM 的行為瓮钥,或者調(diào)用在別的配置文件中定義的認(rèn)證流程棧筋量。該列有兩種形式,一種是比較常見(jiàn)的“關(guān)鍵字”模式碉熄,另一種則是用方括號(hào)([])包含的“返回值=行為”模式桨武。

“關(guān)鍵字”模式下,有以下幾種控制模式:

  • required:如果本條目沒(méi)有被滿足锈津,那最終本次認(rèn)證一定失敗呀酸,但認(rèn)證過(guò)程不因此打斷。整個(gè)棧運(yùn)行完畢之后才會(huì)返回(已經(jīng)注定了的)“認(rèn)證失敗”信號(hào)琼梆。
  • requisite:如果本條目沒(méi)有被滿足性誉,那本次認(rèn)證一定失敗窿吩,而且整個(gè)棧立即中止并返回錯(cuò)誤信號(hào)。
  • sufficient:如果本條目的條件被滿足错览,且本條目之前沒(méi)有任何required條目失敗纫雁,則立即返回“認(rèn)證成功”信號(hào);如果對(duì)本條目的驗(yàn)證失敗倾哺,不對(duì)結(jié)果造成影響轧邪。
  • optional:該條目?jī)H在整個(gè)棧中只有這一個(gè)條目時(shí)才有決定性作用,否則無(wú)論該條驗(yàn)證成功與否都和最終結(jié)果無(wú)關(guān)羞海。
  • include:將其他配置文件中的流程棧包含在當(dāng)前的位置忌愚,就好像將其他配置文件中的內(nèi)容復(fù)制粘貼到這里一樣。
  • substack:運(yùn)行其他配置文件中的流程却邓,并將整個(gè)運(yùn)行結(jié)果作為該行的結(jié)果進(jìn)行輸出硕糊。該模式和 include 的不同點(diǎn)在于認(rèn)證結(jié)果的作用域:如果某個(gè)流程棧 include 了一個(gè)帶 requisite 的棧,這個(gè) requisite 失敗將直接導(dǎo)致認(rèn)證失敗腊徙,同時(shí)退出棧简十;而某個(gè)流程棧 substack 了同樣的棧時(shí),requisite 的失敗只會(huì)導(dǎo)致這個(gè)子棧返回失敗信號(hào)昧穿,母棧并不會(huì)在此退出勺远。

“返回值=行為”模式則更為復(fù)雜,其格式如下:

[value1=action1 value2=action2 ...]

其中时鸵,valueN 的值是各個(gè)認(rèn)證模塊執(zhí)行之后的返回值胶逢。有 successuser_unknown饰潜、new_authtok_reqd初坠、default 等等數(shù)十種。其中彭雾,default 代表其他所有沒(méi)有明確說(shuō)明的返回值碟刺。返回值結(jié)果清單可以在 /usr/include/security/_pam_types.h 中找到,也可以查詢 pam(3) 獲取詳細(xì)描述薯酝。

流程棧中很可能有多個(gè)驗(yàn)證規(guī)則半沽,每條驗(yàn)證的返回值可能不盡相同,那么到底哪一個(gè)驗(yàn)證規(guī)則能作為最終的結(jié)果呢吴菠?這就需要 actionN 的值來(lái)決定了者填。actionN 的值有以下幾種:

  • ignore:在一個(gè)棧中有多個(gè)認(rèn)證條目的情況下,如果標(biāo)記 ignore 的返回值被命中做葵,那么這條返回值不會(huì)對(duì)最終的認(rèn)證結(jié)果產(chǎn)生影響占哟。
  • bad:標(biāo)記 bad 的返回值被命中時(shí),最終的認(rèn)證結(jié)果注定會(huì)失敗。此外榨乎,如果這條 bad 的返回值是整個(gè)棧的第一個(gè)失敗項(xiàng)怎燥,那么整個(gè)棧的返回值一定是這個(gè)返回值,后面的認(rèn)證無(wú)論結(jié)果怎樣都改變不了現(xiàn)狀了蜜暑。
  • die:標(biāo)記 die 的返回值被命中時(shí)铐姚,馬上退出棧并宣告失敗。整個(gè)返回值為這個(gè) die 的返回值史煎。
  • ok:在一個(gè)棧的運(yùn)行過(guò)程中谦屑,如果 ok 前面沒(méi)有返回值驳糯,或者前面的返回值為 PAM_SUCCESS篇梭,那么這個(gè)標(biāo)記了 ok 的返回值將覆蓋前面的返回值。但如果前面執(zhí)行過(guò)的驗(yàn)證中有最終將導(dǎo)致失敗的返回值酝枢,那 ok 標(biāo)記的值將不會(huì)起作用恬偷。
  • done:在前面沒(méi)有 bad 值被命中的情況下,done 值被命中之后將馬上被返回帘睦,并退出整個(gè)棧袍患。
  • N(一個(gè)自然數(shù)):功效和 ok 類似,并且會(huì)跳過(guò)接下來(lái)的 N 個(gè)驗(yàn)證步驟竣付。如果 N = 0 則和 ok 完全相同诡延。
  • reset:清空之前生效的返回值,并且從下面的驗(yàn)證起重新開(kāi)始古胆。

我們?cè)谇拔闹幸呀?jīng)介紹了控制模式(contro)的“關(guān)鍵字”模式肆良。實(shí)際上,“關(guān)鍵字”模式可以等效地用“返回值=行為”模式來(lái)表示逸绎。具體的對(duì)應(yīng)如下:

  • required
    [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
  • requisite
    [success=ok new_authtok_reqd=ok ignore=ignore default=die]
  • sufficient
    [success=done new_authtok_reqd=done default=ignore]
  • optional
    [success=ok new_authtok_reqd=ok default=ignore]
模塊路徑和模塊參數(shù)

正如前文所述惹恃,模塊一般保存在 /lib/security/lib64/security 中(取決于操作系統(tǒng)位數(shù))。Linux-PAM 配置文件中的模塊位置可以是相對(duì)于上述文件夾的相對(duì)路徑棺牧,也可以是文件的全路徑巫糙。

模塊參數(shù)用空格與模塊路徑相隔。該參數(shù)將只和特定模塊相關(guān)颊乘,因此某個(gè)模塊的文檔中一定包含其參數(shù)的信息参淹。如果需要在單個(gè)參數(shù)中使用空格,可以將整個(gè)參數(shù)用方括號(hào)([])包裹起來(lái)乏悄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浙值,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纲爸,更是在濱河造成了極大的恐慌亥鸠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異负蚊,居然都是意外死亡神妹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門家妆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸵荠,“玉大人,你說(shuō)我怎么就攤上這事伤极∮颊遥” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵哨坪,是天一觀的道長(zhǎng)庸疾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)当编,這世上最難降的妖魔是什么届慈? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮忿偷,結(jié)果婚禮上金顿,老公的妹妹穿的比我還像新娘。我一直安慰自己鲤桥,他們只是感情好揍拆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茶凳,像睡著了一般嫂拴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慧妄,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天顷牌,我揣著相機(jī)與錄音,去河邊找鬼塞淹。 笑死窟蓝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饱普。 我是一名探鬼主播运挫,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼套耕!你這毒婦竟也來(lái)了谁帕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冯袍,失蹤者是張志新(化名)和其女友劉穎匈挖,沒(méi)想到半個(gè)月后碾牌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儡循,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年舶吗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片择膝。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡誓琼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肴捉,到底是詐尸還是另有隱情腹侣,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布齿穗,位于F島的核電站傲隶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缤灵。R本人自食惡果不足惜伦籍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腮出。 院中可真熱鬧,春花似錦芝薇、人聲如沸胚嘲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馋劈。三九已至,卻和暖如春晾嘶,著一層夾襖步出監(jiān)牢的瞬間妓雾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工垒迂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留械姻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓机断,卻偏偏與公主長(zhǎng)得像楷拳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吏奸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容