在網路服務的認證系統上,使用者多半必須經由PAM認證程序通過,才能使用相關的應用程式,然而不管是在一般Linux系統上輸入使用者帳號及密碼等相關資訊來進行身分認證,還是採以SSO(Single Sing On,單一簽入入口),向遠方的LDAP認證主機來查詢相關資訊的認證方式,管理起來都不是很方便,本文將實作利用MySQL資料庫來協助IT人員做好帳號和密碼資訊的管理。
可插入式認證模組(Pluggable Authentication Module,PAM)廣泛應用在網路服務的認證系統上,角色就類似於使用者與應用程式的中介,使用者須經由PAM認證程序通過後,方可使用相關的應用程式。
除了實際的認證程序外,PAM認證模組還具有管理相關帳號和密碼的功能,但因為PAM認證模組是利用檔案系統來管理帳號和密碼資訊,使用起來並不是那麼方便。因此在本文將介紹pam_mysql模組,它是一種利用MySQL資料庫來管理PAM模組所需相關帳號和密碼資訊的模組。
在本解決方案中,將以vsftpd伺服器為例,實作一個以MySQL資料庫控管帳號和密碼的FTP伺服器,所需的套件如下表所示。
FTP網路服務介紹
FTP(File Transfer Protocol)是相當古老的網路服務,即使如此,目前一旦遇到大檔案要傳輸的問題,最先想到的解決方案還是利用FTP伺服器來進行傳輸。
在一般的FTP服務中,通常利用系統帳號/?密碼的資訊來進行驗證,而在本解決方案中,將利用MySQL資料庫進行FTP帳號/?密碼的驗證。下列先說明FTP相關的基本原理。
FTP是一種雙埠的網路服務,所謂雙埠網路服務即表示要完成此服務需有兩個通訊埠來支援(目前大多數的網路服務大多使用單一通訊埠,例如網站服務就僅僅使用一個80埠)。
FTP服務將所需的通訊埠分為命令埠和資料埠。而依其運作模式又可分為主動式FTP(Active Mode)與被動式FTP(Passive Mode),其各自的動作原理說明如下:
主動式FTP
主動式FTP伺服器的命令埠固定在21埠,而資料埠固定在20埠,其運作流程如下圖所示:
|
▲主動式FTP示意圖。 |
1. Client端經由命令埠要求與Server端建立命令通道。
2. Server端回應此要求,並建立命令通道。
3. 在建立完成命令通道後,Client端經由資料埠(埠20)向FTP伺服器要求建立資料通道。
4. Server端經由資料埠(20)將Client端所要求的資料回傳給Client端。
被動式FTP
被動式FTP伺服器的命令埠固定在21埠,而資料所使用的通訊埠並無固定,其運作流程如下所示:
|
▲被動式FTP示意圖。 |
1. Client端經由命令埠(21)要求與Server端建立命令通道。
2. Server端回應此要求,並建立命令通道。
3. Client端經由資料埠向Server端要求資料。
4. Server端經由資料埠(不特定通訊埠,如本例為2024埠)將Client端所要求的資料回傳給Client端。
在此提供一個實務上的經驗。由於FTP服務是一種雙埠的服務。在實務上經常會發生下列情況,由於管理者防火牆的規則設定錯誤,常常會無意間將FTP的命令埠或資料埠關掉(最常見的情況是資料通訊埠被停用),這將會導致使用者雖可正常登入到FTP伺服器(因為命令埠是正常的,如果不了解FTP雙埠服務的原理,常會以為FTP伺服器運作正常)。但是在登入FTP伺服器後,如果想要利用如get或ls等指令來取得相關的資料,即會發現FTP伺服器無法回應。
若真的碰到以上這種情形,最好檢查一下防火牆的規則,確認FTP伺服器的資料埠(20埠)並沒有被阻擋。在了解相關的FTP動作原理後,接著安裝vsftpd伺服器。
安裝vsftpd伺服器
vsftpd全稱為Very Secure FTP,顧名思義此套伺服器主要是標榜著安全。一般來說,網路服務最怕的就是被攻擊之後,讓駭客取得該網路服務的權限,例如有一個網路服務的執行權限為root,一旦該網路服務被駭客攻陷後,則駭客即取得系統的root權限進而控管整個系統。
另外一個的風險是,即使沒有取得root權限,但因系統設定的原因,還是可取得全系統檔案的存取權限。
基於上述原因,vsftpd伺服器利用限制使用者權限和限制系統存取範圍來增進安全性,vsftpd伺服器主要的特點如下所述:
1. vsftpd服務的啟動者為一般使用者的權限,所以對於系統的使用權限較低,對於系統的危害就相對地減低了。
2. vsftpd服務提供chroot函數,可將系統存取範圍侷限在某個範圍中,例如設定在「/var/tmp」目錄中,即使vsftpd服務被攻陷,駭客仍然只能侷限在「/var/tmp」目錄內,而不會影響系統其他的目錄。
接下來,開始安裝vsftpd伺服器。安裝此伺服器很簡單,僅須使用「yum install vsftpd*」指令即可安裝完成。安裝完成後,vsftpd伺服器的相關程式檔如下表所示。
接著,繼續說明vsftpd.conf設定檔主要的組態值,相關說明如下表所示。
在了解相關的組態設定之後,即可設定相關的組態來啟動vsftpd伺服器,通常只要更改「/etc/vsftpd/vsftpd.conf」中的參數(如下表所列,其餘參數的用法請自行參閱其他文件),即可正常啟動VSFTPD伺服器。
設定完成後,僅須利用「/etc/init.d/vsftpd start」指令即可啟動vsftpd伺服器,而使用「/etc/init.d/vsftpd stop」指令則可關閉vsftpd伺服器。接下來,說明PAM認證系統。
何謂PAM認證系統
一般在Linux系統上都是利用輸入使用者帳號以及密碼等相關資訊來進行身分認證,例如要登入Linux系統時,必須提供使用者名稱和密碼,而後登入程序才能根據使用者所給的名稱和密碼來確認是否為合法的帳號。
如果企業要導入SSO(Single Sing On,單一簽入入口),此種驗證方式一般都需要向遠方的LDAP認證主機來查詢相關的認證資訊,此種認證型式勢必要重新編譯相關的程序。
也就是,在一般傳統的認證程序中均能針對個別的認證型式進行處理,若改用不同的認證方式,則必須重新編譯相關進行認證的程序。
那麼是否能有一個比較彈性的機制,只透過設定組態檔的方式就能夠指定應用程式採用那種驗證方式(甚至可指定多重驗證,即一個應用程式可指定多種的認證方式),而不必重新編譯相關的程序?
PAM機制即是此類具有彈性的機制,它允許系統管理員利用設定組態檔的方式來動態指定應用程式可使用那些認證方式,而不必再重新編譯要進行認證的程序。使用PAM認證模組時,使用者只需要編輯一個配置文件,就可以決定認證模組要如何嵌入應用程式中。
在Fedroa系統中,PAM模組設定資訊位於「/etc/pam.d」目錄下,該目錄下的各個檔案名稱即為服務名稱,例如login即為login服務設定的相關資訊。如下說明PAM設定格式以及各參數的意義:
login(服務名稱) session(模組類型) required(控制符號) pam_unix_session.so(模組的路徑) (額外參數)
服務名稱
在此設定所要使用認證型式的服務名稱,如su、login等等名稱。
模組類型
PAM設定了如下四種的認證模組類型:
auth:對使用者所提供的認證資訊進行驗證,例如檢查帳號密碼是否為有效的使用者。
account:檢查非認證方面的帳號管理,例如檢查使用者帳號是否已過期、哪些帳號可從哪些來源端來存取服務或限定存取服務的時間等等。
password:與更新認證訊息有關,例如使用者變更密碼時會檢查新密碼是否夠安全。
session:這個模組類型裡所使用的模組,是與使用者在存取服務前後需要執行的一些工作有關聯,例如紀錄掛載目錄的資訊等等相關資訊。
控制符號
當PAM執行模組驗證成功或失敗之後所須執行的動作,PAM指定下列控制符號來進行模組驗證成功或失敗之後的動作:
required:當認證模組驗證成功時即執行模組所定義的情況,而當模組驗證失敗的時候,如果使用者有設定其他的認證模組,即繼續執行其另外定義的認證模組。
requisite:如果認證模組驗證失敗,即直接回覆失敗的訊息,而不再繼續執行其他的認證模組。
sufficient:如果這個模組驗證成功,則不執行後面的認證模組,但如果之前已設定Required的認證模組,則此模組的結果將會被忽略。
模組的路徑
在此選項中即設定實際執行認證的程式,通常位於「/lib/security/」目錄下(以pam開頭的檔名),例如pam_wheel就是用來增強su安全性的功能。
額外參數
在此可設定一些額外的參數給認證模組,最常用的參數為debug,可幫助使用者除錯。其餘的參數自行查閱相關文件。
pam_mysql模組簡介
簡單地說,pam_mysql模組是一個使用MySQL資料庫來控管PAM認證系統所需的帳號和密碼資訊。安裝pam_mysql模組相當地簡單,只需使用「yum install pam_mysql」指令即可,在安裝成功後,即會在系統產生「/lib/security/pam_mysql.so」檔案,pam_mysql模組所提供的參數說明,如下表所述:
在了解pam_mysql模組所提供的參數意義後,接下來即可設定相關參數,讓vsftpd伺服器支援pam_mysql模組。
首先,建立下列資料庫。在本範例之中,筆者所建立的資料庫名稱為vsftpd,並且建立了下列資料庫表格。
建立完成後,可利用「insert into users set name=’帳號名稱’, passwd=password(‘密碼’)」來建立使用者與密碼名稱。
在這裡必須確認,由password函數所產生的密碼不能低於16個字母。否則,就要確認my.cnf是否有設定old_password的選項,或者MySQL版本低於4.0版。
設定完成後,即可設定vsftpd.conf的設定。就如同上述組態的設定,要特別確認一下「pam_service_name=vsftpd」,也就是vsftpd伺服器的PAM認證使用「/etc/pam.d/vsftpd」檔案。
最後,再來更改「/etc/pam.d/vsftpd」檔案,其內容如下:
至此,重新啟動vsftpd伺服器,之後即可套用pam_mysql模組,而利用users資料庫表格來控管帳號和密碼了。
結語
PAM認證系統因其彈性和穩定的特色,早已廣泛地應用於支援各種網路服務如FTP、Samba服務等等,作為實作認證登入的程序,但對於帳號和密碼資訊的管理機制卻付之闕如。
pam_mysql模組的出現,改變了此種狀況。pam_mysql模組可輕易地利用MySQL資料庫來管理令人頭痛的帳號與密碼管理問題,讓使用者能更簡單地利用資料庫來管理相關的帳號及密碼資訊。
也許,讀者可以思考將相關的網路服務(例如Samba、FTP等等利用PAM作為認證的網路服務)集中利用pam_mysql模組來進行管理帳號和密碼資訊,從另一個角度來看,這或許也是另一種SSO的實現。