Apache 2.4で、IPアドレスによるアクセス制限とBasic認証を両方必須にしたいことがあります。例えば、管理用ページを社内の接続元からだけ開けるようにし、さらにユーザー名とパスワードでも保護する構成です。

1、Requireを並べるだけではOR条件になる
Require ip 203.0.113.10
Require valid-user

Apache 2.4では、同じ設定範囲に複数のRequireを単純に並べると、原則として<RequireAny>と同じOR条件になります。そのため、この書き方では「許可したIPからのアクセス」または「Basic認証に成功したアクセス」のどちらか一方で通過する可能性があります。

2、RequireAllでAND条件にする
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/apache2/auth/users.htpasswd

<RequireAll>
    Require ip 203.0.113.10
    Require valid-user
</RequireAll>

<RequireAll>で囲むと、指定したIPアドレスからアクセスし、かつBasic認証にも成功した場合だけ許可されます。上記の203.0.113.10は説明用の予約アドレスなので、実際には許可したい接続元IPに置き換えます。複数IPやCIDR形式の指定も可能です。AuthUserFileは公開ディレクトリの外に置きます。

同じ設定はApacheの<Directory>内や、必要なAllowOverride設定が有効な.htaccessでも使えます。既存のBasic認証設定がある場合、AuthTypeなどは重複させず、Require部分を変更すれば十分です。

3、動作確認
apachectl configtest
# 設定ファイルを変更した場合は必要に応じて
sudo systemctl reload apache2

# 許可IPと、それ以外の回線の両方から確認
curl -I -u testuser https://www.example.com/private/

許可IPからBasic認証成功ならアクセス可、許可IPから認証失敗ならアクセス不可、許可IP以外なら認証に成功してもアクセス不可となることを、接続元の異なる回線で確認します。HTTPステータスは状況により401や403などになります。なお、.htaccessだけを変更した場合は通常Apacheの再読込は不要です。

4、リバースプロキシ経由には注意

ロードバランサーやリバースプロキシの背後では、Apacheが受け取る接続元IPがプロキシのIPになることがあります。その場合はmod_remoteip等を適切に設定し、信頼するプロキシのみから転送されるクライアントIPを扱います。単に外部から送られたX-Forwarded-Forを信用する設定は避けます。IPv6を利用する環境では、許可すべきIPv6アドレスも別途確認します。

参考:Apache HTTP Server 2.4 / mod_authz_core、Apache 2.4への移行ガイド。