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