してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

mod_rewriteの設定例

HTTP/2やLet's Encryptを使っていると、mod_rewiteで設定すると便利になる場面がたくさんあります。

そこで、mod_rewriteの設定例を紹介していきたいと思います。

ここでの説明は、当サイトで説明したインストールするものLet's Encrypt(無償の証明書発行機関)から取得HTTP/2の各種設定といった設定例をベースにしています。

mode_rewriteの有効化

ご存じとは思いますが、念のためmod_rewriteを有効にする方法を説明します。

# vi /usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
…(省略)…
LoadModule rewrite_module modules/mod_rewrite.so ←コメント解除
…(省略)…

つづいて、以下の設定を入れます。

リクエストメソッドの制限

先日のCVE-2017-9798では、OPTIONSリクエストメソッドに関する脆弱性が発見されました。

普段から、使わないリクエストメソッドを制限しておくと、このような脆弱性を防ぐことができます。

以下の例では、GETメソッド、POSTメソッド、HEADメソッド以外はエラーとします。

# vi /usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/extra/httpd-vhosts.conf
…(省略)…
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$
RewriteRule .* - [F] </IfModule>
…(省略)…

apachctl -tで、設定ファイルの間違いが無いことを確認の上、下記のように

# /usr/local/apache2/bin/apachctl -t
Syntax OK
# /usr/local/apache2/bin/apachctl stop
# /usr/local/apache2/bin/apachctl start

再起動します。これで、GET/POST/HEAD以外のメソッドはエラーとなります。

Let's Encryptの認証用ディレクトリのみHTTPSにリダイレクトさせない。

Let's Encryptのサーバはドメイン認証の際に、HTTP/1.1⇒HTTPSのリダイレクトを経て、HTTPS側の

/.well-known/acme-challenge/

にある認証用のファイルをとってきてくれます。

そのため非暗号のHTTPに来たリクエストは、丸ごと、HTTPSに転送するようにmod_rewriteを設定してもいいのですが、HTTPSに認証用のフォルダを作成したくない時もあります。

そこで、ACME認証のみHTTPで処理し、それ以外をHTTPSに転送する設定を紹介します。

# vi /usr/local/apache2/conf/extra/httpd-vhosts.conf
/usr/local/apache2/conf/extra/httpd-vhosts.conf
…(省略)…
<VirtualHost *:80>
…(省略)…
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule>
…(省略)… </VirtualHost> …(省略)…

apachctl -tで、設定ファイルの間違いが無いことを確認の上、下記のように

# /usr/local/apache2/bin/apachctl -t
Syntax OK
# /usr/local/apache2/bin/apachctl stop
# /usr/local/apache2/bin/apachctl start

再起動します。これで、「ACMEプロトコルにおけるドメイン認証」、以外のリクエストは、80番ポートから443番ポートに飛びます。

怪しいUser-Agentのアクセスをブロックする

最近、PhantomJSなるヘッドレスブラウザを使って、Webサイトのスクリーンキャプチャだけを撮っていくと思われるアクセスが散見されるようになりました。

紙の配布資料か何かを作りたいんだとはおもいますが、どうせなら紙じゃなくて直接見に来てほしいものです。

そこで、怪しいUser-Agentからのアクセスをブロックする設定を紹介します。

設定は簡単です。以下のように数行を追加します。

# vi /usr/local/apache2/conf/extra/httpd-vhosts.conf
/usr/local/apache2/conf/extra/httpd-vhosts.conf
…(省略)…
<VirtualHost *:443
…(省略)…
    <IfModule mod_rewrite.c>
        RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} PhantomJS
RewriteRule ^(.*)$ - [F] </IfModule>
…(省略)… </VirtualHost> …(省略)…

念のため解説すると、

RewriteCondの行は、ユーザエージェント(HTTP_USER_AGENT)が、PhantomJSの文字列を含む場合に、次のRewriteRuleの置換およびオプションを実行することを意味します。

他のユーザエージェントをブロックしたい場合は、PhantomJSの文字列を、当該ユーザエージェントだけが含む文字列に変えてあげてください。

RewriteRuleの行では、^(.*)$ の部分が、全URIへのアクセスを意味します。

つまり、全URIのアクセスについて、上記RewriteCondを満たした場合、置換せず(-)に、[F]オプション、すなわち,403 Forbiddenを返すことを意味します。

 

apachctl -tで、設定ファイルの間違いが無いことを確認の上、下記のように

# /usr/local/apache2/bin/apachctl -t
Syntax OK
# /usr/local/apache2/bin/apachctl stop
# /usr/local/apache2/bin/apachctl start

再起動します。念のため、以下のコマンドで確認します。

 

まずは、正常系ということで、通常のwgetのアクセスがブロックされないか、確認します。

# wget https://example.com
--2018-MM-DD HH:MM:SS--  https://example.com
example.com (example.com) をDNSに問いあわせています... XX.XX.XX.XX
example.com (example.com)|XX.XX.XX.XX|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3925 (3.8K) [application/xhtml+xml]
`index.html' に保存中

index.html                                           100%[=====================================================================================================================>]   3.83K  --.-KB/s 時間 0s

と、通常のWgetからのアクセスはブロックないことが確認できます。

続いて、User-Agentを指定してみます。

# wget --user-agent="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1" https://example.com
--2018-MM-DD HH:MM:SS--  https://example.com
example.com (example.com) をDNSに問いあわせています... XX.XX.XX.XX
example.com (example.com)|XX.XX.XX.XX|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 403 Forbidden
2018-MM-DD HH:MM:SS エラー 403: Forbidden

期待通り、PhantomJSからのアクセスをブロックし、403 Forbiddenを返しました。

NEXT >> http/2のチューニング

©Copyrights 2015-2018, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。