在Linux中執行有些程序時,這些程序在執行前首先要對啓動它的用戶進行認證,符合一定的要求之後才允許執行,例如login, su等。在Linux中進行身份或是狀態的驗證程序是由PAM來進行的,PAM(Pluggable Authentication Modules)可動態加載驗證模塊,因爲可以按需要動態的對驗證的內容進行變更,所以可以大大提高驗證的靈活性。
一、PAM模塊介紹
Linux-PAM(即linux可插入認證模塊)是一套共享庫,使本地系統管理員可以隨意選擇程序的認證方式。換句話說,不用(重新編寫)重新編譯一個包含PAM功能的應用程序,就可以改變它使用的認證機制,這種方式下,就算升級本地認證機制,也不用修改程序。
PAM使用配置/etc/pam.d/下的文件,來管理對程序的認證方式.應用程序 調用相應的配置文件,從而調用本地的認證模塊.模塊放置在/lib/security下,以加載動態庫的形式進,像我們使用su命令時,系統會提示你輸入root用戶的密碼.這就是su命令通過調用PAM模塊實現的。
二、PAM的配置文件說明
PAM配置文件有下面兩種寫法:
1)寫在/etc/pam.conf文件中,但centos6之後的系統中,這個文件就沒有了。
2)將PAM配置文件放到/etc/pam.d/目錄下,其規則內容都是不包含 service 部分的,即不包含服務名稱,而/etc/pam.d 目錄下文件的名字就是服務名稱。如: vsftpd,login等,只是少了最左邊的服務名列。如:/etc/pam.d/sshd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
由上面的pam模塊文件內容看,可以將pam配置文件分爲四列,
- 第一列代表模塊類型
- 第二列代表控制標記
- 第三列代表模塊路徑
- 第四列代表模塊參數
1)第一列:PAM的模塊類型
Linux-PAM有四種模塊類型,分別代表四種不同的任務,它們是:
認證管理(auth),賬號管理(account),會話管理(session)和密碼(password)管理,一個類型可能有多行,它們按順序依次由PAM模塊調用。
對以上四種模塊類型進一步補充說明:
auth:表示鑑別類接口模塊類型用於檢查用戶和密碼,並分配權限;
這種類型的模塊爲用戶驗證提供兩方面服務。讓應用程序提示用戶輸入密碼或者其他標記,確認用戶合法性;通過他的憑證許可權限,設定組成員關係或者其他優先權。
account:表示賬戶類接口,主要負責賬戶合法性檢查,確認帳號是否過期,是否有權限登錄系統等;
這種模塊執行的是基於非驗證的帳號管理。他主要用於限制/允許用戶對某個服務的訪問時間,當前有效的系統資源(最多可以多少用戶),限制用戶位置(例如:root只能通過控制檯登錄)。
多數情況下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的語法來設置控制標誌,標誌之間會以空格分開。格式如下:
1 |
|
其中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。
三、PAM模塊的工作原理和流程
以RHEL系統爲例,當pam安裝之後有兩大部分:在/lib/security目錄下的各種pam模塊以及/etc/pam.d和/etc/pam.d目錄下的針對各種服務和應用已經定義好的pam配置文件。當某一個有認證需求的應用程序需要驗證的時候,一般在應用程序中就會定義負責對其認證的PAM配置文件。以vsftpd爲例,在它的配置文件/etc/vsftpd/vsftpd.conf中就有這樣一行定義:
1 |
|
表示登錄FTP服務器的時候進行認證是根據/etc/pam.d/vsftpd文件定義的內容進行。
那麼,當程序需要認證的時候已經找到相關的pam配置文件,認證過程是如何進行的?下面我們將通過解讀/etc/pam.d/system-auth文件予以說明。
首先要聲明一點的是:system-auth是一個非常重要的pam配置文件,主要負責用戶登錄系統的認證工作。而且該文件不僅僅只是負責用戶登錄系統認證,其它的程序和服務通過include接口也可以調用到它,從而節省了很多重新自定義配置的工作。所以應該說該文件是系統安全的總開關和核心的pam配置文件。
下面是/etc/pam.d/system-auth文件的全部內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
第一部分表示,當用戶登錄的時候,首先會通過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的配置文件進行修改以滿足不同的認證需求,例如下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
在其中就增加了對用戶密碼修改時複雜度的限制,用戶多次錯誤輸入密碼之後的鎖定限制以及用戶使用密碼歷史等限制選項。
所以我們通過對上述system-auth配置文件的修改,模塊的增加和選項的變化,從很大的程度上增加了用戶登錄驗證的安全性要求。我們會在之後的文章中對該配置進行詳細說明。
另外也一定需要注意,在整個的PAM配置文件當中,配置項以及模塊調用的邏輯順序非常關鍵。因爲PAM是按照配置項的先後順序來進行驗證。錯誤的模塊調用順序很可能導致嚴重的安全問題甚至系統錯誤。所以對PAM配置進行修改的時候務必要考慮這一點。
四、常用的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來設定 |
五、PAM模式使用說明
1)pam_access.so模塊
pam_access.so模塊主要的功能和作用是根據主機名(包括普通主機名或者FQDN)、IP地址和用戶實現全面的訪問控制。pam_access.so模塊的具體工作行爲根據配置文件/etc/security/access.conf來決定。該配置文件的主體包含了三個字段——權限、用戶和訪問發起方。格式上是一個用""隔開的表。
第一個字段:權限(permission),使用"+"表示授予權限,用"-"表示禁止權限。
第二個字段:用戶(user),定義了用戶、組以及用"@"表示的在不同主機上的同名用戶和同一主機上不同名用戶。
第三個字段:訪問發起方(origins),定義了發起訪問的主機名稱、域名稱、終端名稱。
而且/etc/security/access.conf文件提供了很多範例供修改時參考,並且都給出了具體的說明,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
示例說明(vsftp):
如果要在網絡內架設一個FTP服務器,而且在該FTP服務器上需要強制地指定某個用戶只能通過某個IP地址登錄,這個時候pam_access.so模塊就派上用場了。假設我的FTP服務器是使用vsftp來構建的,具體操作是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
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中有這樣的一行配置:
1 2 3 |
|
表示當用戶試圖登錄FTP服務器的時候,會調用pam_listfile.so模塊來驗證用戶是否可以登錄,這裏item=user表示訪問控制是基於user即用戶實現的。那麼哪些用戶可以登錄呢?就是除了file選項所定義的/etc/vsftpd/ftpusers文件之外的用戶,這是由另外一個選項sense=deny所決定的。而在/etc/vsftpd/vsftpd.conf中明確指定了對用戶的認證需要通過/etc/pam.d/vsftpd中的配置調用pam模塊:
1 2 |
|
而恰好root用戶又在/etc/vsftpd/ftpusers文件中,所以這成爲了制約root登錄FTP服務器的一個必要條件(但不是唯一條件)。所以針對這種情況,要開放和允許root用戶登錄FTP的權限,至少有三種改法:
1 2 3 |
|
不過需要注意的是,root用戶比較特殊,因爲它在vsftpd配置中的限制不僅僅來自於pam,vsftpd本身的配置中也對其做了限制。當我們看/etc/vsftpd/user_list文件的時候,還將會看到這樣的配置說明:
1 2 3 4 5 6 7 8 9 |
|
表示當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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
示例說明二:
僅僅允許kevin用戶可以通過ssh遠程登錄。做法如下:
在/etc/pam.d/sshd文件中添加一條(務必添加到文件的第一行!):
auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed
添加兩個用戶kevin和grace
1 2 3 4 |
|
編輯file指定的文件,添加上一個用戶kevin(這一步是關鍵)
1 |
|
然後驗證,發現使用kevin賬號能正常ssh登錄,使用grace賬號就不能正常ssh登錄了!
1 2 3 4 5 6 7 8 9 10 11 |
|
注:此處如果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個字段組成的表,其中具體限制的內容包括:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
需要注意的是,如果沒有任何限制可以使用"-"號,並且針對用戶限制的優先級一般要比針對組限制的優先級更高。使用pam_limits.so模塊的最常見的場景是在運行Oracle數據庫的RHEL服務器中,因爲一般Oracle數據庫在安裝之前,按照其官方文檔的說明需要先對某些用戶(Oracle)使用系統資源的情況進行限制。所以我們總是能夠在Oracle數據庫服務器的/etc/security/limits.conf文件中看到類似這樣的配置:
1 2 3 4 5 6 |
|
結合上面的配置文件說明,可知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服務器時的最大連接數(防止同一個用戶開啓過多的登錄進程)。限制操作如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
4)pam_rootok.so模塊
一般情況下,pam_rootok.so模塊的主要作用是使uid爲0的用戶,即root用戶能夠直接通過認證而不用輸入密碼。pam_rootok.so模塊的一個典型應用是插入到一些應用程序的認證配置文件中,當root用戶執行這些命令的時候可以不用輸入口令而直接通過認證。比如說"su"命令,爲什麼當以root用戶執行"su"切換到普通用戶身份的時候是不需要輸入任何口令而可以直接切換過去?當我們查看一下/etc/pam.d/su文件的內容就不會奇怪了。因爲該文件的第一行就是:
1 2 3 |
|
而如果將該行配置註釋掉的情況下,就會發現即便以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比較重要和難於理解的是它的一些參數和計數方法,其常用參數包括:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
/etc/pam.d/login文件裏包含了/etc/pam.d/system-auth文件的配置
1 2 3 4 5 |
|
如下看pam_cracklib.so的一個應用實例:在/etc/pam.d/system-auth中使用pam_cracklib.so來限制用戶修改自己密碼時必須滿足一定的強健性要求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
|
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接口處增加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
==========總結幾個PAM模塊比較常見的實操案例===========
1)怎樣才能強迫用戶設置的密碼不能與過去3次內的密碼重複?(特別注意:/etc/pam.d/system-auth下的配置針對的是普通用戶,在root用戶下是無效的)
1 2 3 4 |
|
2)如何要求用戶設置的密碼必須至少包含5個數字和3個特殊符號?
1 2 3 4 5 6 7 8 |
|
3)如何限制kevin用戶最多同時登陸4個?(同時可以限制root用戶)
1 2 3 4 5 6 7 8 |
|
4)某用戶連續登陸失敗2次就鎖定該賬號,禁止登陸?(默認只能嘗試登錄三次,由retry=N決定的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
|
5)如何限制root只能從kevin.com這臺計算機使用ssh遠程登陸?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************