Apacheの機能で利用できるメソッドを制限してみました。

■環境図


■説明
Apacheの機能でHTTPメソッドを制限するディレクティブがあったので検証してみました。
ここでは、以下のディレクティブの「2」を利用します。

ディレクティブ
1. Limit
「Limit」でメソッドを記述すると記述されたものにしか制限がかけられません。
# 許可しないものだけを定義するブラックリスト方式のような感じだと勝手に思っています :-)

2. LimitExcept
「LimitExcept」でメソッドを記述すると記述されたもの以外に制限がかかります。
# 許可するものだけを定義するホワイトリスト方式のような感じだと勝手に思っています :-)

上記のディレクティブで制限ができるメソッドは以下の通りです。

制限できるディレクティブ
GET
POST
PUT
DELETE
CONNECT
OPTIONS
PATCH
PROPFIND
PROPPATCH
MKCOL
COPY
MOVE
LOCK
UNLOCK

制御が効いてるかの確認方法は、クライアントから「libwww-perl」ツールを使って確認します。
※「GET」を有効にすると強制的にTRACEも有効になってしまいます。

■利用OS
CentOS 6.2 64bit

■条件
Webサーバには、既に「httpd,mod_ssl」がインストールされているものとします。

(1)Webサーバでメソッドの制限設定

[root@example2 ~]# vi /etc/httpd/conf/httpd.conf
(snip)
#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory "/var/www/html">

#
# Possible values for the Options directive are "None", "All",
# or any combination of:
#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
    Options Indexes FollowSymLinks

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride None

#
# Controls who can get stuff from this server.
#
#    Order allow,deny
#    Allow from all
<LimitExcept GET POST>
     Order deny,allow
     Deny from all
</LimitExcept>
</Directory>

#--最終行にでも追加--
TraceEnable Off
※「GET」を有効にすると「TRACE」も有効になっていまいます。そのため、「TRACE」は「TraceEnable」で無効化します。「TraceEnable」が使えるApacheのバージョンは、2.0.55以降、2.2以降であれば問題ないです。それ以外は、mod_rewriteなどで制御します。

ここでは、ドキュメントルート「/var/www/html」に制限をかけています。

(2)Apacheのリロード
[root@example2 ~]# service httpd configtest
Syntax OK
[root@example2 ~]# service httpd reload
httpd を再読み込み中:

(3)クライアントに「libwww-perl」をインストール
[root@example ~]# yum -y install perl-libwww-perl perl-Crypt-SSLeay
※「perl-Crypt-SSLeay」をインストールする理由は、SSLサイトでも使えるようにするため。

(4)クライアントから「GET」「POST」を実行
・GET
[root@example ~]# GET http://example2.com/index.html
<html>
<title>TEST</title>
<body>
This is Test Page.
</body>
</html>
・Webログ
[root@example2 ~]# tail -f /var/log/httpd/access_log
192.168.0.241 - - [18/Mar/2012:16:54:45 +0900] "GET /index.html HTTP/1.1" 200 69 "-" "lwp-request/5.827 libwww-perl/5.833"
ステータス200が返ってきています :-)

・POST
[root@example ~]# POST -f http://example2.com/index.html
<html>
<title>TEST</title>
<body>
This is Test Page.
</body>
</html>
・Webログ
[root@example2 ~]# tail -f /var/log/httpd/access_log
192.168.0.241 - - [18/Mar/2012:16:56:19 +0900] "POST /index.html HTTP/1.1" 200 69 "-" "lwp-request/5.827 libwww-perl/5.833"
ステータス200が返ってきています :-)

(5)クライアントから「PROPFIND」「OPTIONS」「TRACE」を実行
・PROPFIND
[root@example ~]# GET -f -m PROPFIND http://example2.com/index.html 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /index.html
on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at example2.com Port 80</address>
</body></html>
・Webログ
[root@example2 ~]# tail -f /var/log/httpd/access_log
192.168.0.241 - - [18/Mar/2012:16:58:51 +0900] "PROPFIND /index.html HTTP/1.1" 403 290 "-" "lwp-request/5.827 libwww-perl/5.833"
ステータス403が返ってきています :-)

・OPTIONS
[root@example ~]# GET -f -m OPTIONS http://example2.com/index.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /index.html
on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at example2.com Port 80</address>
</body></html>
・Webログ
[root@example2 ~]# tail -f /var/log/httpd/access_log
192.168.0.241 - - [18/Mar/2012:17:00:21 +0900] "OPTIONS /index.html HTTP/1.1" 403 290 "-" "lwp-request/5.827 libwww-perl/5.833"
ステータス403が返ってきています :-)

・TRACE
[root@example ~]# GET -f -m TRACE http://example2.com/index.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>405 Method Not Allowed</title>
</head><body>
<h1>Method Not Allowed</h1>
<p>The requested method TRACE is not allowed for the URL /index.html.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at example2.com Port 80</address>
</body></html>
・Webログ
[root@example2 ~]# tail -f /var/log/httpd/access_log
192.168.0.241 - - [18/Mar/2012:17:01:32 +0900] "TRACE /index.html HTTP/1.1" 405 311 "-" "lwp-request/5.827 libwww-perl/5.833"
ステータス405が返ってきています :-)

参考文献
1. http://httpd.apache.org/docs/2.2/ja/mod/core.html#limitexcept


3月 18, 2012 at 4:59 pm by 黒ぶちメガネ
Category: Apache, Linux