用PAM來增強LINUX伺服器的安全(一)

技術小胖子發表於2017-11-15

伺服器的系統安全確實是一件讓大多數使用者頭痛的事情:如何確保系統中使用應用程式或服務的使用者確是使用者本人?如何給這些使用者指定限制訪問服務的時間段?以及如何限制各種應用程式或服務對系統資源的使用率等等?所有的這些問題,常規的安全措施並不能妥善地解決。在使用Linux核心的RedHat企業Linux3中,已經整合了一種叫做可插入式認證模組(Pluggable Authentication Modules)的安全驗證方式,能夠用它來完成上面所示的任務。

    可插入認證模組(簡稱PAM)是基於模組化設計、具有可插入功能的一種獨立於應用程式之外的驗證方式。使用PAM後,應用程式可以不需要整合驗證功能,而由PAM來完成。例如,在Linux系統中,Login服務為使用者提供系統登入服務,它提示使用者輸入相應的使用者名稱和密碼來驗證使用者的有效性,當使用PAM後,這個驗證過程可以由PAM來代替。PAM具有很大的靈活性,系統管理員可以通過它為應用程式自由選擇需要使用的驗證方式。鑑於PAM有這麼多優點,在本文中,將以RedHat企業Linux3為應用平臺,來討論如何使用PAM來增強Linux伺服器的安全效能。

一、PAM入門必讀

當LINUX伺服器中的某個應用程式或服務需要使用PAM來進行驗證時,只要此應用程式或服務支援PAM驗證功能,就可以通過修改其相應的PAM配置檔案,加放相應的驗證方式,當重新啟用些服務或應用程式時,PAM模組就會通過其專用API來讀取它的配置檔案,根據配置檔案中的內容來提供相應的驗證功能。所有驗證功能都是通過一些庫檔案來提供的。

因此,在使用PAM之前,先掌握PAM配置檔案的設定方法,瞭解一些常用的驗證模組就顯得非常必要。

當某個支援PAM驗證的應用程式啟動時,就會通過PAM的API讀取它的PAM配置檔案,然後根據配置檔案中驗證項指定的內容,再由API呼叫所需的驗證模組來完成配置檔案中指定的驗證任務。從這裡可以看出,要掌握PAM的使用,就必需瞭解配置檔案的配置規則,以及各種驗證模組的意義和作用。

在這裡還要注意的是,一個Linux系統下的應用程式能夠使用PAM功能,最關鍵的是它已經將支援PAM功能的程式碼整合到了原始碼當中。如果你能夠得到一個應用程式的原始碼,你也可以自行將支援PAM的功能程式碼加入其中。但是,如果你得到的二進位制檔案不具有這些PAM功能程式碼,那麼,此應用程式就不支援PAM驗證功能。檢視應用程式是否具有PAM驗證功能,可以使用ldd命令檢視其動態連線庫中有沒有libpam和libpam_misc,有就支援。

1、設定PAM的配置檔案

在RedHat企業Linux3系統中,每個支援PAM驗證的應用程式或服務,都有一個相應的PAM配置檔案,存放在/etc/pam.d/目錄。要想這些配置檔案有效,就必需將這些配置檔名字編寫程式序原始碼中。通常,這些配置檔案的名字與其對應的應用程式的名字是一樣的。

    要想設定這些配置檔案,只需要通過VI或VIM來開啟它們,然後新增或刪除其中的驗證項就可以。

    開啟/etc/pam.d/目錄下的任何一個配置檔案,其中每行的驗證規則都使用如下所示的語法格式:

    Type  Control-flag  Module-path  Module-arguments

    其中每行代表一個獨立的驗證方式,每個配置檔案可以由多種驗證規則相互疊加而成。驗證時PAM-API會按照從上往下的方式一一讀取這些驗證規則,並根據其中的控制標誌做出相應的動作。

在編輯配置檔案時一定要小心謹慎,由於規則的驗證是有上下順序之分的,因此你要小心確定某些危險的驗證規則處於配置檔案中的正確位置。因為一旦出錯,可能會導致系統的部分功能或整個系統不能訪問,這樣你就不得不重新恢復它們的備份。

    要正常配置PAM配置檔案,就應當瞭解配置檔案方法格式中每列的所包括的內容,下面是這些列的簡短說明:

(1)、Type列,主要用來指定需要驗證的型別。一共有以下四種驗證型別:

1、 auth 驗證使用者身份,提示輸入帳號和密碼;

2、 account 提供對帳戶的進一步驗證,例如驗證帳戶的此操作是否已經過期,許可權多大,擁有此許可權的時間期限是否已經過期等等;

3、 password 提供對密碼的細緻控制,例如控制密碼的使用期限,重複輸入的次數,密碼鎖定後的解禁時限等等。

4、 session 對每個會話進行跟蹤和記錄,記錄的內容包括登入的使用者名稱及登入的時間和次數等等。

    (2)、Control-flag列,主要用來控制在驗證過程中動作和返回結果的方式。它有兩種型別的表達方式:簡單的就是使用一個簡單的關鍵字,複雜的可以使用方括號來巢狀控制標誌,並可在方括號中使用value=action的方式表達。

簡單的關鍵字有四個:

1、 required 

當使用此控制標誌時,當驗證失敗時仍然會繼續進行其下的驗證過程,它會返回一個錯誤資訊,但是,由於它不會由於驗證失敗而停止繼續驗證過程,因此使用者不會知道是哪個規則項驗證失敗。

2、 requisite 

此控制標誌與required的驗證方式大體相似,但是,只要某個規則項驗證失敗則立即結束整個驗證過程,並返回一個錯誤資訊。使用此關鍵字可以防止一些通過暴力猜解密碼的攻擊,但是,由於它會返回資訊給使用者,因此,它也有可能將系統的使用者結構資訊透露給攻擊者。

3、 sufficient 

只要有此控制標誌的一個規則項驗證成功,那麼PAM構架將會立即終止其後所有的驗證,並且不論其前面的required標誌的項沒有成功驗證,它依然將被忽略,然後驗證通過。

4、 optional 

表明對驗證的成功或失敗都是可有可無的,所有的都會被忽略。(通常用於session型別)

複雜的控制標誌能夠讓管理員可以指定在驗證過程中發生某種事件時可以執行的動作。這些控制標誌用方括號包括起來,並由一系列的value=action 所構成,每個值之間用空格分開。

在新版PAM中,可供你選擇的value列表存在於/usr/include/security/_pam_types.h檔案中。其中的內容包括:success,open_err,symbol_err,ervice_err,system_err,buf_err,perm_denied,auth_err,cred_insufficient,authinfo_unavail,user_unknown,maxtries,new_authtok_reqd,acct_expired,session_err,cred_unavail,cred_expired,cred_err,no_module_data,conv_err,authtok_err,authtok_recover_err,authtok_lock_busy,authtok_disable_aging,try_again,ignore,abort,authtok_expired,module_unknown,bad_item,conv_again,incomplete,和default。

    action 可以是一個無符號的整數,當在某行驗證規則的控制標誌的value指定期一個無符號的整數時n,就表明由此行往下的n行驗證模組將被直接跳過。

Action還可以是下列所示的值:

         ignore:設定此值後,指定的事件將會被忽略。

 bad :設定此值後,當發生指定的事時的返回值將被認為是驗證模組失敗。如果此驗證模組是整個驗證堆疊中的第一個失敗的模組, 它的狀態值將作為整個堆疊的狀態。

 die:它的作用與bad 相同,但是,當設定此值的此類事件發生時,會終止整個驗證模組的後續驗證工作,立即返回到應用程式。

 ok :設定此值可以用來覆蓋此行驗證規則前面已經返回了PAM_SUCCESS的所有值,但是如果前面有驗證規則返回了一個錯誤的值,那麼就不會被它覆蓋。

 done:它的作用與ok 相同,但是,當設定此值的此類事件發生時,會終止整個驗證模組的後續驗證工作,立即返回到應用程式。

 reset :設定此值的作用是用來清除記憶體中原先的驗證模組狀態,並重新開始下一組的驗證。

    第三列是Module-path,用來為要驗證的服務提供需要使用的驗證模組。在Fedora Core 6系統中,當要引用的模組處於/lib/security/或/lib64/security/目錄時,可以只輸入模組的完整名稱;如果要引用的模組不存在這兩個預設的儲存目錄,就必需在模組的完整名稱前加上完整的模組路徑名。例如/usr/lib/security/。

        第四列是Module-arguments,用來為引用的模組指定特殊的選項,多個選項之間可以通過空格隔開,還可在選項中使用“[ ]”來輸入巢狀的命令或字串,當選項超過一行時用“”符號連線下一行。

3、PAM中常用的驗證模組說明

    要掌握PAM的使用,我們還應當去了解一些常用的PAM驗證模組的作用,畢竟PAM的具體驗證功能都是由這些可插入的驗證模組來完成的。在RedHat企業Linux3系統中,預設的PAM驗證檔案存在於/lib/security/或/lib64/security/目錄,它們都是以“.so”為字尾的檔案。

    每個PAM驗證模組的使用物件,總是與PAM的驗證型別相對應的。有些驗證模組只針對某一種驗證方法,例如pam_access.so驗證模組只與account驗證型別配套使用,而有些驗證模組卻可以與所有的驗證型別一起使用,例如pam_unix.so驗證模組。你在瞭解這些驗證模組時,應當同時瞭解它們的所屬於驗證類別。

    下面是一些常用的驗證模組的簡要說明:

(1)、pam_access驗證模組

pam_access驗證模組一般與account驗證型別一同使用。它主要用於對訪問進入管理,提供基於登入名、主機名或域名、公網IP地址或網路號,以及非網路登入時的tty名稱的訪問控制。pam_access驗證模組主要是根據/etc/security/access.conf配置檔案中的內容,來進行相應的驗證工作的。如果access.conf檔案不在預設的/etc/security/目錄,你可以在其後使用accessfile引數指定自定義配置檔案的絕對路徑。

/etc/security/access.conf配置檔案中的每一行都由如下三個欄位構成,中間用冒號隔開:

permission:users/groups:origins

permission(許可權)欄位可以用“+”,即允許訪問,“-”禁止訪問來表示相應的許可權。

users/groups(使用者或組)欄位可以是一個或幾個登入名、組名及ALL(表示任何人)的一個清單。要區分哪個是使用者名稱,哪個是組名,可以將組名加入到一個括號中,例如(groups)。

origins(來源)欄位可以是非網路登入時的tty名稱、主機名、域名(以“.”開始)、主機地址、網路號(以“.”結束)、帶有子網掩碼的公網IP地址,以及ALL(表示任何主機)和LOCAL只要不包含“.”的所有字元)。還可以使用EXCEPT操作符來表示除…之外。

(2)、pam_cracklib驗證模組

    pam_cracklib驗證模組通常只與password驗證型別一起使用。這個驗證模組可以通過插入password堆疊,為特殊的應用提供可插入式密碼強度性檢測。它的工作方式就是先提示使用者輸入密碼,然後使用一個系統字典和一套規則來檢測輸入的密碼是否不能滿足強壯性要求。密碼的強度檢測分二次進行,第一次只是檢測密碼是否是提供的對比字典中的一部分,如果檢測結果是否定的,那麼就會提供一些附加的檢測來進一步檢測其強度,例如檢測新密碼中的字元佔舊密碼字元的比例,密碼的長度,所用字元大小寫狀況,以及是否使用了特殊字元等等。 

由於pam_cracklib驗證模組提供了細緻的密碼強度檢測,因此,當我們在使用時,必需為它指定相應的額外檢測選項。這些選項包括:

debug:此選項表示將模組資訊寫入系統日誌

type=xxx:此選項用來修改預設的密碼提示文字,例如,如果預設提示輸入密碼的文字為“New Passwork:”,那麼你就可以通過設定type=my password:來改變提示文字。  

retry=N:此選項定義使用者在重試輸入多少次密碼後,返回一個錯誤資訊,然後不準繼續輸入。預設是1次。

difok=N:此選項用來定義新密碼中必須有幾個字元要與舊密碼不同,如果新密碼中有1/2以上的字元與舊密碼不同時,該新密碼就會被接受。

    difignore=N:此選項用來設定在difok之前收到多少個字元時,difok設定會被忽略,預設為23。

minlen=N:此選項用來設定新密碼的最小長度。

  dcredit=N:此選項用來設定新密碼中可以包含數字的最大數目。

ucredit=N:此選項用來設定新密碼中可以包含的大寫字母的最大數目。

  lcredit=N:此選項用來設定新密碼中可以包含的小寫字母的最大數目。

ocredit=N:此選項用來設定新密碼中可以包含的特殊字元的最大數目。

    minclass=N:此選項用來規定新密碼中的字元類別的最小數目,字元一般有四種類別:數字、大寫字母、小寫字母,以及特殊字元。

    use_authtok:在某個與密碼相關的驗證模組後使用此選項,例如pam_unix.so驗證模組,可以強迫此模組不提示輸入密碼,而使用上面設定的另一種方式,例如pam_cracklib.so。

    dictpath=/path/to/dict:指定cracklib目錄路徑。

(3)、pam_limit驗證模組

pam_limits驗證模組通常與session驗證類別一同使用。它主要用來限制使用者在會話過程中對系統資源的使用,即使UID=0的使用者也受它的限制。此模組使用一個獨立的配置檔案來設定對系統資源的限制情況,預設的配置檔案是/etc/security/limits.conf,在使用中可以用conf選項來指定配置檔案所在的位置。當你使用pam_limits驗證模組時,先對此配置檔案進行相應的設定總是一個不錯的選擇。

    /etc/security/limits.conf配置檔案的設定語法如下:

    <domain> <type> <item> <value>

配置檔案語法格式中的“domain”列可以是使用者名稱、採用@group語法的組名,還可以用萬用字元“*”來表示任何使用者,以及使用“%”萬用字元來只限制maxlogins,並可以採用%group的語法格式。

配置檔案語法格式中的“type”列有兩個值:

soft:用來設定對系統資源的軟限制,它允許使用者所使用的系統資源可以在設定的硬限制值的規定範圍來上下浮動。

hard:用來設定對系統資源的硬限制,這些硬限制由超級使用者設定,並由系統核心來執行。普通使用者對系統資源的使用率不能超過設定的硬限制設定值。

    配置檔案語法格式中的“item”和“value”是成對使用的,“item”表示某類具體的系

統資源,而“value”就是“item”的值。在limits.conf配置檔案中可以設定的系統資源有:

core:    核心檔案的大小 (KB)

data:     最大的資料包大小(KB)

fsize:     最大的檔案大小(KB)

memlock: 最大可用的記憶體空間(KB)

nofile:    最大可以開啟的檔案數量

rss:      最大的可駐留空間(KB)

stack:    最大的堆疊空間(KB)

cpu:      最大的CPU佔用時間(minutes)

nproc:    最大允許執行的程式數量

as:       地址空間限制(KB)

maxlogins: 使用者可以登入到系統的最多次數,UID=0的使用者除外

    priority:    優先執行的使用者程式(負值越高的程式優先)

    sigpending: 最大數量的等待訊號(Linux2.6及以上核心)

    msqqueue:  POSIX資訊佇列的最大可使用的記憶體(bytes)(Linux2.6及以上核心)

    locks:      最大可鎖定檔案的數目(Linux2.4及以上核心的系統)

上面這些“item”專案是一些對系統資源使用情況非常有用的,新版本的PAM中還新加入了其它一些專案,你可以通過它的幫助文件得到它們的說明。需要注意的是,使用者的限制優先順序要高於組的限制,如果你為一個組設定了某種系統資源限制,但是其中的某個使用者設定了另一級別的系統資源限制,那麼,系統將會優先按使用者級別的限制處理。另外,如果無限制可以使用“-”號表示。

優先順序高。

(4)、pam_time驗證模組

pam_time驗證模組通常與account驗證型別一起使用。它並不對使用者提供驗證服務,而是用來限制使用者在指定的日期、時間及終端線路上對系統或特定應用程式進行訪問。 

要正確使用Pam_time驗證模組,必需有一個正確的/etc/security/time.conf相配套。此配置檔案中每一行的語法格式為:

services;ttys;users;times

services欄位:表示應用PAM功能的服務名稱。

ttys欄位:應用此規則的終端名,可以“*”號表示任何終端,“!”表示非。 

users欄位:應用此規則的使用者名稱單或網路組名,可以“*”號表示任何使用者,“!”表示非。 

times欄位:指定時間,通常使用日期/時間範圍的格式來表示。可以用星期幾英文單詞前兩個字母來表示具體的日期,例如MoTuSa就是指星期一星期二和星期六。注意:重複的日期將會被取消,比如MoMo表示任何一天都沒有。兩個字母的組合有: Mo、Tu、We、Th、Fr、Sa、Su、Wk、Wd、Al, Mo到Su分別指從星期一到星期天,Wk指每一天,Wd指週末,Al也指每一天,例如AlFr指除星期五外的每一天。 時間採用24小時制,即HHMM(時分)的形式。日期/時間範圍前可有“!”表表除此以外的所有日期/時間,用“-”連線指定的時間範圍,如果結束時間小於開始時間,就表明時間持續到第二天的結束時間,例如Al1800-0800就是指每天下午6點整到第二天的早晨8點整。

(5)、pam_listfile驗證模組

pam_listfile驗證模組通常與auth驗證型別一起使用。此模組提供根據某個指定的檔案來允許或禁止使用者訪問某個應用程式或服務的功能,這些被指定的檔案必需事先存在,然後通過file引數來指定該檔案。pam_listfile驗證模組可以根據使用者名稱、tty、rhost、ruser、使用者組、使用的shell來對使用者進行訪問控制。 

Pam_listfile驗證模組可以使用的選項有: 

item=[tty|user|rhost|ruser|group|shell]:設定訪問控制的物件型別。 

sense=allow|deny:用來指定當在儲存“item”物件的檔案中找不到item指定的物件時的動作方式,如果在檔案中找不到相應的物件,則執行相反的動作。

onerr=succeed|fail:用來指定當某類事件(如無法開啟配置檔案)發生時的返回值。 

file=filename:指定儲存有“item”物件的檔案位置。 

apply=[user|@group]:用指定使用非使用者和組類別時,這些規則所適用的物件。當item=[user|ruser|group]時,這個選項沒有任何意義,只有當item=[tty|rhost|shell]時才有意思。

(6)、pam_unix驗證模組

pam_unix提供基於/etc/passwd 和 /etc/shadow檔案的類UNIX風格的認證。它適用所有的驗證型別,包括:auth、account、 password、session。

當pam_unix驗證模組與auth驗證型別一起使用時,此模組可以使用的選項有debug、audit、use_first_pass、try_first_pass、nullok和nodelay,主要功能是驗證使用者密碼的有效性,在預設情況下(即不帶任何引數時),該模組的主要功能是禁止密碼為空的使用者提供服務; 

在作為account型別使用時,此時該模組可識別的引數有debug、audit,該模組主要執行建立使用者帳號和密碼狀態的任務,然後執行提示使用者修改密碼,使用者採用新密碼後才提供服務之類的任務; 

在作為password型別使用時,此時該模組可識別的引數有debug、 audit、 nullok;、not_set_pass、use_authtok、try_first_pass、use_first_pass、md5、bigcrypt、shadow、nis、 

remember,該模組完成讓使用者更改密碼的任務; 

在作為session型別使用時,此時該模組沒有可識別的引數,該模組僅僅完成記錄使用者名稱和服務名到日誌檔案的工作。 

Pam_unix驗證模組可以使用的選項有:

debug:將除錯資訊寫入系統日誌,當pam_unix驗證模組與所有驗證類別使用時都有效。

audit:提供比debug更多診斷除錯,它只有當pam_unix驗證模組與 auth、account及password驗證型別使用時有效。

nullok:預設情況下,如果密碼為空,那麼就不允許使用者訪某項服務,而使用此項後將則覆蓋這個預設動作。它只有當pam_unix驗證模組與 auth、和password驗證型別使用時有效。

nodelay:當使用者驗證失敗後,系統在給出錯誤資訊時會有一個延遲,預設為2秒鐘。當使用此選項後,將取消這個延遲。它只有當pam_unix驗證模組與 auth驗證型別使用時有效。 

try_first_pass:當pam_unix驗證模組與auth驗證型別一起使用時,使用該選項將在提示使用者輸入密碼前,嘗試使用以往的密碼驗證方式來對使用者進行驗證。而當pam_unix驗證模組與password驗證型別一起使用時,該選項主要用來防止使用者新設定的密碼與以前的舊密碼相同。

use_first_pass:當pam_unix驗證模組與auth驗證型別一起使用時,使用該選項將在提示使用者輸入密碼前,直接使用以往的密碼驗證方式來對使用者進行驗證。而當pam_unix驗證模組與password驗證型別一起使用時,該選項主要用來防止使用者新設定的密碼與前面password提供的密碼相同。 

use_authok:當使用者修改時,使用此選項強制使用者使用前面堆疊驗證模組提供的密碼,例如由pam_cracklib驗證模組提供的新密碼。當pam_unix驗證模組與password驗證型別一起使用時有效。

md5:採用md5對使用者密碼進行加密, 當pam_unix驗證模組與password驗證型別一起使用時有效。

shadow:使用用shadow密碼,當pam_unix驗證模組與password驗證型別一起使用時有效。

sha256:使用此選項,當下次修改密碼時將用SHA256演算法加密,如果SHA256的libcrypt不存在,就會重新使用MD5加密密碼。Sha512與此選項相同,只是加密強大不同而已。當pam_unix驗證模組與password驗證型別一起使用時有效。

rounds=n:用來指定使用SHA256和SHA512演算法加密密碼時重複雜湊演算法的次數。當pam_unix驗證模組與password驗證型別一起使用時有效。

remember=n:使用此選項將會將n個使用過的舊密碼,以MD5的方式加密後儲存到/etc/security/opasswd檔案中。當pam_unix驗證模組與password驗證型別一起使用時有效。

 (7)、pam_deny驗證模組可以用來禁止所有的訪問,當你設定PAM配置檔案時,為了安全,在開始的行可以使用它來禁止所有的訪問,以減少錯誤配置引起的安全風險。而pam_permit驗證模組卻總是允許所有的訪問,你要謹慎的使用此驗證模組。它們都適用於所有的驗證型別。

(8)、pam_rootok驗證模組允許/etc/pam.d/su中的使用者不需要任何驗證就可以登入系統。因此,你應當小心設定/etc/pam.d/su檔案,並且在使用時要與pam_wheel驗證模組一同使用,以保證root許可權只允許在pam_wheel的限制中進行。它只適用於auth驗證型別。

(9)、pam_security驗證模組只對root使用者有影響。當root使用者登入時,pam_security驗證模組會參考/etc/securetty目錄中的控制終端列表,來保證root使用者不會從不安全的終端登入。它一般與auth驗證型別一現使用。

(10)、pam_nologin驗證模組,如果/etc/nologin檔案存在,此模組將禁止所有的登入。它一般與auth和account驗證型別一同使用。

(11)、pam_echo驗證模組用來給使用者顯示通過file選項指定的檔案中的內容,它適用於所有的驗證型別。pam_motd驗證模組允許將/etc/motd檔案中的內容顯示給使用者,它只適用於session驗證型別。

(12)、pam_lastlog顯示使用者上次登入的日期和時間,它主要通過讀取/var/log/lastlog檔案來顯示。它只適用與session驗證型別。

(13)、pam_warn將剛登入的資訊記錄到系統日誌當中,它一般與auth和password驗證型別一同使用。

(15)、pam_wheel驗證模組,當使用此驗證模組後,只有加入到了一個wheel group中的的根使用者,並且提交的密碼有效,才能訪問指定的服務或系統。將它與pam_rootok一同使用能增加對根使用者的限制。它只適用於auth和account驗證型別。

    在/lib/security/或/lib64/security/目錄中還有許多沒有在上面列出的驗證模組,由於它們的使用頻率不高,加上文章篇幅的限制,就不再在此對它們做相應的說明,大家可以參考PAM管理員指南來得到它們的詳細說明。

 本文轉自 雪源梅香 51CTO部落格,原文連結:

http://blog.51cto.com/liuyuanljy/163369,如需轉載請自行聯絡原作者


相關文章