常用的Linux可插拔認證模組(PAM)應用舉例

聽海★藍心夢發表於2014-02-10

常用的Linux可插拔認證模組(PAM)應用舉例:pam_limits.so、pam_rootok.so和pam_userdb.so模組。

limits.conf 檔案實際是 Linux PAM(插入式認證模組,Pluggable Authentication Modules)中 pam_limits.so 的配置檔案,而且只針對於單個會話。

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
  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檔案中看到類似這樣的配置:

1
2
3
4
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訪問進行限制,就可以呼叫該模組來實現相關功能。例如,當需要限制使用者admin登入到SSH伺服器時的最大連線數(防止同一個使用者開啟過多的登入程式),就可以在/etc/pam.d/sshd檔案中增加一行對pam_limits.so模組的呼叫:

1
session    required        pam_limit.so

然後在/etc/security/limits.conf檔案中增加一行對admin使用者產生的連線數進行限定:

1
admin      hard        maxlogins       2

完成之後重啟伺服器端的sshd服務。

之後我們可以看到,從客戶端以admin身份登入SSH伺服器時,在客戶端上可以開啟兩個控制檯登入。但當客戶端開啟第三個登入視窗的時候會被伺服器拒絕,但其它使用者不會受到限制。

pam_rootok.so模組

一般情況下,pam_rootok.so模組的主要作用是使uid為0的使用者,即root使用者能夠直接透過認證而不用輸入密碼。

pam_rootok.so模組的一個典型應用是插入到一些應用程式的認證配置檔案中,當root使用者執行這些命令的時候可以不用輸入口令而直接透過認證。

比如說“su”命令,為什麼當以root使用者執行“su”切換到普通使用者身份的時候是不需要輸入任何口令而可以直接切換過去?

當我們檢視一下/etc/pam.d/su檔案的內容就不會奇怪了。因為該檔案的第一行就是:

1
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使用者是不會產生限制的。

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伺服器配置方法,其中也包含了對pam_userdb.so模組的使用。

我的實驗環境很簡單:

FTP伺服器的IP地址是:10.66.0.136,使用的作業系統是RHEL 5.4,FTP服務是vsftpd。

操作步驟:

1.備份配置檔案:

1
[root@dhcp-0-136 ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

2.建立虛擬使用者資料庫檔案login.txt:

1
2
3
4
5
6
7
8
9
[root@dhcp-0-136 vsftpd]# pwd
/etc/vsftpd
[root@dhcp-0-136 vsftpd]# cat login.txt
ftpuser1
123
ftpuser2
123
ftpuser3
123

該檔案單數行為使用者名稱稱,雙數行為使用者訪問FTP伺服器時的口令。

完成之後根據該檔案內容建立登入使用者資料庫檔案:

1
[root@dhcp-0-136 vsftpd]# db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/vsftpd_login.db

之後需要確認系統上已經安裝Berkeley DB,即db4軟體包。

完成之後,在/etc/vsftpd/vsftpd.conf目錄下會產生vsftpd_login.db檔案。

設定該檔案的訪問許可權為僅root可讀寫:

1
[root@dhcp-0-136 vsftpd]# chmod 600 vsftpd_login.db

3.使用PAM來實現對登入FTP使用者的限制:

現在需要建立一個使用資料庫的pam配置檔案,在這裡該檔案命名為vsftpd.pam,在/etc/pam.d目錄下。


1
2
[root@dhcp-0-136 ~]# touch /etc/pam.d/vsftpd.pam
[root@dhcp-0-136 ~]# vi /etc/pam.d/vsftpd.pam

在該檔案中寫入下面的兩行:

1
2
[root@dhcp-0-136 ~]# cat /etc/pam.d/vsftpd.pam
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login?account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

假如說以後新增了新的使用者,那麼修改login.txt,然後再次執行命令:
db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/vsftpd_login.db

生成新的資料庫即可。

4.建立一個本地使用者,其主目錄作為虛擬使用者對FTP伺服器的訪問時的服務目錄:

[root@dhcp-0-136 ~]# useradd –d /home/ftpsite virtual

透過上面的步驟建立一個名為virtual的本地使用者,並且該使用者的主目錄是/home/virtual

5.現在透過對/etc/vsftpd/vsftpd.conf主配置檔案的定義來使虛擬使用者可以訪問FTP服務:

[root@dhcp-0-136 ~]# vi /etc/vsftpd/vsftpd.conf

既然該伺服器要求使用虛擬使用者訪問,那麼需要先關閉匿名使用者訪問功能:

anonymous_enable=NO?local_enable=YES

另外出於安全考慮,此處新增的所有使用者都只賦予對FTP伺服器只讀許可權:

write_enable=NO?anon_upload_enable=NO?anon_mkdir_write_enable=NO?anon_other_write_enable=NO

確保使用者在登入的時候使用剛才定義的PAM配置檔案來進行身份驗證,因此更改此行為:

pam_service_name=/etc/pam.d/vsftpd.pam

6.啟用虛擬使用者功能,並將所有虛擬使用者對FTP伺服器的訪問對映為剛才所新增的virtual使用者對FTP伺服器的訪問。

guest_enable=YES?guest_username=virtual

這個 guest_enable非常重要,該選項用來啟用虛擬使用者! 而guest_username 是將所有虛擬使用者對映成先前所建立的真實使用者"virtual"。這也決定了虛擬使用者在整個檔案系統中的位置,也就是"virtual"的主目錄 /home/ftpsite。

如果系統中還有本地使用者需要訪問FTP伺服器,可以再次對本地使用者訪問FTP服務時的根目錄進行指定:

local_root=/home/ftpsite

當然在這裡將local_root改為其它使用者也沒有任何問題。 再增加一行:

listen=YES

表示FTP伺服器將會以standalone的模式啟動。即不透過xinetd以及/etc/init.d下的指令碼啟動,而可以直接執行vsftpd的啟動。最後啟動FTP服務:

[root@dhcp-0-136 ~]# service vsftpd restart

在服務啟動之後可在客戶端上進行測試: 我們可以使用剛才在自定義資料庫中建立的使用者ftpuser1、ftpuser2、ftpuser3分別登入FTP伺服器進行訪問測試,如果都能夠在ftp的命令列中正常登入則證明整個實驗成功! 但是如果訪問失敗,比如說如果出現 “failed to open directory",則有可能是因為目錄/home/ftpsite不是全域性只讀屬性(如果想更改,可以透過設定 anon_world_readable_only=NO來實現,這個預設是YES,它是用來設定匿名使用者只能下載全域性可讀的檔案)。

7.在FTP伺服器的虛擬使用者建立之後,可以考慮針對不同的虛擬使用者設定不同的訪問許可權:

整個功能只有在使用虛擬帳號的情況下才能借助虛擬帳號的per-user功能來實現。   為了測試需要,現在新增另外三個新的使用者,分別是ftpuser4,ftpuser5和ftpuser6:

[root@dhcp-0-136 vsftpd]# cat login.txt 
ftpuser1
123
ftpuser2
123
ftpuser3
123
ftpuser4
123
ftpuser5
123
ftpuser6
123

然後將該檔案所有資訊再次匯入資料庫中:

[root@dhcp-0-136 vsftpd]# db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/vsftpd_login.db

假如在該場景中需要設定ftpuser4和ftpuser5使用者具有對主目錄的讀取許可權,而ftpuser6具有對主目錄的寫入許可權。   那麼可以針對這三個使用者分別建立配置檔案來進行限制。

首先建立並且定義一個容納每個使用者配置檔案的目錄:

[root@dhcp-0-136 vsftpd]# mkdir /etc/vsftpd_user_conf

然後在主配置檔案中進行定義,定義的是不同使用者配置檔案所儲存的路徑,就在剛才建立的目錄下:

user_config_dir=/etc/vsftpd_user_conf

進入該目錄建立不同使用者的配置檔案:

[root@dhcp-0-136 vsftpd]# cd /etc/vsftpd_user_conf

建立的ftpuser4配置檔案的內容如下:

[root@dhcp-0-136 vsftpd]# ls /etc/vsftpd_user_conf
    ftpuser4
    [root@dhcp-0-136 vsftpd]# cat /etc/vsftpd_user_conf/ftpuser4
    anon_world_readalbe_only=NO

透過上面的定義,ftpuser4使用者可以讀取的同時也能夠下載檔案。但是如果寫成YES則意味著無法列出檔案和目錄。 然後賦予ftpuser5使用者相同的許可權,由於許可權與ftpuser4一致,所以只需要複製配置檔案即可:

[root@dhcp-0-136 vsftpd]#cp /etc/vsftpd_user_conf/ftpuser4 /etc/vsftpd_user_conf/ftpuser5

最後是定義ftpuser6的許可權,該使用者可以向伺服器目錄寫入和上傳,那麼配置檔案內容為:

    [root@dhcp-0-136 vsftpd]# vi /etc/vsftpd_user_conf/ftpuser6
anon_world_readable_only=NO     不僅僅是隻讀,還可以下載
write_enable=YES                    可以寫入?anon_upload_enable=YES           可以上傳
anon_mkdir_write_enable=YES     可以建立目錄

如果ftpuser5已經提升為管理員,現在需要針對管理員定義一個更高的許可權,可以將ftpuser5的配置檔案增加一行:

anon_other_write_enable=YES        增加管理員使用者的刪除/重新命名的許可權

完成之後儲存退出,並重啟服務:

分別測試ftpuser4、ftpuser5以及ftpuser6的許可權會發現:

ftpuser4只有登入瀏覽許可權;   ftpuser5除了登入瀏覽之外還可以刪除檔案以及重新命名檔案   ftpuser6可以登入瀏覽並上傳和下載,但是對於已有的檔案沒有寫入許可權。

實驗到此基本成功!

在實際操作中,這種方法能夠更好解決對伺服器訪問使用者細化地設定許可權的問題。而且pam_userdb.so模組也不僅僅只是用於在FTP服務中建立和使用虛擬使用者,類似的服務,例如postfix,web服務等,都可以使用該模組實現類似功能。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/751371/viewspace-1079151/,如需轉載,請註明出處,否則將追究法律責任。

相關文章