在Linux中執行有些程序時,這些程序在執行前首先要對啓動它的用戶進行認證,符合必定的要求以後才容許執行,例如login, su等。在Linux中進行身份或是狀態的驗證程序是由PAM來進行的,PAM(Pluggable Authentication Modules)可動態加載驗證模塊,由於能夠按須要動態的對驗證的內容進行變動,因此能夠大大提升驗證的靈活性。html
1、PAM模塊介紹linux
Linux-PAM(即linux可插入認證模塊)是一套共享庫,使本地系統管理員能夠隨意選擇程序的認證方式。換句話說,不用(從新編寫)從新編譯一個包含PAM功能的應用程序,就能夠改變它使用的認證機制,這種方式下,就算升級本地認證機制,也不用修改程序。
PAM使用配置/etc/pam.d/下的文件,來管理對程序的認證方式.應用程序 調用相應的配置文件,從而調用本地的認證模塊.模塊放置在/lib/security下,以加載動態庫的形式進,像咱們使用su命令時,系統會提示你輸入root用戶的密碼.這就是su命令經過調用PAM模塊實現的。shell
2、PAM的配置文件說明數據庫
PAM配置文件有下面兩種寫法:
1)寫在/etc/pam.conf文件中,但centos6以後的系統中,這個文件就沒有了。
2)將PAM配置文件放到/etc/pam.d/目錄下,其規則內容都是不包含 service 部分的,即不包含服務名稱,而/etc/pam.d 目錄下文件的名字就是服務名稱。如: vsftpd,login等,只是少了最左邊的服務名列。如:/etc/pam.d/sshdvim
[root@centos6-test06 ~]# cat /etc/pam.d/sshd #%PAM-1.0 auth required pam_sepermit.so auth include password-auth account required pam_nologin.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session required pam_namespace.so session optional pam_keyinit.so force revoke session include password-auth
由上面的pam模塊文件內容看,能夠將pam配置文件分爲四列,centos
1)第一列:PAM的模塊類型
Linux-PAM有四種模塊類型,分別表明四種不一樣的任務,它們是:
認證管理(auth),帳號管理(account),會話管理(session)和密碼(password)管理,一個類型可能有多行,它們按順序依次由PAM模塊調用。api
對以上四種模塊類型進一步補充說明:
auth:表示鑑別類接口模塊類型用於檢查用戶和密碼,並分配權限;
這種類型的模塊爲用戶驗證提供兩方面服務。讓應用程序提示用戶輸入密碼或者其餘標記,確認用戶合法性;經過他的憑證許可權限,設定組成員關係或者其餘優先權。安全
account:表示帳戶類接口,主要負責帳戶合法性檢查,確認賬號是否過時,是否有權限登陸系統等;
這種模塊執行的是基於非驗證的賬號管理。他主要用於限制/容許用戶對某個服務的訪問時間,當前有效的系統資源(最多能夠多少用戶),限制用戶位置(例如:root只能經過控制檯登陸)。bash
多數狀況下auth和account會一塊兒用來對用戶登陸和使用服務的狀況進行限制。這樣的限制會更加完整。好比下面是一個具體的例子:login是一個應用程序。Login要完成兩件工做——首先查詢用戶,而後爲用戶提供所需的服務,例如提供一個shell程序。一般Login要求用戶輸入名稱和密碼進行驗證。當用戶名輸入的時候,系統天然會去比對該用戶是不是一個合法用戶,是否在存在於本地或者遠程的用戶數據庫中。若是該帳號確實存在,那麼是否過時。這些個工做是由account接口來負責。服務器
若是用戶知足上述登陸的前提條件,那麼它是否具備可登陸系統的口令,口令是否過時等。這個工做就要由auth接口來負責了,他一般會將用戶口令信息加密並提供給本地(/etc/shadow)或者遠程的(ldap,kerberos等)口令驗證方式進行驗證。
若是用戶可以登陸成功,證實auth和account的工做已經完成。但整個驗證過程並無徹底結束。由於還有一些其餘的問題沒有獲得確認。例如,用戶可以在服務器上同時開啓多少個窗口登陸,用戶能夠在登陸以後使用多少終端多長時間,用戶可以訪問哪些資源和不能訪問哪些資源等等。也就是說登陸以後的後續驗證和環境定義等還須要其餘的接口。這就是咱們下面要提到的兩組接口:
session:會話類接口。實現從用戶登陸成功到退出的會話控制;
處理爲用戶提供服務以前/後須要作的些事情。包括:開啓/關閉交換數據的信息,監視目錄等,設置用戶會話環境等。也就是說這是在系統正式進行服務提供以前的最後一道關口。
password:口令類接口。控制用戶更改密碼的全過程。也就是有些資料所說的升級用戶驗證標記。
注意:上述接口在使用的時候,每行只能指定一種接口類型,若是程序須要多種接口的話,可在多行中分別予以規定。
2)第二列:PAM的控制標記
PAM使用控制標記來處理和判斷各個模塊的返回值.(在此只說明簡單的認證標記)。
規定如何處理PAM模塊鑑別認證的結果,簡而言之就是鑑別認證成功或者失敗以後會發生什麼事,如何進行控制。單個應用程序能夠調用多種底層模塊,一般稱爲「堆疊」。對應於某程序按照配置文件中出現順序執行的全部模塊成爲「堆」,堆中的各模塊的地位與出錯時的處理方式由control_flag欄的取值決定,他的四種可能的取值分別爲required、Requisite、sufficient或_optional:
required:表示該行以及所涉及模塊的成功是用戶經過鑑別的必要條件。換句話說,只有當對應於應用程序的全部帶 required標記的模塊所有成功後,該程序才能經過鑑別。同時,若是任何帶required標記的模塊出現了錯誤,PAM並不馬上將錯誤消息返回給應用程序,而是在全部模塊都調用完畢後纔將錯誤消息返回調用他的程序。 反正說白了,就是必須將全部的模塊都執行一次,其中任何一個模塊驗證出錯,驗證都會繼續進行,並在執行完成以後才返回錯誤信息。這樣作的目的就是不讓用戶知道本身被哪一個模塊拒絕,經過一種隱蔽的方式來保護系統服務。就像設置防火牆規則的時候將拒絕類的規則都設置爲drop同樣,以至於用戶在訪問網絡不成功的時候沒法準確判斷究竟是被拒絕仍是目標網絡不可達。
requisite:與required相仿,只有帶此標記的模塊返回成功後,用戶才能經過鑑別。不一樣之處在於其一旦失敗就再也不執行堆中後面的其餘模塊,而且鑑別過程到此結束,同時也會當即返回錯誤信息。與上面的required相比,彷佛要顯得更光明正大一些。
sufficient:表示該行以及所涉及模塊驗證成功是用戶經過鑑別的充分條件。也就是說只要標記爲sufficient的模塊一旦驗證成功,那麼PAM便當即嚮應用程序返回成功結果而沒必要嘗試任何其餘模塊。即使後面的層疊模塊使用了requisite或者required控制標誌也是同樣。當標記爲sufficient的模塊失敗時,sufficient模塊會當作 optional對待。所以擁有sufficient 標誌位的配置項在執行驗證出錯的時候並不會致使整個驗證失敗,但執行驗證成功之時則大門敞開。因此該控制位的使用務必慎重。
optional:他表示即使該行所涉及的模塊驗證失敗用戶仍能經過認證。在PAM體系中,帶有該標記的模塊失敗後將繼續處理下一模塊。也就是說即便本行指定的模塊驗證失敗,也容許用戶享受應用程序提供的服務。使用該標誌,PAM框架會忽略這個模塊產生的驗證錯誤,繼續順序執行下一個層疊模塊。
include:表示在驗證過程當中調用其餘的PAM配置文件。在RHEL系統中有至關多的應用經過完整調用/etc/pam.d/system-auth來實現認證而不須要從新逐一去寫配置項。這也就意味着在不少時候只要用戶可以登陸系統,針對絕大多數的應用程序也能同時經過認證。
另外還有一種比較複雜的格式爲value = action的語法來設置控制標誌,標誌之間會以空格分開。格式以下:
value1 = action1 value2 = action2 ……
其中value能夠是下列Linux PAM庫的返回值:
success、open_err、symbol_err、service_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和default。
最後一個(default)可以用來設置上面的返回值沒法表達的行爲。
actionN能夠是一個非負整數或者是下面的記號之一:ignore、ok、done、bad、die和reset。若是是非負整數J,就表示須要忽略後面J個一樣類型的模塊。經過這種方式,系統管理者能夠更加靈活地設置層疊模塊,模塊的層疊路徑由單個模塊的反應決定。
關於這幾個記號的詳細解釋:
ignore:若是使用層疊模塊,那麼這個模塊的返回值將被忽略,不會被應用程序知道。
bad:他表示這個返回碼應該被看做是模塊驗證失敗的標誌。若是這個模塊是層疊模塊的第一個驗證失敗的模塊,那麼他的狀態值就是整個層疊模塊驗證的狀態值和結果。
die:終止層疊模塊驗證過程,馬上返回到應用程序。
ok:告訴PAM這個模塊的返回值將直接做爲全部層疊模塊的返回值。也就是說,若是這個模塊前面的模塊返回狀態是PAM_SUCCESS,那這個返回值就會覆蓋前面的返回狀態。注意:若是前面的模塊的返回狀態表示模塊驗證失敗,那麼不能使用這個返回值再加以覆蓋。
done:終止後續層疊模塊的驗證,把控制權馬上交回應用程序。
reset:清除全部層疊模塊的返回狀態,從下一個層疊模塊從新開始驗證。
3)模塊路徑
模塊路徑.即要調用模塊的位置. 若是是64位系統,通常保存在/lib64/security,如: pam_unix.so,同一個模塊,能夠出如今不一樣的類型中.它在不一樣的類型中所執行的操做都不相同.這是因爲每一個模塊,針對不一樣的模塊類型,編制了不一樣的執行函數。
4)模塊參數
模塊參數,即傳遞給模塊的參數.參數能夠有多個,之間用空格分隔開,如:password required pam_unix.so nullok obscure min=4 max=8 md5。
3、PAM模塊的工做原理和流程
以RHEL系統爲例,當pam安裝以後有兩大部分:在/lib/security目錄下的各類pam模塊以及/etc/pam.d和/etc/pam.d目錄下的針對各類服務和應用已經定義好的pam配置文件。當某一個有認證需求的應用程序須要驗證的時候,通常在應用程序中就會定義負責對其認證的PAM配置文件。以vsftpd爲例,在它的配置文件/etc/vsftpd/vsftpd.conf中就有這樣一行定義:
pam_service_name=vsftpd
表示登陸FTP服務器的時候進行認證是根據/etc/pam.d/vsftpd文件定義的內容進行。
那麼,當程序須要認證的時候已經找到相關的pam配置文件,認證過程是如何進行的?下面咱們將經過解讀/etc/pam.d/system-auth文件予以說明。
首先要聲明一點的是:system-auth是一個很是重要的pam配置文件,主要負責用戶登陸系統的認證工做。並且該文件不只僅只是負責用戶登陸系統認證,其它的程序和服務經過include接口也能夠調用到它,從而節省了不少從新自定義配置的工做。因此應該說該文件是系統安全的總開關和核心的pam配置文件。
下面是/etc/pam.d/system-auth文件的所有內容:
[root@centos6-test06 ~]# grep -v ^# /etc/pam.d/system-auth auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 500 quiet account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
第一部分表示,當用戶登陸的時候,首先會經過auth類接口對用戶身份進行識別和密碼認證。因此在該過程當中驗證會通過幾個帶auth的配置項。
其中的第一步是經過pam_env.so模塊來定義用戶登陸以後的環境變量, pam_env.so容許設置和更改用戶登陸時候的環境變量,默認狀況下,若沒有特別指定配置文件,將依據/etc/security/pam_env.conf進行用戶登陸以後環境變量的設置。
而後經過pam_unix.so模塊來提示用戶輸入密碼,並將用戶密碼與/etc/shadow中記錄的密碼信息進行對比,若是密碼比對結果正確則容許用戶登陸,並且該配置項的使用的是「sufficient」控制位,即表示只要該配置項的驗證經過,用戶便可徹底經過認證而不用再去走下面的認證項。不過在特殊狀況下,用戶容許使用空密碼登陸系統,例如當將某個用戶在/etc/shadow中的密碼字段刪除以後,該用戶能夠只輸入用戶名直接登陸系統。
下面的配置項中,經過pam_succeed_if.so對用戶的登陸條件作一些限制,表示容許uid大於500的用戶在經過密碼驗證的狀況下登陸,在Linux系統中,通常系統用戶的uid都在500以內,因此該項即表示容許使用useradd命令以及默認選項創建的普通用戶直接由本地控制檯登陸系統。
最後經過pam_deny.so模塊對全部不知足上述任意條件的登陸請求直接拒絕,pam_deny.so是一個特殊的模塊,該模塊返回值永遠爲否,相似於大多數安全機制的配置準則,在全部認證規則走完以後,對不匹配任何規則的請求直接拒絕。
第二部分的三個配置項主要表示經過account帳戶類接口來識別帳戶的合法性以及登陸權限。
第一行仍然使用pam_unix.so模塊來聲明用戶須要經過密碼認證。第二行認可了系統中uid小於500的系統用戶的合法性。以後對全部類型的用戶登陸請求都開放控制檯。
第三部分會經過password口另類接口來確認用戶使用的密碼或者口令的合法性。第一行配置項表示須要的狀況下將調用pam_cracklib來驗證用戶密碼複雜度。若是用戶輸入密碼不知足複雜度要求或者密碼錯,最多將在三次這種錯誤以後直接返回密碼錯誤的提示,不然期間任何一次正確的密碼驗證都容許登陸。須要指出的是,pam_cracklib.so是一個經常使用的控制密碼複雜度的pam模塊,關於其用法舉例咱們會在以後詳細介紹。以後帶pam_unix.so和pam_deny.so的兩行配置項的意思與以前相似。都表示須要經過密碼認證並對不符合上述任何配置項要求的登陸請求直接予以拒絕。不過用戶若是執行的操做是單純的登陸,則這部分配置是不起做用的。
第四部分主要將經過session會話類接口爲用戶初始化會話鏈接。其中幾個比較重要的地方包括,使用pam_keyinit.so表示當用戶登陸的時候爲其創建相應的密鑰環,並在用戶登出的時候予以撤銷。不過該行配置的控制位使用的是optional,表示這並不是必要條件。以後經過pam_limits.so限制用戶登陸時的會話鏈接資源,相關pam_limit.so配置文件是/etc/security/limits.conf,默認狀況下對每一個登陸用戶都沒有限制。關於該模塊的配置方法在後面也會詳細介紹。
可見,不一樣應用程序經過配置文件在認證過程當中調用不一樣的pam模塊來定製具體的認證流程。其中咱們不難看出,其實能夠根據實際的須要對pam的配置文件進行修改以知足不一樣的認證需求,例以下面的例子:
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_tally.so onerr=fail deny=5 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth required pam_deny.so account required pam_unix.so account sufficient pam_succeed_if.so uid < 500 quiet account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 minlen=10 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=6 password requisite pam_passwdqc.so use_first_pass enforce=everyone password sufficient pam_unix.so md5 remember=6 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
在其中就增長了對用戶密碼修改時複雜度的限制,用戶屢次錯誤輸入密碼以後的鎖定限制以及用戶使用密碼歷史等限制選項。
因此咱們經過對上述system-auth配置文件的修改,模塊的增長和選項的變化,從很大的程度上增長了用戶登陸驗證的安全性要求。咱們會在以後的文章中對該配置進行詳細說明。
另外也必定須要注意,在整個的PAM配置文件當中,配置項以及模塊調用的邏輯順序很是關鍵。由於PAM是按照配置項的前後順序來進行驗證。錯誤的模塊調用順序極可能致使嚴重的安全問題甚至系統錯誤。因此對PAM配置進行修改的時候務必要考慮這一點。
4、經常使用的PAM模塊介紹
PAM模塊 | 結合管理類型 | 說明 | ||
pam_unix.so | auth |
提示用戶輸入密碼,並與/etc/shadow文件相比對.匹配返回0 |
||
account | 檢查用戶的帳號信息(包括是否過時等).賬號可用時,返回0. | |||
password | 修改用戶的密碼. 將用戶輸入的密碼,做爲用戶的新密碼更新shadow文件 | |||
pam_shells.so | auth account |
若是用戶想登陸系統,那麼它的shell必須是在/etc/shells文件中之一的shell | ||
pam_deny.so | account auth password session |
該模塊可用於拒絕訪問 | ||
pam_permit.so | auth account password session |
模塊任什麼時候候都返回成功. | ||
pam_securetty.so | auth | 若是用戶要以root登陸時,則登陸的tty必須在/etc/securetty之中. | ||
pam_listfile.so | auth account password session |
訪問應用程的控制開關 | ||
pam_cracklib.so | password | 這個模塊能夠插入到一個程序的密碼棧中,用於檢查密碼的強度. |
||
pam_limits.so | session | 定義使用系統資源的上限,root用戶也會受此限制,能夠經過/etc/security/limits.conf或/etc/security/limits.d/*.conf來設定 |
5、PAM模式使用說明
1)pam_access.so模塊
pam_access.so模塊主要的功能和做用是根據主機名(包括普通主機名或者FQDN)、IP地址和用戶實現全面的訪問控制。pam_access.so模塊的具體工做行爲根據配置文件/etc/security/access.conf來決定。該配置文件的主體包含了三個字段——權限、用戶和訪問發起方。格式上是一個用""隔開的表。
第一個字段:權限(permission),使用"+"表示授予權限,用"-"表示禁止權限。
第二個字段:用戶(user),定義了用戶、組以及用"@"表示的在不一樣主機上的同名用戶和同一主機上不一樣名用戶。
第三個字段:訪問發起方(origins),定義了發起訪問的主機名稱、域名稱、終端名稱。
並且/etc/security/access.conf文件提供了不少範例供修改時參考,而且都給出了具體的說明,例如:
#禁止非root用戶經過tty1訪問相關服務 #-:ALL EXCEPT root:tty1 #禁止除了wheel、shutdown以及sync以外的全部用戶訪問相關服務 #-:ALL EXCEPT wheel shutdown sync:LOCAL #禁止wheel用戶經過.win.tue.nl以外的其它它終端訪問相關服務 #-:wheel:ALL EXCEPT LOCAL .win.tue.nl # 禁止下面的用戶從任何主機登陸。其它用戶能夠從任意地方訪問相關服務 #-:wsbscaro wsbsecr wsbspac wsbsym wscosor wstaiwde:ALL # root用戶容許經過cron來使用tty1到tty6終端訪問相關服務 #+ : root : cron crond :0 tty1 tty2 tty3 tty4 tty5 tty6 # 用戶root容許從下面的地址訪問相關服務 #+ : root : 192.168.200.1 192.168.200.4 192.168.200.9 #+ : root : 127.0.0.1 # 用戶root能夠從192.168.201.網段訪問相關服務 #+ : root : 192.168.201. # 用戶root能夠從.foo.bar.org中任何主機訪問相關服務 #+ : root : .foo.bar.org # 用戶root不容許從任何主機訪問相關服務 #- : root : ALL # 用戶@nis_group和foo能夠從任何主機訪問相關服務 #+ : @nis_group foo : ALL # 用戶john只能從127.0.0.0/24來對本機相關服務進行訪問 #+ : john : 127.0.0.0/24 # 用戶john能夠經過ipv4和ipv6的地址對本機相關服務進行訪問 #+ : john : ::ffff:127.0.0.0/127 # 用戶john能夠經過ipv6的地址訪問本機相關服務 #+ : john : 2001:4ca0:0:101::1 # 用戶john能夠經過ipv6的主機IP地址來訪問本機 #+ : john : 2001:4ca0:0:101:0:0:0:1 # 用戶john能夠經過ipv6的IP地址和掩碼來訪問相關服務 #+ : john : 2001:4ca0:0:101::/64 # 開放全部用戶對本機全部相關服務的訪問 #- : ALL : ALL
示例說明(vsftp):
若是要在網絡內架設一個FTP服務器,並且在該FTP服務器上須要強制地指定某個用戶只能經過某個IP地址登陸,這個時候pam_access.so模塊就派上用場了。假設個人FTP服務器是使用vsftp來構建的,具體操做是:
1)修改FTP服務器的/etc/pam.d/vsftpd文件,在調用account接口處插入"account required pam_access.so"這行內容,以下: [root@centos6-test06 ~]# vim /etc/pam.d/vsftpd #%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth account required pam_access.so //添加這一行內容 session required pam_loginuid.so session include password-auth 上述配置表示當針對FTP訪問執行用戶類接口的時候會增長pam_access.so的認證。 2)修改/etc/security/access.conf配置文件, 在文件底部添加下面的兩行: [root@centos6-test06 ~]# vim /etc/security/access.conf - : kevin : ALL EXCEPT 192.168.10.101 - : grace : ALL EXCEPT 192.168.10.102 前提是已經在系統上事先創建了kevin和grace兩個用戶。上面的配置表示: kevin用戶不能從192.168.10.101以外的任何客戶端訪問FTP服務器; grace用戶不能從192.168.10.102以外的任何客戶端訪問FTP服務器。 3)修改/etc/vsftpd/vsftpd.conf文件,禁用匿名登陸: [root@centos6-test06 ~]# vim /etc/vsftpd/vsftpd.conf ...... Anonymous_enable = NO 這樣當重啓vsftpd服務以後,用戶kevin將只能從192.168.10.101訪問ftp服務,而grace將只能從192.168.10.102訪問ftp服務。 因此當針對這種需求並且不想使用防火牆以及應用程序自帶的認證機制的時候,經過pam_access.so能夠實現所需的效果。
2)pam_listfile.so
pam_listfile.so模塊的功能和pam_access.so模塊相似,目標也是實現基於用戶/組,主機名/IP,終端的訪問控制。不過它實現的方式和pam_access.so會稍微有些不一樣,由於它沒有專門的默認配置文件。訪問控制是靠pam配置文件中的控制選項和一個自定義的配置文件來實現的。並且除了針對上述訪問源的控制以外,還可以控制到ruser,rhost,所屬用戶組和登陸shell。因此有些用戶認爲它的功能彷佛比pam_access.so更加靈活和強大一些。
對於pam_listfile.so的配置方法,能夠參考vsftpd文件中對pam的調用方式。熟悉vsftpd的人都知道,在vsftpd默認配置中,root用戶是不容許經過ftp方式直接訪問FTP服務器的。這個功能其實是由/etc/vsftpd/vsftpd.conf,/etc/vsftpd/ftpusers和/etc/pam.d/vsftpd共同控制的。 由於在/etc/pam.d/vsftpd中有這樣的一行配置:
[root@centos6-test06 ~]# cat /etc/pam.d/vsftpd ...... auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
表示當用戶試圖登陸FTP服務器的時候,會調用pam_listfile.so模塊來驗證用戶是否能夠登陸,這裏item=user表示訪問控制是基於user即用戶實現的。那麼哪些用戶能夠登陸呢?就是除了file選項所定義的/etc/vsftpd/ftpusers文件以外的用戶,這是由另一個選項sense=deny所決定的。而在/etc/vsftpd/vsftpd.conf中明確指定了對用戶的認證須要經過/etc/pam.d/vsftpd中的配置調用pam模塊:
[root@centos6-test06 ~]# cat /etc/vsftpd/vsftpd.conf |grep pam_service_name pam_service_name=vsftpd
而剛好root用戶又在/etc/vsftpd/ftpusers文件中,因此這成爲了制約root登陸FTP服務器的一個必要條件(但不是惟一條件)。因此針對這種狀況,要開放和容許root用戶登陸FTP的權限,至少有三種改法:
1)修改/etc/pam.d/vsftpd文件,將sense=deny改爲sense=allow。這樣會正好將狀況反轉過來,FTP服務器只容許/etc/vsftpd/ftpusers文件內的用戶登陸; 2)修改/etc/pam.d/vsftpd文件,註釋掉調用pam_listfile.so那行。這樣FTP服務器在認證用戶的時候將再也不考慮pam_listfile.so模塊的任何限制; 3)將root從/etc/vsftpd/ftpuser文件中註釋掉;
不過須要注意的是,root用戶比較特殊,由於它在vsftpd配置中的限制不只僅來自於pam,vsftpd自己的配置中也對其作了限制。當咱們看/etc/vsftpd/user_list文件的時候,還將會看到這樣的配置說明:
[root@centos6-test06 vsftpd]# cat /etc/vsftpd/user_list # vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. ........ ........
表示當vsftpd.conf中userlist_deny=NO的時候,系統將只容許user_list中的用戶登陸FTP服務器;若是userlist_deny=YES,狀況將截然相反——此時user_list變成了黑名單,裏面的用戶將一律不容許登陸FTP服務器。因此要完全開放root登陸FTP的權限,咱們還要在/etc/vsftpd/vsftpd.conf中增長userlist_deny=YES或者註釋掉user_list中的root。
不過無論怎麼說,vsftpd中禁用root用戶的直接登陸是在絕大多數FTP服務器上默認的安全措施,因此開放root權限時應該慎重。
另外除了經過pam_listfile.so實現基於用戶的訪問控制以外,還能夠實現基於其它條件的訪問控制。這個能夠具體看看pam_listfile.so模塊的選項就會比較清楚了,使用pam_listfile.so模塊配置的格式分爲五個部分:分別是item、onerr、sense、file以及apply。 其中:
a)item=[tty|user|rhost|ruser|group|shell]:定義了對哪些列出的目標或者條件採用規則,顯然,這裏能夠指定多種不一樣的條件。
b)onerr=succeed|fail:定義了當出現錯誤(好比沒法打開配置文件)時的缺省返回值。
c)sense=allow|deny:定義了當在配置文件中找到符合條件的項目時的控制方式。若是沒有找到符合條件的項目,則通常驗證都會經過。
d)file=filename:用於指定配置文件的全路徑名稱。
e)apply=user|@group:定義規則適用的用戶類型(用戶或者組)。
而至於file文件的寫法就簡單了,每行一個用戶或者組名稱便可。因此,當須要對其它服務進行相似的訪問控制的時候,就能夠照葫蘆畫瓢。例如如今須要在SSH服務器上對ssh客戶端實現基於用戶的訪問控制
示例說明一:
不容許bobo帳號經過ssh方式登陸。作法以下:
1)針對這種需求只須要更改/etc/pam.d/sshd文件,並在該文件中添加一行(必定要添加到第一行): [root@centos6-test06 ~]# vim /etc/pam.d/sshd auth required pam_listfile.so item=user sense=deny file=/etc/pam.d/denyusers onerr=succeed ...... 2)建立bobo帳號 [root@centos6-test06 ~]# useradd bobo [root@centos6-test06 ~]# passwd bobo Changing password for user bobo. New password: Retype new password: passwd: all authentication tokens updated successfully. 3)創建文件/etc/pam.d/denyusers,並在文件中寫入用戶信息。 [root@centos6-test06 ~]# echo "bobo" > /etc/pam.d/denyusers [root@centos6-test06 ~]# cat /etc/pam.d/denyusers bobo 4)測試使用bobo帳號經過ssh方式登陸不上了 [root@centos6-test06 ~]# ssh -p22 bobo@localhost bobo@localhost's password: Permission denied, please try again. bobo@localhost's password: 表示用戶以ssh登陸必需要經過pam_listfile.so模塊進行認證,認證的對象類型是用戶,採用的動做是禁止,禁止的目標是/etc/pam.d/denyuser文件中所定義的用戶。 這樣在該條目添加到該文件以後,使用bobo帳號從其它主機遠程ssh訪問服務器會出現密碼錯誤的提示,可是使用root或者其它用戶則訪問可以成功! 再次強調,要注意pam模塊使用的順序,剛纔的規則必定要添加到/etc/pam.d/sshd文件的auth的第一行以前,不然不會生效!!!!!
示例說明二:
僅僅容許kevin用戶能夠經過ssh遠程登陸。作法以下:
在/etc/pam.d/sshd文件中添加一條(務必添加到文件的第一行!):
auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed
添加兩個用戶kevin和grace
[root@centos6-test06 ~]# useradd kevin [root@centos6-test06 ~]# passwd kevin [root@centos6-test06 ~]# useradd grace [root@centos6-test06 ~]# passwd grace
編輯file指定的文件,添加上一個用戶kevin(這一步是關鍵)
[root@centos6-test06 ~]# echo "kevin" >/etc/sshdusers //文件/etc/sshdusers是在上面添加到/etc/pam.d/sshd中定義的
而後驗證,發現使用kevin帳號能正常ssh登陸,使用grace帳號就不能正常ssh登陸了!
[root@centos6-test06 ~]# ssh -p22 kevin@localhost kevin@localhost's password: Last login: Thu Mar 29 12:02:18 2018 from 192.168.10.206 [root@centos6-test06 ~]# ssh -p22 grace@localhost grace@localhost's password: Permission denied, please try again. [root@centos6-test06 ~]# ssh -p22 root@localhost root@localhost's password: Permission denied, please try again.
注:此處若是root也使用ssh遠程鏈接,也會受到pam_listfile.so限制的。
舒適提示:
若是發生錯誤,Linux-PAM 可能會改變系統的安全性。這取決於你本身的選擇,你能夠選擇不安全(開放系統)和絕對安全(拒絕任何訪問)。一般,Linux-PAM 在發生錯誤時,傾向於後者。任何的配置錯誤均可能致使系統整個或者部分沒法訪問。配置 Linux-PAM 時,可能遇到最大的問題可能就是 Linux-PAM 的配置文件/etc/pam.d/*被刪除了。若是發生這種事情,你的系統就會被鎖住。有辦法能夠進行恢復,最好的方法就是用一個備份的鏡像來恢復系統,或者登陸進單用戶模式而後進行正確的配置。
3)pam_limits.so模塊
pam_limits.so模塊的主要功能是限制用戶會話過程當中對各類系統資源的使用狀況。缺省狀況下該模塊的配置文件是/etc/security/limits.conf。而該配置文件的基本格式其實是由4個字段組成的表,其中具體限制的內容包括:
Domain type item value 用戶名/組名 軟/硬限制 具體值 core——core文件大小 (KB) data——最大數據大小(KB) fsize——最大文件大小(KB) memlock——最大可用內存空間(KB) nofile——最大能夠打開的文件數量 rss——最大可駐留空間(KB) stack——最大堆棧空間(KB) cpu——最大CPU使用時間(MIN) nproc——最大運行進程數 as——地址空間限制 maxlogins——用戶能夠登陸到系統最屢次數 locks——最大鎖定文件數目
須要注意的是,若是沒有任何限制可使用"-"號,而且針對用戶限制的優先級通常要比針對組限制的優先級更高。使用pam_limits.so模塊的最多見的場景是在運行Oracle數據庫的RHEL服務器中,由於通常Oracle數據庫在安裝以前,按照其官方文檔的說明須要先對某些用戶(Oracle)使用系統資源的狀況進行限制。因此咱們老是可以在Oracle數據庫服務器的/etc/security/limits.conf文件中看到相似這樣的配置:
[root@centos6-test06 ~]# vim /etc/security/limits.conf ....... oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536
結合上面的配置文件說明,可知Oracle數據庫須要對Oracle用戶使用資源的狀況進行一些限制,包括: oracle用戶最大能開啓的進程數不超過16384,最大能打開的文件數不超過65536。
至於soft和hard的區別,不一樣於磁盤配額中的軟限制和硬限制。普通用戶能夠調整本身的soft limit但最高不能超過hard limit,並且除了root之外的普通用戶也不可以隨意更改hard limit。該調整完成以後通常可使用ulimit命令查看。
順便提一下,針對nofile,這個只是基於用戶層面的限制和調整方法。基於系統層面的限制和調整方法是修改/etc/sysctl.conf文件,直接改fs.file-max參數,調整以後sysctl –p生效。
示例說明:
pam_limits.so模塊也可使用在對通常應用程序使用的資源限制方面。若是須要在SSH服務器上對來自不一樣用戶的ssh訪問進行限制,就能夠調用該模塊來實現相關功能。例如,當須要限制用戶bobo登陸到SSH服務器時的最大鏈接數(防止同一個用戶開啓過多的登陸進程)。限制操做以下:
因爲/etc/pam.d/system-auth中,默認就會經過pam_limits.so 限制用戶最多使用多少系統資源 [root@centos6-test06 ~]# cat /etc/pam.d/system-auth|grep limits.so session required pam_limits.so 所以只須要在/etc/security/limits.conf文件中增長一行對bobo用戶產生的鏈接數進行限定: [root@centos6-test06 ~]# vim /etc/security/limits.conf ...... bobo hard maxlogins 2 最後測試 從客戶端以bobo身份登陸SSH服務器時,在客戶端上能夠打開兩個控制檯登陸。 但當客戶端開啓第三個登陸窗口的時候會被服務器拒絕,但其它用戶不會受到限制。 注意:這樣限制的只是從客戶端以ssh方式登陸次數的場景,若是從xshell登陸,則不受限制!
4)pam_rootok.so模塊
通常狀況下,pam_rootok.so模塊的主要做用是使uid爲0的用戶,即root用戶可以直接經過認證而不用輸入密碼。pam_rootok.so模塊的一個典型應用是插入到一些應用程序的認證配置文件中,當root用戶執行這些命令的時候能夠不用輸入口令而直接經過認證。好比說"su"命令,爲何當以root用戶執行"su"切換到普通用戶身份的時候是不須要輸入任何口令而能夠直接切換過去?當咱們查看一下/etc/pam.d/su文件的內容就不會奇怪了。由於該文件的第一行就是:
[root@centos6-test06 ~]# cat /etc/pam.d/su ...... auth sufficient pam_rootok.so
而若是將該行配置註釋掉的狀況下,就會發現即使以root用戶切換普通用戶的時候仍然要求輸入口令。
另一種方法,只須要將上述的"sufficient"改爲"required"便可。由於這樣,pam_rootok.so模塊的驗證經過就成爲了必要條件之一。
pam_rootok.so模塊的另一個應用是在chfn命令中。Chfn命令用於改變/etc/passwd中的用戶的說明字段。當以root身份執行chfn命令修改用戶信息的時候是不用輸入密碼的。可是以普通用戶身份執行chfn則須要輸入密碼以後才能改變本身的用戶說明。這實際上也是由於在/etc/pam.d/chfn配置文件中的第一行調用了pam_rootok.so的結果。
不過這裏即使將該配置中的第一行註釋掉,root用戶經過chfn修改本身信息的時候仍然不須要使用密碼。因此恐怕效果不是很明顯。究其緣由主要是不少PAM模塊對root用戶是不會產生限制的。
示例說明(禁用用戶間使用su切換命令):
su的缺點
1)不安全su工具在多人蔘與的系統管理中,並非最好的選擇,su只適用於一兩我的參與管理的系統,畢竟su並不能讓普通用戶受限的使用;超級用戶root密碼應該掌握在少數用戶手中。
2)麻煩:須要把root密碼告知每一個須要root權限的人。
能夠在/etc/pam.d/su文件裏設置禁止用戶使用su命令
[root@centos6-test06 ~]# vim /etc/pam.d/su
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
...........
a)以上標紅的兩行是默認狀態(即開啓第一行,註釋第二行),這種狀態下是容許全部用戶間使用su命令進行切換的!(或者兩行都註釋也是運行全部用戶都能使用su命令,但root下使用su切換到其餘普通用戶須要輸入密碼;若是第一行不註釋,則root使用su切換普通用戶就不須要輸入密碼)
b)若是開啓第二行,表示只有root用戶和wheel組內的用戶纔可使用su命令。
c)若是註釋第一行,開啓第二行,表示只有wheel組內的用戶才能使用su命令,root用戶也被禁用su命令。
5) pam_userdb.so模塊
pam_userdb.so模塊的主要做用是經過一個輕量級的Berkeley數據庫來保存用戶和口令信息。這樣用戶認證將經過該數據庫進行,而不是傳統的/etc/passwd和/etc/shadow或者其它的一些基於LDAP或者NIS等類型的網絡認證。因此存在於Berkeley數據庫中的用戶也稱爲虛擬用戶。
pam_userdb.so模塊的一個典型用途就是結合vsftpd配置基於虛擬用戶訪問的FTP服務器。
相對於本地用戶以及匿名用戶來講,虛擬用戶只是相對於FTP服務器而言纔有用的用戶,這些用戶被嚴格地限定在pam_userdb數據庫當中。因此虛擬用戶只能訪問FTP服務器所提供的資源,於是能夠大大提升系統安全性。另外相對於匿名用戶而言,虛擬用戶必須經過用戶名和密碼纔可以訪問FTP的資源。這樣也提升了對FTP用戶下載的可管理性。
基於虛擬用戶實現的vsftpd的原理基本上是這樣一個過程:先定義一些專門針對FTP的虛擬用戶,而後將用戶信息加入到系統自帶的數據庫中(但不是passwd)從而生成一個訪問FTP的虛擬用戶列表,這裏使用的數據庫是db4也就是Berkeley DB。而後能夠經過使用pam_userdb.so模塊來調用該數據庫存儲用戶信息以及實現FTP用戶認證。固然同時也能夠在系統中經過對配置文件的定義和劃分來實現對不一樣虛擬用戶不一樣類型的訪問控制。
FTP虛擬帳號登陸環境部署:http://www.cnblogs.com/kevingrace/p/5587140.html
6)pam_cracklib.so模塊
pam_cracklib.so是一個經常使用而且很是重要的PAM模塊。該模塊主要的做用是對用戶密碼的強健性進行檢測。即檢查和限制用戶自定義密碼的長度、複雜度和歷史等。如不知足上述強度的密碼將拒絕用戶使用。pam_cracklib.so比較重要和難於理解的是它的一些參數和計數方法,其經常使用參數包括:
debug: 將調試信息寫入日誌; type=xxx: 當添加/修改密碼時,系統給出的缺省提示符是"New UNIX password:"以及"Retype UNIX password:",而使用該參數能夠自定義輸入密碼的提示符,好比指定type=your own word; retry=N: 定義登陸/修改密碼失敗時,能夠重試的次數; Difok=N: 定義新密碼中必須至少有幾個字符要與舊密碼不一樣。可是若是新密碼中有1/2以上的字符與舊密碼不一樣時,該新密碼將被接受; minlen=N: 定義用戶密碼的最小長度; dcredit=N:定義用戶密碼中必須至少包含多少個數字; ucredit=N:定義用戶密碼中必須至少包含多少個大寫字母; lcredit=N:定義用戶密碼中必須至少包含多少個小些字母; ocredit=N:定義用戶密碼中必須至少包含多少個特殊字符(除數字、字母以外); 特別要注意: 當N>0時,N表明新密碼中最多能夠有N個指定的字符!! 當N<0時,N表明新密碼中最少能夠有N個指定的字符!! 同時建議重啓系統使之生效!
/etc/pam.d/login文件裏包含了/etc/pam.d/system-auth文件的配置
[root@centos6-test06 ~]# cat /etc/pam.d/login|grep system-auth auth include system-auth account include system-auth password include system-auth session include system-auth
以下看pam_cracklib.so的一個應用實例:在/etc/pam.d/system-auth中使用pam_cracklib.so來限制用戶修改本身密碼時必須知足必定的強健性要求。
[root@centos6-test06 ~]# cat /etc/pam.d/system-auth #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 500 quiet account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 type= password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so ----------------------------------------------------------------------------- 從上面使用pam_cracklib.so的策略看,要求用戶修改密碼時必需要知足9位,而且密碼中至少要包含一個大寫字母、小寫字母、數字和特殊符號。 可是實際上像minlen和全部credit所對應的數值能夠是非0以外的正負整數,那麼這些數值到底表示什麼意思呢? 不少人將其簡單地理解爲某一類字符的位數,其實遠遠沒有那麼簡單。 下面咱們對這些數值和關係作一個簡短的說明: 首先要明確整個環境中密碼的長度要知足下面的計算公式: 計算公式: 最小密碼長度(minlen)應該小於或者等於 dcredit+ucredit+lcredit+ocredit+其它分值 (同時知足 * credit的條件)。 注意: *credit=-1表示至少有一個的意思 *credit=N(N表示當知足條件的時候加N分,例如dcredit=2表示一個數字加2分,兩個數字加4分) 因此這裏minlen其實更準確的表述應該是mincredit。 因此在下面的例子中,當pam_cracklib.so的參數按以下方式指定: password requisite pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=2 ucredit=0 lcredit=0 ocredit=0 那麼當用戶執行命令修改密碼的時候: [bobo@centos6-test06 ~]$ passwd Changing password for user bobo. Changing password for bobo (current) UNIX password: New UNIX password: 輸入密碼"1\=poiuyt" 不成功 1個數字再加2分 此時密碼有一個數字,2分,其它的字符每一個1分,總共10分,不知足minlen的位數需求,因此該密碼不能經過。 BAD PASSWORD: is too simple New UNIX password: 輸入密碼"12\=poiuyt" 成功 2個數字再加2分 Retype new UNIX password: 此時密碼有兩個數字,4分,其它的字符每一個1分,總共12分,知足minlen的位數需求,因此密碼能夠經過。 New UNIX password: 輸入密碼"1\=poiuytre" 成功 1個數字再加2分 Retype new UNIX password: 此時密碼有1個數字,2分,其它的字符每一個1分,總共12分,知足minlen的位數需求,因此密碼能夠經過。 所以經過上述的配置基本能夠得出這樣的結論: 當某類credit爲正數N的時候,表示密碼中該類字符一個能夠加N分;當某類credit爲負數N的時候,表示密碼中某類字符必須具有N個。時間關係我將不會一一演示。 因此當輸入的密碼全部的字符總分大於或者等於minlen,而且知足全部credit的要求,該密碼經過; 即:輸入的密碼長度(每一個輸入值都算數)+*credit(加分)>=minlen 因此pam_cracklib.so模塊在系統安全管理策略和管理中的用途是很是重要和普遍的。
7)pam_pwhistroy.so模塊
pam_pwhistory.so模塊也是一個經常使用模塊,通常輔助pam_cracklib.so,pam_tally.so以及pam_unix.so等模塊來增強用戶使用密碼的安全度。不過pam_pwhistory.so模塊起的是另外一類的做用,即專門爲用戶創建一個密碼歷史檔案,防止用戶在必定時間內使用已經用過的密碼。
示例說明:(特別注意:/etc/pam.d/system-auth下的配置針對的是普通用戶,在root用戶下是無效的)
當須要限定用戶在90天以內不能重複使用之前曾經使用過的10個密碼,那麼具體操做方法是去修改/etc/pam.d/system-auth文件,在password接口處增長:
[root@centos6-test06 ~]# vim /etc/pam.d/system-auth ...... password required pam_cracklib.so retry=3 password required pam_pwhistory.so enforce_for_root remember=10 ---------------------------------------------------------------- 此時用戶使用過的密碼將會記錄到/etc/security/opasswd文件中。可是pam_pwhistory.so並無什麼選項能夠限定密碼在多少天以內沒法被重複使用, 因此上述的90天是沒法配置的。一個簡單的解決方法就是當90天左右的時候,手動清空一次opasswd文件便可。 固然,若是要實現一樣的功能除了pam_pwhistory.so模塊以外還有其它的辦法。比較經常使用的是pam_unix.so模塊。 具體方法是修改/etc/pam.d/system-auth文件,給pam_unix.so模塊里加上remember=10這個選項,修改以後的配置文件爲: [root@centos6-test06 ~]# vim /etc/pam.d/system-auth ....... password required pam_unix.so md5 remember=10 use_authtok 這樣系統將一樣記住10個已經使用的密碼。 不過此時/etc/security/opasswd文件由於記錄了N個使用過的密碼,因此安全性就十分關鍵了,因此要確保該文件只能被root用戶讀取和編輯: [root@centos6-test06 ~]# touch /etc/security/opasswd [root@centos6-test06 ~]# chown root:root /etc/security/opasswd [root@centos6-test06 ~]# chmod 600 /etc/security/opasswd
==========總結幾個PAM模塊比較常見的實操案例===========
1)怎樣才能強迫用戶設置的密碼不能與過去3次內的密碼重複?(特別注意:/etc/pam.d/system-auth下的配置針對的是普通用戶,在root用戶下是無效的)
修改/etc/pam.d/system-auth,增長pam_unix.so的參數,以下: [root@centos6-test06 ~]# vim /etc/pam.d/system-auth ...... password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=3
2)如何要求用戶設置的密碼必須至少包含5個數字和3個特殊符號?
修改/etc/pam.d/system-auth,在password使用pam_cracklib.so設置的最後附加 dcredit=-5 ocredit=-3 [root@centos6-test06 ~]# vim /etc/pam.d/system-auth ...... password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-5 ocredit=-3 ---------------------------------------------------------------------- 同時注意: 密碼中的n個數字和n個特殊字符不能所有放在一塊兒!!
3)如何限制kevin用戶最多同時登錄4個?(同時能夠限制root用戶)
這須要pam_limits.so模塊。因爲/etc/pam.d/system-auth中,默認就會經過pam_limits.so 限制用戶最多使用多少系統資源. [root@centos6-test06 ~]# cat /etc/pam.d/system-auth|grep limits.so session required pam_limits.so 所以只須要在/etc/security/limits.conf 中加入如下內容: [root@centos6-test06 ~]# vim /etc/security/limits.conf ...... kevin hard maxlogins 4
4)某用戶連續登錄失敗2次就鎖定該帳號,禁止登錄?(默認只能嘗試登陸三次,由retry=N決定的)
如今不少地方都有限制用戶登陸的功能,Linux也是如此,當你登陸失敗屢次後就能夠限制用戶登陸,從而起到保護電腦安全的做用,經過PAM模塊便可實現。 Linux有一個pam_tally2.so的PAM模塊,來限定用戶的登陸失敗次數,若是次數達到設置的閾值,則鎖定用戶。 編譯PAM的配置文件 [root@centos6-test06 ~]# vi /etc/pam.d/login //在#%PAM-1.0下面添加一行 #%PAM-1.0 auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10 ...... 參數解釋: onerr=fail 表示定義了當出現錯誤(好比沒法打開配置文件)時的缺省返回值; even_deny_root 表示也限制root用戶; deny 表示設置普通用戶和root用戶連續錯誤登錄的最大次數,超過最大次數,則鎖定該用戶; unlock_time 表示設定普通用戶鎖定後,多少時間後解鎖,單位是秒; root_unlock_time 表示設定root用戶鎖定後,多少時間後解鎖,單位是秒; 此處使用的是 pam_tally2模塊,若是不支持pam_tally2,可使用pam_tally模塊。 另外,不一樣的pam版本,設置可能有所不一樣,具體使用方法,能夠參照相關模塊的使用規則。 特別注意: 必定要將內容添加到#%PAM-1.0的下面,即在第二行添加內容,必定要寫在前面!! 若是寫在後面,雖然用戶被鎖定,可是隻要用戶輸入正確的密碼,仍是能夠登陸的! ------------------------------------------ 也能夠將上面的內容添加到/etc/pam.d/password-auth文件中,由於/etc/pam.d/login文件中包括(include)了password-auth配置 [root@centos6-test06 ~]# vim /etc/pam.d/system-auth //一樣添加到auth區域的第一行 #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10 ======================================================================================== 特別注意: 上面的配置只是限制了用戶從tty終端登陸,而沒有限制遠程ssh登陸,若是想限制遠程登陸,須要在/etc/pam.d/sshd文件裏配置 [root@centos6-test06 ~]# vim /etc/pam.d/sshd //一樣添加到auth區域的第一行 #%PAM-1.0 auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10 這樣的話,使用ssh遠程登陸的時候,連續輸入兩次錯誤密碼,就會被鎖定了! 若是輸入錯誤次數沒有達到deny設置的次數,再輸入正確密碼就能夠登陸。 驗證: [bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost kevin@localhost's password: //第一次輸入密碼錯誤 Permission denied, please try again. kevin@localhost's password: //第二次輸入密碼錯誤,此時已被鎖定 Permission denied, please try again. kevin@localhost's password: //接着第三次再輸入正確密碼,仍是沒法登陸進去,由於已被鎖定300s了! Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 由於被鎖定300s了!在這個時間內,就算再輸入正確密碼也是沒法順利登陸到機器的! [bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost kevin@localhost's password: Permission denied, please try again. 接着能夠解鎖!! 查看用戶登陸失敗的次數。由下面命令可知,已經輸錯3次了 [root@centos6-test06 ~]# pam_tally2 --user kevin Login Failures Latest failure From kevin 3 03/30/18 07:35:49 ::1 解鎖指定用戶 [root@centos6-test06 ~]# pam_tally2 -r -u kevin Login Failures Latest failure From kevin 3 03/30/18 07:35:49 ::1 [root@centos6-test06 ~]# pam_tally2 --user kevin Login Failures Latest failure From kevin 0 接着,就能夠輸入正確密碼登陸機器了 [bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost kevin@localhost's password: Last login: Fri Mar 30 07:40:04 2018 from ::1 [kevin@centos6-test06 ~]$
5)如何限制root只能從kevin.com這臺計算機使用ssh遠程登錄?
因爲ssh服務器的程序文件使用sshd,而sshd恰好支持PAM,驗證以下: [root@centos6-test06 ~]# ldd /usr/sbin/sshd | grep libpam.so libpam.so.0 => /lib64/libpam.so.0 (0x00007f36f254d000) 修改/etc/pam.d/sshd,加入第二行,以下: [root@centos6-test06 ~]# vim /etc/pam.d/sshd auth include system-auth account required pam_access.so accessfile=/etc/deny_sshd account required pam_nologin.so 建立/etc/deny_sshd文件 [root@centos6-test06 ~]# touch /etc/deny_sshd [root@centos6-test06 ~]# vim /etc/deny_sshd -:root:ALL EXCEPT kevin.com