Apacheで特定のIPアドレスからのアクセス拒否をしよう
Apacheでのアクセス制御を求められた際、設定ファイルの書き方をしっかり知らないと、許可したいIPからアクセスできなくなったり、既存の設定が効かなくなってしまったりという問題が発生したりします。
今回は特定IPのアクセス拒否の依頼なので/から入れなくする様に設定する手順を作成しました。
まずApacheの評価順から。
・Apacheにはディレクティブという大枠で設定を記載する。ディレクティブごとに評価順が異なり、「Directory」ディレクティブはパスの短い順に評価される。これに対して、「Location」ディレクティブは設定ファイルの記載順に評価されることになる。
・vhosts用の設定ファイルを用意した場合、vhosts用の設定ファイルでも記載している項目についてはvhostsに記載した内容で上書きされる。
・DirectoryとLocationだと、Locationが後に評価される
とても参考になった記事はこちら↓
koseki.hatenablog.com
公式サイトはこちら↓ httpd.apache.org
これに注意して手順を作成しよう。
手順は以下。この様に拒否IPを設定するのと一緒に、確認のための拒否IP(切り替え可能なWifiのIPとか)を設定し、確認のためのIPからのURLアクセスがきちんと拒否されているかを確認すると良い。
作業手順
1. バックアップ作成
cp -p /etc/httpd/conf.d/sample.jp.conf /etc/httpd/conf.d/sample.jp.conf.20200213
2. 設定変更
以下の内容を追加する。検証用として確認のためのIPも追加する。
<Directory /> Order allow,deny Allow from all Deny from IP1 ※ 拒否したいIP Deny from IP2 ※ 確認のためのIP </Directory>
vhosts用の設定ファイルを以下の内容に変更する
SetEnvIf CloudFront-Forwarded-Proto "https" HTTPS RequestHeader set X-Forwarded-Port 443 env=HTTPS RequestHeader set X-Forwarded-Proto "https" env=HTTPS <VirtualHost *:80> ServerName sample.jp ServerAlias www.sample.jp DocumentRoot /var/www/html/sample.jp ErrorLog /var/log/httpd/sample.jp-error_log CustomLog /var/log/httpd/sample.jp-access_log combined ErrorDocument 503 /common/error_maintenance.html RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.sample\.jp$ RewriteRule ^(.*) https://sample.jp$1 [R=301,L] RewriteCond /opt/aaa/conf/sample.sample.jp.maint.flag -f RewriteCond %{REMOTE_ADDR} !^<特定IP> RewriteCond %{REMOTE_ADDR} !^<特定IP> RewriteCond %{REQUEST_URI} !=/common/error_maintenance.html RewriteCond %{REQUEST_URI} !^.*\.(js|css|gif|jpg|png|ico)$ RewriteRule .* - [R=503,L] <Directory /> Order allow,deny Allow from all Deny from IP1 Deny from IP2 </Directory> <Directory "/var/www/html/sample.jp"> AllowOverride All # AuthUserfile /var/www/.htpasswd # AuthGroupfile /dev/null # AuthName "Please enter the User ID and password" # AuthType Basic # require valid-user </Directory> <Location /sample-control> order deny,allow deny from all allow from <特定IP>/32 allow from <特定IP>/32 </Location> </VirtualHost> <VirtualHost *:80> ServerName localhost DocumentRoot /var/www/html/sample.jp ErrorLog /var/log/httpd/sample.jp-error_log CustomLog /var/log/httpd/sample.jp-access_log combined <Directory "/var/www/html/sample.jp"> AllowOverride All </Directory> </VirtualHost>
3. 設定反映
以下コマンドを実行し設定を反映させる
$ apachectl graceful
4. 確認
下記のURLにアクセスできることを確認する(ドキュメントルートへのアクセス確認)
<本番環境> https://sample.jp/