Apache2.4でIP制限をする方法(RequireAny、RequireNone、RequireAll)
-
カテゴリ:
- サーバ
Apache2.4の環境に対して、特定のIPアドレスをブロックする設定方法をここにメモしておきます。
別サーバで運用しているWordPressのブログが頻繁に攻撃を受けていて、アクセスに負荷がかかているので対処していきます。
怪しい接続先(IPアドレス)を特定して、IPフィルタリングをする流れです。
怪しい接続先(IPアドレス)を特定する
まず自分のWEBサイトにアクセスしているIPアドレスを確認するため、Apacheのアクセスログとエラーログを解析します。
ログファイルの置き場所はApacheの設定ファイル(/etc/httpd/conf/httpd.conf)に記載されていると思うので確認してみてください。
アクセスログを見る
アクセスログの場所を/etc/httpd/conf/httpd.confで確認します。
CustomLog log/access.log
×××.×××.×××.××× - - [日付] リクエストの内容
という形式で記述されているかと思います。(×××はIPアドレス)
この中で同じIPアドレスが複数回怪しげなリクエストを長ているものを抽出します。
※[注意点]IPアドレスのWhois情報
注意として、アクセスログの中にはGoogleやMSNのクローラーボットも含まれているので、誤ってIPアドレスをブロックしてしまうとインデックスされなくなる事態になりかねません。
それを防ぐために、以下のサイトからWhois情報を確認するようにしましょう。
https://www.cman.jp/network/support/ip.html
エラーログを見る
エラーログの場所をhttpd.confで確認します。
ErrorLog log/err.log
エラーログから攻撃を仕掛けているIPアドレスを確認します。
エラーログに出ているものは基本怪しいですが、特にWordpressで注意したいのが「xmlrpc.php」です。
「xmlrpc.php」の脆弱性をついて、Dos攻撃の踏み台にされることがるので、「xmlrpc.php」に関するエラーがあったIPアドレスを抽出しておきます。
IPアドレスを制限する
怪しげなIPアドレスを抽出できたら、今度のそのIPアドレスからのアクセスをブロックする設定をしておきます。
設定はhttpd.conf、または.htaccessに対して行います。
設定前のディレクティブは以下の通り。
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride ALL
Require all granted
</Directory>
これに対して、IPアドレスをブロックするには以下のように記述してください。
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride ALL
<RequireAll>
Require all granted
Require not ip ×××.×××.×××.××× #(←×はIPアドレス)
Require not ip ×××.×××.×××.×××
・・・・・・
</RequireAll>
</Directory>
※[注意点]ディレクティブの設定
ここで注意点として、以下のように設定しますとApacheの再起動にエラーになってしまいます。
<Directory /var/www/html>
Options FollowSymLinks
AllowOverride ALL
Require all granted
Require not ip ×××.×××.×××.×××
Require not ip ×××.×××.×××.×××
・・・・・・
</Directory>
エラー
sample.com systemd[1]: Starting The Apache HTTP Server...
sample.com httpd[4659]: AH00526: Syntax error on line 70 of /etc/httpd/conf/httpd.conf:
sample.com httpd[4659]: negative Require directive has no effect in <RequireAny> directive
sample.com systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
sample.com kill[4661]: kill: cannot find process ""
sample.com systemd[1]: httpd.service: control process exited, code=exited status=1
sample.com systemd[1]: Failed to start The Apache HTTP Server.
sample.com systemd[1]: Unit httpd.service entered failed state.
sample.com systemd[1]: httpd.service failed.
これはディレクティブタグの設定が間違っていたことで発生します。
ディレクティブには以下の3種類があります。
- <RequireAny> ~ </RequireAny> : 指定したIPアドレスを許可する
- <RequireNone> ~ </RequireNone> : 指定したIPアドレスを拒否する
- <RequireAll> ~ </RequireAll> : 指定したIPアドレスを許可、または拒否する
ポイントとして、ディレクティブタグを指定しないと暗黙的に<RequireAny>が設定されます。
つまり、何も指定しないことで<RequireAny>が適用され、IPアドレスを許可することだけ可能な箇所にIP制限の「Require not ip」を記載したことで矛盾が生じ、エラーになったかたちです。
そのため<RequireAll>で囲った中にIP制御をするように設定しましょう。
以上です。