TomcatでHTTPメソッドを制限する設定方法

忘れがちになるので、自分用にメモ。
TomcatでHTTPメソッドを制限する設定方法は以下の通り。

$CATALINA_HOME/conf/web.xml に以下の設定を入れる。には拒否したいメソッドを列挙する。下記例はすべてのURLについてGETとPOST以外を拒否する場合の設定。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>hoge</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>HEAD</http-method>
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
        <http-method>CONNECT</http-method>
        <http-method>PATCH</http-method>
        <http-method>PROPFIND</http-method>
        <http-method>PROPPATCH</http-method>
        <http-method>MKCOL</http-method>
        <http-method>COPY</http-method>
        <http-method>MOVE</http-method>
        <http-method>LOCK</http-method>
        <http-method>UNLOCK</http-method>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

上記設定により拒否された場合は403 Forbiddenが返されるようになる。

なお、Tomcat 6.0.29で試したところデフォルトで許可されている(HTTPステータスコード200が返される)メソッドはGET、HEAD、POST、OPTIONS。PUT、DELETEは403 Forbidden、TRACEは405 Method Not Allowed、CONNECT、PATCH、PROPFIND、PROPPATCH、MKCOL、COPY、MOVE、LOCK、UNLOCKは501 Not Implementedが返される。ただ、OPTIOSを実行すると、

Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS

と返されるので、PUT、DELETEも許可されているのかも。実験方法が

PUT / HTTP/1.0

というようなリクエストなのでリクエスト方法の問題かもしれない。
これらを考慮すると、上記設定もTRACE以下は不要ともいえる。
ちなみに、TRACEメソッドを有効にしたい場合は、server.xml要素にallowTrace="true"を記述すればOK。


あと、Tomcat 7.0.4で試してみると、よくわからないことになった。
TRACEで405 Method Not Allowedが返されるのは同じだが、他はなんでも200が返ってくる模様。CONNECT、PATCH、PROPFIND、PROPPATCH、MKCOL、COPY、MOVE、LOCK、UNLOCKどころか、

A / HTTP/1.0

とか

XXX / HTTP/1.0

とかやっても200が返ってくる。というわけで、Tomcat 7の場合、上記のようにブラックリスト方式では完全には制限できないのかも。