htaccess mod_auth pwauth Apache 網頁伺服器 身份驗證 身份認證 權限

直接抓取系統使用者帳號 驗證Apache網頁權限

2011-07-21
利用Apache內建的mod_auth模組來進行網頁認證,須要自行建立相關的帳號及名稱資訊,如果想要讓系統主機上的使用者均可登入,就必須自行利用htpasswd程式手動一筆一筆地建立相關的帳號資訊,在使用上較為不便。有鑑於此,Apache伺服器也針對此種需求提供mod_authnz_external模組搭配pwauth驗證程式,如此即可利用系統上的帳號資訊來進行網頁控管。
安裝mod_authnz_external模組及pwauth程式

採用如下圖所示的mod_authnz_external模組架構,而驗證流程如下所述:

▲mod_authnz_external模組架構。

STEP 1:使用者在網頁上輸入「帳號」和「密碼」等資訊。

STEP 2:Mod_authnz_exteral模組接收到相關的資訊。

STEP 3:將「帳號」和「密碼」等相關資訊傳遞至pwauth程式。

STEP4:pwauth比對是否為主機上的有效帳號及正確密碼,若正確無誤即放行。

然後,安裝以系統帳號來控管網頁認證的模組。在此,假設讀者已建立好Apache網站伺服器且已提供DSO功能。

以筆者的環境為例,Apache伺服器是建立在「/usr/local/apache」目錄。接下來,開始安裝mod_authnz_external模組。

首先,以wget指令至下列網址下載最新版的Mod_authnz_exteral。

檔案下載回來後進行解壓縮動作,並根據自身的系統環境來修改Makefile檔案,以筆者為例,將APXS選項更改至下列位置:

更改完成後,直接下達指令「make && make install」來進行安裝。

安裝完成後,在Apache的modules目錄(本例為「/usr/local/apache/modules/」)下會產生一個mod_authnz_external.so檔案,mod_authnz_external模組相關的選項如右上表所示。

接下來,繼續設定Apache的組態檔(httpd.conf),新增如右下設定:

mod_authnz_external模組的相關選項

繼續安裝pwauth程式,使用wget指令從下列位址取得最新版的pwauth程式:

解壓縮後,在編譯之前須先修改config.h,設定Apache運作時的使用者UID資訊。先確認Apache運作時的權限,檢查httpd.conf檔案中的User和Group選項(預設為nobody)。

本例使用的是名稱為www的使用者,當成Apache運作時的權限。而後再檢查「/etc/passwd」,利用指令「cat /etc/passwd | grep www」來過濾出www的相關資訊(需根據讀者的設定而異),如下所示:

其中,502即為UID,在取得UID後,即可設定config.h,將「#define SERVER_UIDS 72」更改為「#define SERVER_UIDS 502」。而後,利用指令「make」編譯,即可編譯出pwauth的執行檔。

由於pwauth程式須讀取「/etc/shadow」檔案,而該檔案必須是root使用者方可讀取,而pwauth在本解決方案中,其執行權限為www(因為是由Apache伺服器所執行,而Apache伺服器執行時為www使用者的權限,所以pwauth並無權限讀取「/etc/shadow」檔案來進行驗證),所以必須利用setuid指令來設定pwauth擁有特殊權限。

setuid是一種特殊的權限,一般程式的權限在於呼叫它的程式權限,如本例由Apache來呼叫pwauth程式,pwauth在運作時即為www使用者的權限,而setuid即是設定該檔案在執行階段時的權限為該檔案擁有者的權限。

此種檔案最有名的程式即為passwd(提供個別使用者更改密碼的程式),可利用指令「ls -l /usr/bin /passwd」所得到的結果,如下所示:

如果要更動使用者的密碼,勢必會更動「/etc/shadow」檔案內容。查看「/etc/shadow」檔案的屬性,即可發現僅有root使用者可寫入該檔。為何其他使用者更動密碼時即可更動該檔?因為passwd是setuid程式,在該程式執行時即為root權限,這也是為什麼一般資安人員都會建議使用者盡可能地減少系統上擁有setuid權限的檔案,因為該檔案一旦淪陷,失去的不只是一般使用者的權限,而是root最高權限。

言歸正傳,接著利用下列指令設定pwauth為setuid程式:

設定完成之後,同樣地在欲保護的目錄之中新增.htaccess檔案,其內容如下:

至此,就完成利用系統上原先帳號進行網頁認證的功能,而不必一個一個透過htpasswd程式來新增帳號。但如此的做法還是不夠彈性,如果能夠利用資料庫來進行帳號控管就更理想。接下來,繼續說明如何利用MySQL資料庫來實作網頁認證。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!