引言:對于Linux來說,如果提高安全性,防止非法用戶登錄系統(tǒng),是不可忽視的安全問題。因此,如何鑒別用戶的身份,成了問題的關(guān)鍵。使用PAM認證機制,可以簡單輕松的在系統(tǒng)或者程序中插入不同的認證模塊,來靈活高效的的鑒別用戶的身份。
使 用PAM(Plugable Authentication Modules,即可插入的認證模塊)認證機制,可以簡單輕松的在系統(tǒng)或者程序中插入不同的認證模塊,來靈活高效的的鑒別用戶的身份。因為PAM模塊和程序是相互獨立的,可以根據(jù)需要自由的插入各種認證模塊,在程序或服務(wù)中集成多種身份認證機制,大大來提高系統(tǒng)和程序的安全性。
一般來說,系統(tǒng)對登錄者的信息進行驗證,依靠的是“/etc/passwd”或者“/etc/shadow”密碼文件。在默認情況下針對的是本地登錄。如果系統(tǒng)中啟動了FTP服務(wù),訪問者也可以利用本地賬戶來通過FTP服務(wù)的驗證。諸如 Samba,MySQL,Apache等服務(wù),是無法利用本地賬戶進行驗證的,必須依靠其本身的認證設(shè)置。
按照傳統(tǒng)的Unix認證方式,當用戶訪問郵件服務(wù)器等應(yīng)用程序時,需要提交賬戶名和密碼,該應(yīng)用程序會利用C Library庫中的函數(shù)得到對應(yīng)的密碼哈希值,并將其和存儲在本地的系統(tǒng)密碼文件中的哈希值進行比對。隨著系統(tǒng)中安裝的服務(wù)和程序的增多,為了便于賬戶信息集中管控,可以借助于LDAP目錄來實現(xiàn)。這樣,服務(wù)或者應(yīng)用為了實現(xiàn)認證,就必須重寫C Library庫中的函數(shù),使其支持LDAP賬戶信息認證。這種方法實現(xiàn)起來很繁瑣,為了解決該問題,最好辦法涉及到了NSS(Name Service Switch)。
NSS其實是一些特定的模塊,和一系列的庫文件對應(yīng)。應(yīng)用程序只需添加所需的模塊,讓其負責(zé)上述重寫C Library庫中的函數(shù)的功能,而無需應(yīng)用程序自身的參與。在登錄時系統(tǒng)會將賬戶名轉(zhuǎn)換為唯一的UID,這其實就涉及到了名稱解析機制,這是由NSS負責(zé)。
在Linux中,賬戶名可能存儲在不同的位置,這就必然需要多種名稱解析方法與之對應(yīng)。在NSS的配置文件中,可以管理和配置這些解析方法。執(zhí)行“vim /etc/nsswitch.conf”命令,在其中可以添加所需的NSS模塊。例如“hosts:”一行中可以添加“dns”,表示在執(zhí)行名稱解析時可以調(diào)用NSS中的DNS模塊來實現(xiàn)。在“password:”行中默認存在“files”項,表示從本地密碼文件中提取賬戶信息,在其后可以添加“LDAP”,表示允許通過NSS的LDAP模塊來定位目錄服務(wù)器位置,進而查找相關(guān)賬戶名等。
在“shadow:files”一行中就說明了NSS和PAM存在的一定的聯(lián)系,即當NSS完成賬戶名稱的定位以及將其轉(zhuǎn)換為UID之后,還會告訴 PAM 到“/etc/shadow”文件中查找該賬戶對應(yīng)的密碼信息,即將用戶的輸入的密碼通過MD5(Salt)的方式轉(zhuǎn)換為哈希值,然后與“/etc/shadow”文件中對應(yīng)的賬戶的密碼哈希進行比對,如果一致則表示密碼正確。當然這種關(guān)聯(lián)并非絕對,實際上PAM認證機制也可以不用借助于NSS的名稱解析服務(wù)來查找用戶密碼存儲位置。對于很多服務(wù)或者程序來說,對應(yīng)的PAM認證也可以自行查找相關(guān)密碼的存儲位置。執(zhí)行“getent password”命令,就可以從“nsswitch.conf”文件中名為的“password”數(shù)據(jù)庫名中查詢其內(nèi)容,還可以執(zhí)行“getent shadow”,“getent group”,“getent hosts” 等命令,來查詢對應(yīng)的內(nèi)容。
執(zhí)行“cd/lib”命令,根據(jù)不同的系統(tǒng)版本,進入對應(yīng)的文件夾,例如對于64位系統(tǒng)來說,可以進入其中的“l(fā)ib64”目錄,執(zhí)行“l(fā)s”命令,可以顯示大量的模塊信息。要想支持一個新的New Service名稱服務(wù),就必須在上述目錄中安裝名稱格式為“l(fā)ibnss_具體的服務(wù)名.so”的模塊文件。
這樣,當用戶訪問某個程序或者服務(wù)時,由特定的NSS模塊負責(zé)處理用戶名信息,而密碼的驗證和管控則交給相應(yīng)的PAM模塊來處理,程序和服務(wù)本身并不參與這些過程。其最大優(yōu)勢是實現(xiàn)了賬戶的集中管理,大大提高了安全管理的靈活性。例如,執(zhí)行“authconfig-tui”命令,在認證配置界面左側(cè)的“User Information”欄中可以選擇賬戶名稱查找和解析方式,包括“Cache Information”,“User LDAP”,“Use NIS”,“Use IPAv2”,“Use Winbind”等。
這樣,對于用戶名稱信息就交由LDAP模塊負責(zé),對其的認證則交由Kerberos模塊負責(zé)。和Kerberos模塊對應(yīng)的是“/lib64/security/pam_krb5.so”文件,該文件負責(zé)調(diào)用Kerberos認證,而無需應(yīng)用程序參與。在上述“l(fā)ib64”目錄中進入“security”目錄,執(zhí)行“l(fā)s”命令,可以查看所有的PAM模塊文件,這些庫文件都是以“PAM_”開頭的。例如,按照上述方法在本地“/etc/shadow”文件中實現(xiàn)密碼認證,就需要使用到其中的“PAM_unix.so”模塊。PAM認證模塊同樣工作于中間層,在應(yīng)用程序和系統(tǒng)之間提供認證功能。程序或服務(wù)只需調(diào)用對應(yīng)的PAM模塊,就可簡單快捷的來驗證用戶的身份。
除了系統(tǒng)自帶的PAM模塊外,用戶也可以手工安裝所需的PAM模塊,例如當執(zhí)行Kerberos認證的“kerberos5.so”庫文件并不存在時,可以執(zhí)行“yum provide "/lib64/security/pam_krb5.so"”命令來查找該文件來自何處。執(zhí)行“yum–y install pam_krb5”命令,來安裝該庫文件。當安裝了一個新的PAM模塊,就相當于提供了一種新的認證方式。只要修改程序的PAM配置信息,就可以立即讓該認證方式生效。
使 用“required”,“requisite”,“sufficient”,“optional”等參數(shù),可以對上述管理組進行有效控制。對于“required”來說,執(zhí)行的認證必須成功,否則繼續(xù)保持之后的測試,但是最后的結(jié)果是失敗的。例如當?shù)卿汱inux時,先輸入用戶名,即使輸入錯誤的用戶名,系統(tǒng)也不會提示錯誤,而是允許繼續(xù)輸入密碼,但是最終的結(jié)果是無法登錄系統(tǒng)。例如對于“session required pam_limits.so” 來說,會執(zhí)行限制訪問方面的檢測。如在上述“l(fā)imits.conf”文件中添加“yonghu1-maxlogins 2”一行,表示只允許“yonghu1”用戶最多登錄2個控制臺。這樣,當其登錄的控制臺數(shù)量大于預(yù)設(shè)值后就拒絕其繼續(xù)登錄。
對于“requisite”來說,如果執(zhí)行的驗證失敗,則立即返回失敗信息。例如,在登錄時,如果密碼錯誤,則立即結(jié)束測試并退出。對于“sufficient”來說,不管之前的認證是否通過,只要該次認證通過,就表示測試成功。對于“optional”參數(shù)來說,通常和“session”管理組配合使用?!皊ession optional pa m_kb r5”,“se ssion optional pam_ldap.so”來說,表示不管認證成功與否,都需要在日志中記錄相關(guān)信息,例如何時認證成功/失敗等。但這對于最終的認證結(jié)果沒有什么影響。
以一個簡單的PAM配置文件為例來分析其功能。例如打開某個PAM配置文件,其第一行為“auth required pam_env.so”,其功能是通過“pem_env.so”文件,根據(jù)“/etc/security/pam_env.conf”文件給出的變量設(shè)置一個環(huán)境?!癮uth sufficient pam_unix.so likeauth nullok”一行的作用是調(diào)用“pam_unix.so”模塊來檢測用戶的密碼,其中的“l(fā)ikeauth”參數(shù)表示允許用戶在輸入密碼時打錯字或者更換密碼字符,只要最終輸入的是正確的密碼即可,“nullok”參數(shù)允許用戶使用空白的密碼,出于安全考慮,最好不要使用該參數(shù)。如果用戶輸入的密碼正確,就不必執(zhí)行以下檢測了。
“auth required pam_deny.so”行的作用是拒絕訪問,表示密碼出錯將拒絕用戶登錄?!癮ccount required pam_unix.so”行的作用是檢查該用戶是不是一個合法的賬戶以及其是否失效,注意這里使用了“required”管理組,說明只要是無效賬戶,即使其余的檢測通過也將拒絕登錄。“password required pam_cracklib.so retry=3”行的作用是檢查用戶輸入的密碼是不是常見的單詞,如果是的話將不允許其作為密碼使用,“retry=3”參數(shù)表示擁有三次輸入機會,這里使用“required”管理組,如果出錯將無法登錄。
“password sufficient pam_unix.so use_authtok md5 shadow”行的作用是如果用戶已經(jīng)擁有了身份驗證令牌,就不需提示用戶輸入密碼。因為用戶已經(jīng)輸入了密碼,而且經(jīng)過了驗證,就將該密碼經(jīng)過MD5加密后存放到“/etc/shadow”文件 中。“password required pam_deny.so”行的作用是以上驗證失敗,將拒絕用戶登錄?!皊ession required pam_limits.so”行的作用是根據(jù)“/etc/security/limits.conf”文件的內(nèi)容限制用戶的對系統(tǒng)資源使用情況,包括文件打開的數(shù)量,內(nèi)存使用量,允許訪問進程數(shù)量,最大登錄次數(shù)等?!皊ession required pam_unix.so”行的作用是將本次登錄時間信息寫入到“l(fā)astlog”文件中的“最后一次登錄時間”,將原來的最后一次登錄時間信息提交給“/bin/login”程序。
使 用“vim /etc/pam.d/system-auth”命令,將其中的“auth required pam_deny.so”行修改為“auth required pam_permit.so”,將“password required pam_deny.so”行修改為“password required pam_permit.so”就會產(chǎn)生一個奇特的效果,不管用戶輸入什么密碼,都可以順利登錄。當然,在實際中是需要嚴格控制訪問權(quán)限的。例如只允許root用戶可以從本地登錄,只允許“yonghu1”用戶從網(wǎng)址192.168.1.100登 錄,可以執(zhí)行“vim /etc/pam.d/login”命令,在“l(fā)ogin”配置文件中第二行之后添加“auth required pam_access.so accessfile=/etc/login.conf”行,使 用了“pam_access”模 塊,通過配置文件“/etc/login.conf”來進行登錄控制。使 用“vim /etc/login.conf”命令,在該文件中添加“+:root:LOCAL”,“:yonghu1:192.168.1.100”,“-:ALL:ALL”等語句,就實現(xiàn)了上述功能,其中的“+”參數(shù)表示允許訪問,“-”參數(shù)表示拒絕訪問。
如果想更改登錄時系統(tǒng)顯示的內(nèi)容,可以執(zhí)行“vim/etc/issue”命令來設(shè)置需要顯示的內(nèi)容。之后執(zhí)行“vim/etc/pam.d/login”命 令,在其中添加“auth pam_issue.so issue=/etc/issue”行即可。如果不希望有些用戶使用SSH安全連接,可以在“/etc/allowsshd”文 件中添加所需的賬戶,之后在“/etc/pam.d/sshd”配 置文件中添加“auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/allowsshd”一行,就可禁止其使用SSH。
在“/etc/security/time.conf”文件中添加“l(fā)ogin;tty*&;!ttyp*;!root;!Al0000-2400” 和“xxx;*;!yonghu1;Wd 0000-2400|wk1800-0800”兩行語句,表示禁止非Root賬戶在任意時間段從控制臺登錄,同時允許非“yongh1”的賬戶在非工作時間段訪問名為“xxx”的服務(wù)。為了防止DoS類型的攻擊,可以對系統(tǒng)中所有的用戶資源使用情況進行限制,例如編輯“/etc/security/limits.conf”文件,在其中添 加“* hard core 0”,“*hard rss 50000”,“* hard nproc 20”,表示禁止所有用戶調(diào)試文件,限制其最多可以訪問50個進程,限制其內(nèi)容使用量為50MB。在“/etc/pam.d/login”文件中添 加“session required /etc/security/limits.conf”,這樣當用戶登錄之后,就會受到上述限制。為了防止用戶隨意使用“su”命令,切換到root環(huán)境,可以執(zhí)行“vim/etc/pam.d/su”命 令,在其中添加“auth sufficient pam_rootok.so debug”,“auth required pam_wheel.so group=aut”。 這樣,只有“aut”組中的賬戶才可以使用“su”命令,切換到root環(huán)境。