【原創】Apache HTTP Server認證初探

lastwinner發表於2011-09-24
啃了幾天的,並經過一些實測,關於Apache HTTP Server認證,有些心得,記錄於此。閒話少說,這就開始。以下敘述均基於Apache HTTP Server 2.2。
所謂認證,最常見的場景就是在設定家庭路由器時,需要輸入使用者名稱和密碼,如果輸入錯誤或者取消認證,則頁面會提示HTTP 401錯誤——"Authorization Required"。
HTTPD的認證分為Basic和Digest兩種模式,Basic方式以明文方式向伺服器端提交使用者名稱和密碼,而Digest方式以加密方式向伺服器端提交使用者名稱和密碼。Digest方式顯然更安全一些。
兩種認證方式是可以並存的,至少在2.2版及windows平臺上是這樣的。網上有描述說二者不能並存的說法是錯誤的,至少不完全正確。

HTTP Server要對使用者身份進行認證,必須得能訪問到儲存使用者憑據的東東——認證源。認證源可以是檔案(file)、DBM檔案(DBM File)、LDAP、DBD(SQL Database),目前我就知道這四個,後面沒有“等”字。解釋一下DBM,它有SDBM、GDBM、NDBM和DB等格式,它實質上是一個非常簡單的可以高效訪問的Key-Value資料庫,其中的“DB”指的就是“Berkeley DB 2”。SQL Database?對,你沒看錯,HTTPD支援從SQL Database中獲取資訊來認證使用者,包括Oracle、MySql、PostgreSQL、SqLite等,也可以透過ODBC介面連線到其他資料庫(例如MSSQL)。例如,你可以在httpd.conf中像下面這樣配置,透過DB認證一個使用者是否合法:
# mod_dbd configuration
DBDriver pgsql
DBDParams "dbname=apacheauth user=apache password=xxxxxx"

DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300


# core authentication and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "My Server"
AuthBasicProvider dbd

# core authorization configuration
Require valid-user

# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery \
"SELECT password FROM authn WHERE user = %s"

這使得HTTPD的認證源更加安全,因為其完全可以部署在另外一臺伺服器上。(可以避免被破壞,但http伺服器被攻破後,別人是可以從配置檔案中查到資料庫的連線資訊從而獲得使用者的認證憑據的)

HTTPD的安裝包裡同樣提供了很多認證相關的工具,比如htdbm、htdigest、htpasswd、httxt2dbm,這幾個是可以直接執行的,還有個dbmmanage,是perl指令碼寫的,在windows下,你必須安裝一個perl的環境才能使用。詳閱



ps:關於DBM File,摘錄一段簡明扼要的說明給大家看:
DBM is an acronym which stands for Data Base Management
A DBM file is simply a binary database of key-value pairs
Perl enables you to "bind" an associative array variable to a DBM file using the dbmopen() function
The contents of the DBM file may then be manipulated by simply referencing or assigning to the associative array variable!

關於DBM 檔案的原始碼研究可以參考這裡

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

相關文章