Apacheで不要なHTTPメソッドでのアクセスを制限する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

最近はRESTなAPIなどを提供するWebサービスが増えてきたりしていますが、それでも不要なHTTPメソッドを利用させることはサービス上のリスクになるケースもあるため、制限をかけたほうが良かったりもします。

ということで、Apacheで特定のHTTPメソッドしか利用させない方法のまとめです。



Apacheで特定のHTTPメソッドを利用できなくする


制限方法は、Apacheの設定ファイル(/etc/httpd/conf/httpd.confなど)に下記のようにLimitExceptディレクティブ を追加します。


<Directory "/path/to/apache/docroot">
  AllowOverride All
  <LimitExcept GET POST>
     Order deny,allow
     Deny from all
  </LimitExcept>
</Directory>

上記の制限をかけることでApacheのドキュメントルート以下に対してGETとPOSTのHTTPメソッドしか受け付けなくなります。

Locationディレクティブ内に記述することも可能ですので、その他の制限事項とあわせて書き方を選ぶと良いかもしれません。


また、Limitディレクティブ でも制限を掛けることはできるようですが、こちらはマニュアルに記載のとおり対象のメソッドにのみ制限を書けるため、書いていないメソッドの制限がスルーされてしまいます。

LimitExceptは書いているメソッドに対して制限をかけるのでそれ以外のメソッドを受け付けないという書き方ができます。


制限がうまくかけられたかは他のサーバーなどからcurlコマンドなどを使って実際にそのHTTPメソッドでアクセスして反応を確認するのがよいでしょう。


・ 利用可能なGETメソッドを使ってアクセスしてみる


$ curl http://foo.example.com -X GET

<html>
<head>
<title>Your Site</title>
</head>
<body>
hello wolrd!
</body>
</html>

・ 利用できないPUTメソッドを使ってアクセスしてみる


$ curl http://foo.example.com -X PUT

<!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 /
on this server.</p>
</body></html>

アクセスできない場合、403(Forbidden)が返って来て制限できていることがわかります。


ただ、この方法ではTRACEメソッドは制限できません。

GETメソッドを許可するとTRACEも許可されてしまうようです。

TRACEメソッドを制限かけたい場合は以前に書いた「ApacheでTRACEメソッドを受付けなくする 」を参考にしてみてください。