Linux下的高級安全認證機制你用了嗎?!
原創(chuàng)【51CTO.com獨家特稿】Linux系統(tǒng)是一個多用戶、多進程的操作系統(tǒng),并且,它提供了眾多的系統(tǒng)和網(wǎng)絡服務給用戶使用。因此,從應用角度來說,它不可避免地需要對大量的應用及其用戶進行安全認證,只有通過了安全認證的用戶才能合理、合法地使用相應的系統(tǒng)和網(wǎng)絡服務。PAM機制是一個非常成熟的安全認證機制,可以為Linux多種應用提供安全、可靠的認證服務。本文將對PAM機制的原理、配置及其應用進行詳細介紹,用戶可以高效地使用該技術保證Linux系統(tǒng)的安全。
1 PAM認證機制簡介
為安全起見,計算機系統(tǒng)只有經(jīng)過授權的合法用戶才能訪問,在這里如何正確鑒別用戶的真實身份是一個關鍵的問題。所謂用戶鑒別,就是用戶向系統(tǒng)以一種安全的方式提交自己的身份證明,然后由系統(tǒng)確認用戶的身份是否屬實的過程。換句話說,用戶鑒別是系統(tǒng)的門戶,每個用戶進入到系統(tǒng)中都必須經(jīng)過鑒別這一道關。
嵌入式認證模塊(PAM)機制采用模塊化設計和插件功能,使得我們可以輕易地在應用程序中插入新的鑒別模塊或替換原先的組件,而不必對應用程序做任何修改,從而使軟件的定制、維持和升級更加輕松,因為鑒別機制與應用程序之間相對獨立。應用程序可以通過PAM API方便的使用PAM提供的各種鑒別功能,而不必了解太多的底層細節(jié)。
此外,PAM的易用性也較強,主要表現(xiàn)在它對上層屏蔽了鑒別的具體細節(jié),所以用戶不必被迫學習各種各樣的鑒別方式,也不必記住多個口令;又由于它實現(xiàn)了多鑒別機制的集成問題,所以單個程序可以輕易集成多種鑒別機制如Kerberos鑒別機制和Diffie-Hellman鑒別機制等,但用戶仍可以用同一個口令登錄而感覺不到采取了各種不同鑒別方法。
在廣大開發(fā)人員的努力下,各版本的UNIX系統(tǒng)陸續(xù)提供對PAM的支持。其中,Linux-PAM(Pluggable Authentication Modules for Linux)是專門為Linux操作系統(tǒng)實現(xiàn)的,包括Debian Linux 2.2、Turbo Linux 3.6、Red Hat Linux 5.0以及SuSE Linux6.2及它們的后續(xù)版本都提供對PAM的支持。FreeBSD從3.1版開始支持PAM。需要注意的是:除了具體實現(xiàn)不同外,各種版本Unix系統(tǒng)上的PAM的框架是相同的,所以本文介紹的Linux-PAM框架知識具有普遍性。
2 Linux-PAM的配置
Linux-PAM的目標就是為系統(tǒng)管理者提供最大限度的靈活性。系統(tǒng)管理者可以通過兩種形式對Linux-PAM進行配置:單一配置文件/etc/pam.conf;或者是/etc/pam.d/目錄。下面我們將討論其配置文件的語法,接著給出一些實際應用的例子,以供讀者參考。
2.1 Linux-PAM單一配置文件的語法
通過圖1讀者可能會注意到,配置文件也放在了在應用接口層中,它與 PAM API 配合使用,從而達到了在應用中靈活插入所需鑒別模塊的目的。它的作用主要是為應用選定具體的鑒別模塊,模塊間的組合以及規(guī)定模塊的行為。
在使用該配置文件前,讀者首先應該明白Linux-PAM的記號是大小寫敏感的。有兩個特殊的符號:“#”和“.”。配置文件中的注釋以#開頭,一般配置文件中每行是一個入口(除注釋外),但是如果某個入口的定義很長,可以通過使用轉(zhuǎn)義符回行,而下一行也被看作是這個入口的一部分。
一般/etc/pam.conf文件每行的格式如下:
service-name module-type control-flag module-path arguments
其中,每個字符段的具體含義如下:
service-name:為這個入口分配的服務名。通常這是給定應用程序的會話名。例如:ftpd、rlogind、su等等。Linux-PAM還為默認的驗證機制保留一個特殊的服務名,就是ohter,大小寫均可。另外,如果某個模塊指定了以命名的服務,那other就應該被忽略。
modle-type:Linux-PAM當前有四種類型的模塊:
auth:這種類型的模塊為用戶驗證提供兩方面的服務:讓應用程序提示用戶輸入密碼或者其它的標記,確認用戶的合法性;通過它的憑證許可權限,設定組成員關系或者其它優(yōu)先權。
account:這類模塊執(zhí)行基于非驗證的賬戶管理。它主要用來限制/允許用戶對某個服務的訪問時間,當前有效的系統(tǒng)資源(最多可以有多少個用戶),限制用戶的位置(例如:root用戶只能從控制臺登錄)。
session:這類模塊的主要用途是處理為用戶提供服務之前/后需要做的一些事情,包括:記錄打開/關閉數(shù)據(jù)的信息,監(jiān)視目錄等。
password:用來升級用戶驗證標記。
control-flag:控制標志用來設置驗證成功或者失敗后PAM需要作出的反應。因為模塊可以層疊,控制標志可以決定每個模塊的重要性。應用程序不會意識到單個模塊成功或者失敗,它只會收到Linux-PAM庫成功或者失敗的綜合反應信息。
層疊模塊的執(zhí)行順序取決于/etc/pam.conf文件的入口順序,入口列前的模塊先執(zhí)行。從Linux-PAM 6.0開始可以使用兩種語法定義控制標志。簡單的一種是使用單一關鍵詞定義控制標志。有四個這樣的關鍵詞:required、requisite、sufficient和optional。Linux-PAM通過如下方式解釋這些關鍵詞:
required:表示即使某個模塊對用戶的驗證失敗,也要等所有的模塊都執(zhí)行完畢之后,PAM才返回錯誤信息。這樣做是為了不讓用戶知道被哪個模塊拒絕。如果對用戶驗證成功,所有的模塊都會返回成功信息。
requisite:如果特定的模塊對用戶的驗證失敗,PAM馬上返回一個錯誤信息,把控制權交回應用程序,不再執(zhí)行其它模塊進行驗證。
sufficient:表示如果一個用戶通過這個模塊的驗證,PAM結(jié)構(gòu)就立刻返回驗證成功信息,把控制權交會應用程序。后面的層疊模塊即使使用requisite或者required控制標志,也不再執(zhí)行。如果驗證失敗sufficient的作用和optional相同。
optional:表示即使本行指定的模塊驗證失敗,也允許用戶享受應用程序提供的服務。使用這個標志,PAM框架會忽略這這個模塊產(chǎn)生的驗證錯誤,繼續(xù)順序執(zhí)行下一個層疊模塊。
module-path:PAM驗證模塊的路徑。如果以/開頭,就表示是完整的路徑;如果不是以/打頭,就表示是相對于/usr/lib/security的相對路徑。
args:傳遞給模塊的參數(shù)。類似于通常的Linux Shell命令行參數(shù)。有效的參數(shù)包括一些通用參數(shù)和特定于給定模塊的參數(shù)。無效的參數(shù)將被忽略,并會把錯誤信息記錄到syslog。
#p#需要特別注意:配置文件中的任何一行錯誤都會導致驗證失敗,同時相關錯誤信息被記錄到syslog。
舉一個簡單的例子如下:
Login auth required pam_unix.so debug
Login auth required pam_kerb.so use_mapped_pass
Login auth optional pam_rsa.so use_first_pass
這樣,當login程序執(zhí)行時先用pam_unix.so模塊即傳統(tǒng)的UNIX口令方式鑒別用戶,然后再調(diào)用pam_kerb.so模塊即Kerberos對用戶進行鑒別,最后用pam_rsa.so模塊即RSA方式鑒別用戶。在按上述順序鑒別用戶的過程中,如果pam_unix.so模塊鑒別失敗,它將繼續(xù)調(diào)用下面的模塊進行鑒別而非立刻向login程序返回錯誤消息;
pam_kerb.so模塊也按同樣方式處理,直到順序處理完最后一個pam_rsa.so模塊后,PAM才將前面出現(xiàn)的錯誤信息返回給login程序。對于該配置,即使pam_rsa.so模塊順利通過,只要pam_unix.so模塊和pam_kerb.so模塊中有一個出現(xiàn)錯誤,用戶就不能通過鑒別;相反,即使pam_rsa.so模塊失敗,只要pam_unix.so模塊和pam_kerb.so模塊都通過了,用戶也能通過鑒別。
再舉一個有關ftp的例子如下:
ftp auth required pam_unix_auth.so debug
這樣,當用戶使用ftp時,將用傳統(tǒng)的UNIX口令鑒別方式來驗證其身份。
值得一提的是:在有的Linux操作系統(tǒng)(比如Fedora)下并沒有現(xiàn)成的/etc/pam.conf文件可以使用,用戶需要按照本節(jié)的介紹自行進行生成和編輯。
2.2 口令映射機制
在同一個機器上使用多個鑒別機制,尤其是一個應用程序集成多種鑒別機制可能導致用戶需要記憶多個口令,這會讓用戶覺得很不舒服。雖然可以讓所有機制使用相同的口令來獲取易用性,但是這將削弱系統(tǒng)的安全性--如果其中任何一個機制的口令泄露了,則所有機制都會受到牽累。
此外,不同的鑒別機制在口令長度、容許的字符、更新間隔、有效期等方面可能具有他們特有的要求,這些要求也是為多鑒別機制使用同一個口令必須考慮的一個問題。
PAM為我們提供了這樣一種解決方案,它不排除為所有鑒別機制共用一個口令,同時允許通過口令映射技術讓每個機制使用不同的口令。該方案用用戶的"主口令"加密其他的"副口令",并且將這些經(jīng)過加密的副口令存放在一個用戶能訪問的地方。主口令一旦經(jīng)過驗證,鑒別模塊就能用它解密那些加密的副口令從而獲得相應口令,然后將所需口令傳遞給鑒別模塊。這稱為"口令映射"。
如果口令映射出現(xiàn)錯誤,或如果映射不存在,那么各鑒別模塊應該提示用戶輸入口令。為支持口令映射,主口令應保存在PAM第二層并且在需要時由其提供給堆疊的各個鑒別模塊。同時,口令要在pam_authenticate函數(shù)返回之前清除。為了保障口令映射的安全,主口令必須足夠強壯,可以考慮使其的長度更長、組成口令字符的類型多樣化并使用混合類型的字符組成口令等有效措施。
口令如何加密及其存儲完全取決于具體的實現(xiàn):它能夠?qū)⒓用艿母笨诹睿ㄒ卜Q作"映射口令")存儲在可靠或不可靠的地方,諸如智能卡、本地文件或目錄服務。當然,如果加密的口令保存在一個不可靠的允許公共訪問的地方,會留下受到字典攻擊的隱患。
為實現(xiàn)口令映射,所有鑒別模塊應支持以下四個映射選項∶
use_first_pass∶它表示當該模塊執(zhí)行時不提示用戶輸入口令,而將該模塊之前的提示用戶輸入的主口令作為它們的公共口令進行驗證。如果用戶沒能通過主口令的鑒別,則該模塊不提示用戶輸入口令。此選項一般說來在系統(tǒng)管理員想強制用同一個口令通過多模塊時使用。
try_first_pass∶除了如果主口令不正確,將提示用戶輸入口令之外,它的用法與use_first_pass相同。
use_mapped_pass∶它表示使用口令映射技術得到此模塊的有效口令。也就是說,該模塊執(zhí)行時不提示用戶輸入口令,而是用映射口令即用主口令解密得到的該模塊的副口令作為本模塊的口令輸入進行驗證。如果在此之前用戶沒能通過主口令的鑒別,則該模塊也不會提示輸入口令。
try_mapped_pass∶除了如果主口令不正確,它將提示用戶輸入口令之外,該項與use_mapped_pass用法相同。
當口令更換后,PAM會保存所有新舊口令,并且使有關模塊能夠訪問到它們。其他模塊能夠使用此信息更新加密的口令而不必強制用戶再次輸入口令。
現(xiàn)以上面使用的有關login的配置文件為例講解口令映射:
Login auth required pam_unix.so debug
Login auth required pam_kerb.so use_mapped_pass
Login auth optional pam_rsa.so use_first_pass
在這里login程序集成了三種鑒別方式:傳統(tǒng)UNIX口令鑒別、Kerberos和RSA鑒別,但通常情況下用戶僅輸入一次口令便能通過鑒別了。當程序調(diào)用pam_unix.so模塊時,PAM提示用戶輸入他們的UNIX口令,然后由pam_kerb.so模塊對用戶輸入的UNIX口令進行鑒別。
繼而調(diào)用pam_kerb.so模塊,由于該模塊的選項為use_mapped_pass,它將利用口令映射機制進行認證,也就是說,如果UNIX口令鑒別通過的話,就將其作為pam_kerb.so模塊的主口令來解密其對應的映射口令從而進行Kerberos鑒別。
如果pam_unix.so模塊所需口令沒能通過驗證,則無法進行口令映射,那么PAM將直接調(diào)用下一鑒別模塊而不提示用戶輸入其Kerberos口令。最后一個模塊的選項為use_first_pass,所以pam_rsa.so模塊將使用前邊輸入的主口令來鑒別用戶,如果口令錯誤也不提示用戶輸入RSA口令。所以,只要第一次輸入的口令是正確的,并且映射口令存在,則一個口令便足以通過鑒別。
2.3 基于目錄的配置形式
從Linux-PAM 5.6版開始引入了一種基于目錄的配置方式,通過/etc/pam.d/目錄下的文件對PAM進行配置。這種方式比單一的配置文件具有更大的靈活性。這個目錄下的所有配置文件都以某個服務名命名(小寫)。不過,這兩種配置方式不能同時起作用,也就是說,自己只能使用其中一種對Linux-PAM進行配置。一般/etc/pam.d/優(yōu)先。
#p#/etc/pam.d/目錄下的配置文件的語法和/etc/pam.conf文件的語法相似,形式如下(參見圖 1所示的關于sshd的PAM配置):
module-type control-flag module-path arguments
和/etc/pam.conf文件語法的唯一不同就是沒有服務名(service-name),服務名由文件名設置。例如:/etc/pam.d/login文件保存對login服務的設置。
這種配置方式與單一配置文件相比,具有很大的優(yōu)越性:
減少了配置錯誤的幾率。
更易于維護。
可以通過使用不同配置文件的符號連接決定系統(tǒng)的驗證策略。
可以加快對于配置文件的解析。
可以對單個的Linux-PAM配置文件設置不同的存取權限。
更易于軟件包的管理。
3 Linux-PAM使用舉例
本節(jié)將給出幾個使用PAM技術對用戶進行安全認證,從而提高系統(tǒng)以及網(wǎng)絡服務安全性的例子,來向讀者介紹如何在實踐中對該機制進行熟練的使用。在系統(tǒng)用戶的認證中,我們將介紹如何使用PAM來控制用戶登錄;在網(wǎng)絡服務安全保證的例子中,我們將介紹如何控制FTP服務器的用戶登錄問題。
3.1 使用Linux-PAM控制用戶安全登錄
假設系統(tǒng)的安全需求為:控制可以登錄系統(tǒng)的用戶,只允許root用戶可以從本地登錄,并且只允許liyang用戶可以從192.168.13.8網(wǎng)段遠程登錄Linux系統(tǒng),其他用戶均不可以登錄系統(tǒng)。
為了完成上述安全控制功能,我們需要修改/etc/pam.d/login文件,加入新的規(guī)則如圖 2中白色區(qū)域所示:
不難看出,我們在原來的基礎上加入了以下這一條規(guī)則(在上述程序段用黑體標明):
account required /lib/security/pam_access.so accessfile=/etc/login.conf
這條規(guī)則的具體含義是我們使用pam_access模塊,通過配置文件/etc/login.conf來對用戶訪問進行控制,accessfile參數(shù)即指明了配置文件的完整路徑。
根據(jù)需求,我們的/etc/login.conf文件內(nèi)容如下:
# vi /etc/login.conf
+:root:LOCAL
+:liyang:192.168.13.
-:ALL:ALL
該配置文件的含義如下:
+:root:LOCAL:表示root用戶可以從本地登錄
+:liyang:192.168.13.:表示用戶liyang可以從192.168.13.8/24網(wǎng)段遠程登錄Linux系統(tǒng)
-:ALL:ALL:表示拒絕其他任何人登錄
可以清楚地看到,該文件的每一行由如下三個字段構(gòu)成,中間使用冒號分割,格式為:權限 : 用戶 : 來源
權限字段使用“+”表示允許訪問,“-”表示禁止訪問;
用戶字段可以是用戶名、組名以及諸如
來源字段可以是tty名稱(本地登錄時)、主機名、域名(以“.”開始),主機IP地址,網(wǎng)絡號(以“.”結(jié)束)。ALL表示任何主機,LOCAL表示本地登錄。這里需要特別強調(diào)一下:ALL字段在/etc/login.conf文件中出現(xiàn)的順序非常重要。如果它出現(xiàn)在文件頭部,那么后續(xù)的其他字段所表示的訪問權限將隨之失效;如果它出現(xiàn)在其他字段之后,那么其他的字段將生效。所以一般建議將ALL字段表示的訪問權限置于文件末尾處,以保證其他訪問權限的正常解析和使用。
3.2 使用Linux-PAM控制Samba用戶的共享登錄
在Samba中集成PAM的訪問控制功能,非常簡單,只需要完成如下兩個步驟即可。首先,在Samba服務器的配置文件smb.conf的[global]配置段中,保證如下的語句未被屏蔽:
obey pam restrictions = yes
然后,保證有關Samba的PAM配置/etc/pam.d/samba文件正常即可,該配置文件如圖 3所示:
3.3 使用Linux-PAM控制FTP用戶的登錄
假設Linux系統(tǒng)提供FTP服務,但是不希望任何用戶都可以輕易地訪問該服務,只允許在一個事先定義好的文件中規(guī)定的用戶可以使用該FTP服務。那么,我們就可以使用Linux-PAM機制來實現(xiàn)該控制。
當然,值得注意的是該FTP服務需要支持Linux-PAM。幸運的是,當前Linux中的proftpd、vsftpd等都對其完全支持。在下面的例子中,我們將以最新的vsftpd為例來進行舉例說明。
首先,我們需要定義與認證相關的/etc/pam.d/vsftpd文件如圖 4所示:
其中的pam_listfile.so模塊就是用來實現(xiàn)基于用戶的FTP控制。Item=user就表明是通過用戶名進行控制,sense=allow表示如果用戶名出現(xiàn)在/etc/vsftpd.ftpusers文件中就返回認證成功信息,file=/etc/vsftpd.ftpusers指定配置文件,onerr=succeed表示如果出現(xiàn)某些錯誤(比如無法打開配置文件等)時返回的結(jié)果,這里是成功信息。
然后,我們需要編輯/etc/vsftpd/ftpusers文件,并在其中加入可以進行ftp訪問的用戶名,要注意每個用戶占一行(如下所示),之后重啟動vsftpd即可,就可以根據(jù)這個配置文件通過用戶名來對FTP訪問進行控制了,如圖 5所示:
【51CTO.COM 獨家特稿,轉(zhuǎn)載請注明出處及作者!】
【編輯推薦】