Apache Basic / Digest Realm Authentication

最近想針對 Broso 特定系統統計功能做身份檢核的動作,於是稍微研究了一下針對 HTTP 協定中有關於身份驗證的機制。
HTTP 協定針對身份驗證分兩種模式,Basic Realm / Digest Realm。Basic Realm 僅將帳號密碼用標準 BASE64 來做編碼後,上送給 Web Server 來驗證,所以有心人其實可以透過 Sniffer 之類的軟體來進行側錄,再用 BASE64 解碼即可得知帳號密碼。

Digest Realm 則是為了解決上述 Basic Realm 的缺點,採用一般 Unix 儲存/驗證密碼的方式,每次瀏覽器要求連線,Web Server 會回覆一組隨機產生的 nonce value。瀏覽器則將帳號/密碼/nonce/GET(or POST)以及 URI 等參數,依指定的 hash function 做成訊息摘要( Digest),再將 Digest 上傳到 WebServer 驗證,如此一來上送的 Digest 每次皆會不同,藉以避免被有心人士所側錄。

以上可參考 RFC 2617 – HTTP Authentication: Basic and Digest Access Authentication

Apache 已經實作上述兩種機制,mod_auth 模組僅支援 Basic Realm。而 mod_auth_digest 則是支援 Digest Realm。不過如果 Apache 是抓預先編譯好的的 binary,或是編譯時未特別指定,那麼預設是不包含 mod_auth_digest 模組。

步驟一:重新編譯 APACHE.

由於我先前的 Apache 2.0.55 並未特別指明要啟用 mod_auth_digest,於是我重新下載 Apache 2.0.59 回來重新編譯。
執行 configure 指令如下

./configure –enable-auth-digest –prefix=<APACHE_INSTALL_DIR>

如此編譯時就會自動將 mod_auth_digest 加入。接著作 make, make install 就完成了。

步驟二:產生 Digest 帳號密碼檔

接下來先產生一組帳號密碼設定檔,每組帳號密碼都需針對特定的 realm 獨立設定。需使用 <APACHE_INSTALL_DIR>/bin/htdigest 指令來產生密碼檔。
指令格式

<APACHE_INSTALL_DIR>/bin/htdigest -c <path>/<digest_password_file_name> <realm name> <user id>

-c 代表要產生一個新的密碼檔,如果檔名已經存在,就會被覆蓋。所以如果想繼續增加新的帳號密碼,就無須加上 -c 即可
後面接上密碼檔的路徑與檔名,以及要檢核密碼的 “領域(realm)” (意指瀏覽器 popup 視窗,提示輸入帳號密碼時,上面顯示的名稱),最後是帳號名稱
之後 htdigest 會詢問兩次密碼後就完成建立密碼檔。

例如:我要針對 /mymrtg 與 /awstats 兩個目錄進行身份檢核,就需針對這兩個領域來建立帳號密碼

htdigest -c <somewhere>/digestpasswd “MYMRTG” <user_id>
htdigest <somewhere>/digestpasswd “AWSTATS” <user_id>

屆時瀏覽器提示帳號密碼輸入時,就會顯示目前要您輸入的領域是 MYMRTG 或是 AWSTATS

步驟三:調整 httpd.conf

針對每個要作身份檢核的的領域作設定

<Directory “<somewhere>/mymrtg”>
   AuthType Digest → 指定使用 Digest Realm Authentication
   AuthName “MYMRTG” → 指定領域名稱
   AuthDigestFile <somewhere>/<digest_password_file_name> → 指定帳號密碼檔路徑與檔名
   Require user <allowed user id> → 這裡指定允許使用的 user id

   …
   …
</Directory>

設定完畢重起 Apache 即可

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料