2014-09-01 18 views
1

我正在測試Apache身份驗證從使用文件到使用dbd和mysql的遷移。我在CentOS 7服務器上使用apache 2.4.6。目前我希望保持文件和dbd身份驗證的正常工作,直到我很高興它正常工作。 這裏是我的配置的相關位:使用'AuthDigestProvider文件dbd'命令的Apache身份驗證似乎是錯誤的

LogLevel debug 
# 
ScriptAlias /cgi-bin/ "/var/www/dummy/cgi-bin/" 

# mod_dbd configuration 
DBDriver mysql 
DBDParams "dbname=myDb user=somebody pass=somepassword" 
DBDMin  4 
DBDKeep  8 
DBDMax  20 
DBDExptime 300 

<Directory "/var/www/dummy/html"> 
    Options Includes FollowSymLinks 
    # Only needed if we use .htaccess for authentication 
    AllowOverride None 

    AuthType Digest 
    AuthName "Realm" 
    AuthDigestDomain /var/www/dummy/ 
    # nb use dbd first and if that fails use file 
    # Well this keeps on failing 1-Sep-2014 
    # AuthDigestProvider dbd file 
    # Whereas this succeeds (huh??) with 
    # the error.log indicating (at LogLevel debug) 
    # it is due to dbd-group being granted 
    AuthDigestProvider file dbd 

    # These are specific to dbd 
    AuthDBDUserPWQuery "select pass from blah where UserName=%s" 
    AuthDBDUserRealmQuery "select Realm from blah where UserName=%s)" 
    # The first column value of each row returned by the query statement 
    # should be a string containing a group name. 
    # Zero, one, or more rows may be returned. 
    AuthzDBDQuery "select GroupName from blah where UserName=%s" 

    # These are specific to file 
    AuthUserFile /somewhere/passwd 
    AuthGroupFile /somewhere/group 

    # We require either dbd-group or failing that file group 
    <RequireAny> 
     Require dbd-group mygroup 
     Require group mygroup 
    </RequireAny> 
</Directory> 

根據Apache文檔(http://httpd.apache.org/docs/2.4/howto/auth.html):

AuthBasicProvider file ldap 
Require valid-user 

在這個例子中,文件提供商將首先嚐試驗證用戶。如果不能對用戶進行認證,LDAP提供將被調用。」因爲有暗示或連續之間需要聲明,但我已經包含了它,使其明確

的RequireAny指令是沒有必要的。

現在,如果我做的AuthDigestProvider指令指令「AuthDigestProvider指令DBD文件」命令這兩個失敗需要DBD組和要求組但是,如果我做的指令「AuthDigestProvider指令文件DBD」它成功和日誌文件表明:

[authz_core:debug] [pid 22474] mod_authz_core.c(802):[client ...] AH01626:Require dbd-group mygroup的授權結果:g咆哮。

我的問題是:這是否表明apache已授予使用dbd的訪問權限,還是真的授予了使用文件的訪問權限,並假裝它使用了dbd?

後續問題是:如果這個文件的dbd命令成功,爲什麼它會以'dbd文件'的順序失敗 - 當然,如果成功,它應該成功,不管使用什麼命令?

NB請不要回應有關摘要與基本認證的選擇,這只是一個測試。

+0

_「這是否表明apache已經使用dbd授予了訪問權限,或者是否真的授予了使用文件的訪問權限,並且假裝它使用了dbd?」_ - 您不應該能夠通過使用兩個不同的用戶,一個在文件中,另一個在dbd中,並且每個用戶都進行一次身份驗證,然後查看日誌說的是什麼? – CBroe 2014-09-01 07:01:21

+0

感謝您的建議CBroe。我在數據庫中添加了一個不在文件中的用戶,並且驗證失敗。我確實在'https://wiki.apache.org/httpd/FAQ#How_do_I_set_up_Apache_to_require_a_username_and_password_to_access_certain_documents.3F'中讀過一些關於默認情況下不認證的模塊。建議是「只需在配置中添加適當的'XXXAuthoritative yes'行,但我不確定這適用於2.4,我還沒有找到合適的指令...... – VaughanR 2014-09-02 02:08:28

回答

0

那麼我已經做了一些更多的實驗,我現在懷疑摘要認證在64位機器上的authn_dbd中被破壞了。我檢查了從客戶端瀏覽器接收到的返回給服務器的響應哈希,它們與rfc-2617匹配,但apache-2.4.6(apr-1.5.1,apr_util-1.5.3)和apache-2.2.27( apr-1.4.8,apr-util-1.5.2)在不同的64位機器上運行會返回「密碼不匹配:/」錯誤,因爲他們應該在相同的輸入值上構建比較哈希值,顯然他們沒有得到結果在rfc-2617中定義。

我沒有得到任何mysql錯誤,所以我認爲這是返回正確的值(由htdigest生成的字符串),它會在我直接在數據庫上測試查詢時執行。我配置了mysql數據庫以返回用戶名,領域和密碼字段的ascii字符值,所以它不應該是字符編碼問題。由於使用'文件'時密碼匹配OK,我只能假定authn_dbd計算與authn_file返回的不同的散列?

其實在我的配置中有一個錯誤,我當時沒有拿起。該AuthDBDUserRealmQuery實際返回的密碼不境界(見mod_authn_dbd文檔),所以它應該是:

AuthDBDUserRealmQuery

和AuthDBDUserPWQuery應該是「從用戶其中username =%s和範圍=%s的選擇pass」刪除