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/