2020/12/26

在Tomcat設置Digest Authentication

摘要

本文概要記錄在Apache Tomcat設定HTTP Digest Authentication的要點及測試方法。 

本文

Apache Tomcat是一個Servlet容器,本身提供了HTTP伺服器的功能,可以透過編輯組態配置檔案來調整設定,設定包括對HTTP Digest Authentication的支援。

在Ubuntu MATE 16.04上安裝Apache Tomcat 8的指令如下。

sudo apt-get install tomcat8

安裝完畢的Apache Tomcat預設未啟用HTTP Digest Authentication,透過瀏覽器對預裝的頁面(index.html)進行測試的畫面如下所示,留意Wireshark封包擷取到的交握封包,其將會得到200 OK的回覆、並停在預期的頁面上。

為了讓Apache Tomcat支援HTTP Digest Authentication需要調整組態設定檔。還需要決定哪些頁面需要限制而哪些頁面不受限制。

這裡準備了2個頁面,其一的index.html不需要HTTP Digest Authentication、而另一的index-leo.html需要HTTP Digest Authentication。

組態設定主要是針對web.xml添加security-constraint元素和login-config。

參照下面摘錄的內容;可以發現security-constraint元素添加了一個url-pattern元素、且內容為index-leo.html,而僅有role-name為tomcat能夠存取;另外,login-config元素的auth-method被指定成DIGEST、且realm-name被指定成MyAdmin

<security-constraint>
            <display-name>SolrAdmin</display-name>
            <web-resource-collection>
                     <web-resource-name>Protected Area</web-resource-name>
                     <!-- Define the context-relative URL(s) to be protected -->
                     <url-pattern>/index-leo.html</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                    <!-- Anyone with one of the listed roles may access this area -->
                    <role-name>tomcat</role-name>
            </auth-constraint>
</security-constraint>
 
<login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>MyAdmin</realm-name>
</login-config>

組態設定還要為server.xml的UserDatabaseRealm添加digest屬性、並指定值為MD5

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase" digest="MD5"/>
      </Realm>

產生Apache Tomcat可識別的密碼時,可以使用其提供的digest.sh腳本來達成。以下是將賬號指定為tomcat、realm指定為MyAdmin、且明文密碼指定為tomcat的執行畫面,其中,-s 0是指定salt為0。

組態設定還要針對tomcat-users.xml啟用對應的賬號、密碼、與角色,其中的密碼就是使用前述的digest.sh所產生的值。
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="7d0774d7ca66ef117897f2285009ae14" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>

透過瀏覽器對加以限制的頁面進行存取的畫面如下所示,將會先彈出交談框要求輸入賬號密碼。留意Wireshark封包擷取到的交握封包。

成功通過賬號密碼鑑定時將會先得到401 Unauthorized再得到200 OK的回覆、並停在預期的頁面上。

在指定次數內(這裡是3次)沒通過則號密碼鑑定時將會得到401 Unauthorized的回覆、並停在錯誤頁面上。

備註:若是存取不存在的頁面則會得到404 Not Found的回覆、並停在錯誤的頁面上。



參考文獻

https://kknews.cc/zh-tw/code/ng3mmp8.html
https://stackoverflow.com/questions/39967289/how-to-use-digest-authentication-in-tomcat-8-5

沒有留言:

張貼留言