Apache 2.4 特定のIPアドレス以外Basic認証をかける方法

# 概要

- Apache2.4にて特定のIP以外からのアクセスではBasic認証をかける方法をまとめる。

# 情報

- 下記の方法を用いてAWSのEC2に建てたWordPressの環境にBasic認証を付与した。

https://qiita.com/miriwo/items/cd3fc5a22eab999414c4

# やりたいこと

- 自身が個人開発しているアプリケーションで、自分のPCのパブリックIPアドレスからのアクセスではBasic認証をかけない。
- 自分のPCのパブリックIPアドレス以外のIPアドレスからのアクセスではBasic認証をかける。

# 方法

1. EC2にsshで接続し、下記コマンドを実行しhttpd.confを開く。

    ```shell
    sudo vi /etc/httpd/conf/httpd.conf
    ```

1. Basic認証付与時に追記したDirectoryディレクティブを修正する。
1. 下記の様に修正する。

    ```/etc/httpd/conf/httpd.conf
    <Directory "/var/www/html">
        AuthType Basic
        AuthName "Restricted Files"
        # (Following line optional
        AuthBasicProvider file
        AuthUserFile /usr/local/apache/passwd/passwords
        Require ip XXX.XXX.XXX.XXX
        Require user Basic認証ウインドウで入力するユーザー名
    </Directory>
    ```

1. `Require ip XXX.XXX.XXX.XXX`を追記しただけである。
1. あとは下記コマンドを用いてApacheを再起動すればhttpd.confの設定が反映される。

    ```shell
    sudo systemctl restart httpd
    ```

1. また、自身のIPパブリックIPアドレスは下記の「確認くん」などで確認する事ができる。

https://www.ugtop.com/spill.shtml

# 余談

- 本記事と同じ要件を満たそうとして「特定のIPアドレス以外 Basic認証」などと検索すると、.htaccessを用いたRequiredディレクティブの記載の知見が多くヒットする。
- ただ、公式ドキュメントによると.htaccessはサーバの主設定ファイル（今回で言うhttpd.conf）にアクセスできない場合のみ記載すべきであり.htaccessの使用は極力避けるべきである旨が記載されている。（パフォーマンス面からみてもhttpd.confを一つだけ読み込めばOKなものと複数の設定ファイルを読みに行くのでは微々たる差ではあるが後者のほうが処理が早い）
    - [https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html](https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html)

        :::note warn        
        一般的に、サーバの主設定ファイルにアクセスできない場合を除いて、 .htaccess ファイルの使用は極力避けてください。 世の中には、例えば、ユーザ認証は常に .htaccess ファイルで 行なわなければならない、という誤解が広まっていますが、まったくそんなことは ありません。ユーザ認証の設定はサーバ主設定ファイルに書くことができ、 実際、その方がより良い設定方法です。
        
        .htaccess ファイルはコンテンツ提供者がディレクトリ毎の 設定を行ないたいけれど、サーバシステムの root アクセス権限を持っていない という場合にのみ使うべきものです。サーバ管理者が頻繁に設定変更を行ないたくは ない、というときには個々のユーザが .htaccess ファイルを使って 自分で設定の変更を行なうことを許可した方が良いときもあるでしょう。 これは特に、ISP が複数のユーザのサイトを一つのマシンでホストしていて、 各ユーザが設定の変更をできるようにしたいようなときにあてはまります。
        
        しかし、普通は可能であれば .htaccess ファイルの使用は 避けてください。.htaccess ファイルに書こうと考えるような すべての設定は、サーバの主設定ファイルの <Directory> セクションで同じように行なうことが できます。
        
        .htaccess ファイルの使用を避ける理由は主に二つあります。
        
        一つ目はサーバの性能の問題です。AllowOverride ディレクティブが .htaccess ファイルの設定を許可している場合は、Apache は 各ディレクトリで .htaccess ファイルを探します。 ですから、.htaccess ファイルを許可すると、実際に使用しているか どうかに関わらず、性能の低下を招くことになります! また、.htaccess ファイルは文書がリクエストされる度に読み込まれます。
        
        さらに、Apache は適用すべきディレクティブを集めるために、すべての 上位のディレクトリの .htaccess ファイルを探す必要があることにも 注意してください。(ディレクティブが適用される方法を 参照してください。)ですから、/www/htdocs/example にある ファイルがリクエストされたときは、Apache は以下のファイルを調べます。
        
        /.htaccess
        /www/.htaccess
        /www/htdocs/.htaccess
        /www/htdocs/example/.htaccess
        
        ですから、そのディレクトリのそれぞれのファイルへのアクセスに対して、 上の例のファイルがまったく存在しないときでも、追加のファイルシステムの アクセスが行なわれることになります。(これは、.htaccess が / に対して有効になっているときの場合で、普通はそうなって いないことに注意してください。)
        
        二つ目はセキュリティです。ユーザにサーバの設定を変更することを 許可することになりますので、あなた自身が管理できない変更をされる 恐れがあります。ユーザにこの特権を与えるのが良いのかどうか、十分 検討してください。また、ユーザに与える権限が必要なものよりも少なすぎると、 余分な技術サポート報告を受け取るようになる可能性が高いことにも 注意してください。確実に、ユーザにどの程度の権限を与えたか明確に告げるように してください。AllowOverride に 何を設定したかということと、関連する文書を示すことで、 後々の混乱をぐっと減らすことが できます。
        
        ところで、ディレクティブの書かれた .htaccess を /www/htdocs/example に置くことと、同じディレクティブを 主サーバ設定の Directory セクション <Directory /www/htdocs/example> に書くことは 完全に等価です:
        
        /www/htdocs/example の .htaccess ファイル:
        
        /www/htdocs/example の .htaccess ファイルの 内容
        AddType text/example .exm
        
        httpd.conf のセクション file
        <Directory /www/htdocs/example>
        AddType text/example .exm
        </Directory>
        
        しかし、この設定はサーバ設定ファイルに書いた方がパフォーマンスの 低下が少なくなります。ファイルがリクエストされる度に 読み込まれる代わりに、Apache の起動時に 1 回だけ読み込めば よくなるからです。
        
        AllowOverride ディレクティブの 値を none に設定することで .htaccess ファイル の使用を完全に無効にすることができます
        :::

# 参考文献

https://httpd.apache.org/docs/2.4/ja/mod/mod_authz_core.html#require

https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html