以Apache模組實作網頁權限認證功能

mod_auth_mysql 設定

以Apache模組實作網頁權限認證功能

用MySQL資料庫 提供Apache控管帳號權限

運用Apache伺服器的mod_authnz_external模組搭配pwauth驗證程式,即可利用系統上原有的使用者帳號來認證進行網頁控管,而不必透過htpasswd程式來一個一個新增帳號。但如此的做法還是不夠彈性,如果能夠利用資料庫來進行帳號控管就更理想,接下來說明如何利用MySQL資料庫來實作網頁認證。

安裝mod_auth_mysql

在此將以DSO(Dynamic Shared Object)的方式來編譯mod_auth_mysql模組,以下先簡單說明DSO機制。

Apache網站伺服器是一種模組化的系統,可隨意地掛載所需的模組如mod_SSL mod_security等,來增加相關的功能,而其第一種掛載方式是靜態(Static)的模組掛載,例如上述mod_auth認證模組。此種方式必須在編譯原始碼的階段時將所需的模組編譯進來,譬如使用「configure –enable-so」掛載so模組,在編譯階段就會將so模組掛載進來。

另一種較彈性的模組掛載方式為動態掛載模組,有需要時才掛載進來,可利用在httpd.conf設定檔內加上LoadModule的方式來動態載入相關模組。在Apache伺服器上須提供DSO機制,才能夠實現動態掛載模組的功能。Apache伺服器必須在編譯時加上「–enable-so」參數,才可使用DSO機制。可利用指令「httpd -l」檢查是否有支援DSO機制。若出現mod_so.c等字句,即表示有支援DSO機制。

Apache並提供apxs(APache eXtenSion)程式來編譯Apache動態模組。以下說明apxs的使用方法。在此僅說明編譯和安裝的相關選項,其餘選項請自行查閱相關的文件說明。編譯選項如下:

-c:此選項表示執行編譯。將原始碼編譯成動態模組。

-o:指定編譯後的動態模組檔名。

-D name=value:可指定相關的編譯變數。

-I incdir:可用於增加自訂的包含目錄。

-L libdir:可用於增加自訂的程式庫(lib)目錄。

-l libname:可用於增加自訂的程式庫檔案。

-Wc,compiler-flags:可增加編譯器特有的選項。

-Wl,linker-flags:可增加連接器(Linker)特有的選項。

而apxs的安裝選項,則包含以下這幾個項目:

-i :執行安裝,將相關的動態模組安裝至Apache的MODULES目錄中。

-a:自動在httpd.conf加上LoadModule來啟用模組。

-A:自動在httpd.conf加上LoadModule來啟用模組,但會在行首加上#,表示該模組已就緒但尚未啟用。

了解DSO相關的說明後,接著安裝mod_auth_mysql模組,先至下列網址取得最新版本(筆者所取得的版本為3.0):

http://modauthmysql.sourceforge.net/

檔案下載後進行解壓縮,然後以下列指令編譯:

在編譯的過程中會有錯誤訊息產生,這是因為Apache在2.2.11之後的版本,有修改一些MACRO的介面,而mod_auth_mysql 3.0所使用的MACRO為Apache 2.2.11之前的版本。

但在本解決方案中,所使用的Apache版本為2.2.17。在Apache 2.2.17版本中,更改過AP_INIT_FLAG這個MACRO的介面,所以請手動將相關原始碼中有使用AP_INIT_FLAG的第三個參數名稱,由APR_XtOffsetOf更改為APR_APR_OFFSETOF,即可正常的編譯完成。

另外一個更改的地方是,將相關檔案中所有的ap_pstrcat,更改為apr_pstrcat。在編譯成功後,再執行下列指令來安裝相關模組:

在安裝成功後,可在Apache的模組目錄中(本例目錄為「/usr/local/apache/modules/」)發現mod_auth_mysql.so檔案要使用此模組。

在httpd.conf設定檔內加上LoadModule mysql_auth_ module modules/mod_auth_mysql.so,即可啟用mod_auth_mysql模組功能。

以資料庫控管被保護的目錄

首先,先行建立儲存相關帳號密碼的資料庫。在本解決方案中建立一個資料庫名稱為accountDB,

然後,新增一筆使用者為「TEST」且密碼也為「TEST」的紀錄。在欲保護的目錄下新增.htaccess檔案

設定完成後,透過瀏覽器連上該網站伺服器,即會彈出一個認證視窗,要求使用者輸入帳號和密碼。輸入完成後,經過帳號及密碼檢查,且使用者的來源IP必須符合ip_address欄位所設定的資訊,方可認證成功。

ref:

http://modauthmysql.sourceforge.net/CONFIGURE

http://www.cgi101.com/book/ch20/mod_auth_mysql.html