web-dev-qa-db-ja.com

他の場所に基本認証を適用しながらIPで場所を保護する

次の結果を達成したいと思います。

  • すべての場所、ファイル、パスに基本認証を適用する
  • IP/CIDR範囲のホワイトリストの基本認証を削除する
  • 1つのIPアドレス(上記を含む)を除くすべてのユーザーに対して、特定のディレクトリおよびその下のすべてへのすべてのアクセスを禁止します

これは私が使用しているnginx構成です:

server {
    listen 80 default;

    # Basic auth
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    satisfy any;
    # IP whitelist
    include /etc/nginx/conf.d/ip-whitelist.conf.include;
    deny all;

    # Lock down the "hello" directory to specific IP addresses
    location /hello/ {
        # Developers only - ever!
        allow 12.34.56.78;
        deny all;
    }
    # ...
}

現時点で起こっていることは、上記の箇条書きリストのポイント1と2が機能していることです。つまり、ホワイトリスト内のIPにはサイト全体で基本認証がありませんが、IPがホワイトリストに登録されていない場合は、基本認証を求められます。

ただし、「hello」のロケーションブロックは機能していないようで、「hello」ディレクトリの下にあるものすべてに対して、上記と同じ条件を許可しています。ホワイトリストに登録されたIPから/hello/world.phpにアクセスしようとすると、そのIPが提供されます。ホワイトリストに登録されていないIPからアクセスすると、基本認証が取得されます。

IP 12.34.56.78以外のすべてのユーザーが "hello"ディレクトリにアクセスできないようにしたい(例)。

何を変更する必要がありますか?

4
Robbie Averill

ご存じのとおり、サーバーレベルでの認証設定はすべての場所に適用されるため、お勧めしません。基本認証をオフにすることは可能ですが、既存のIPホワイトリストをクリアする方法はないようです。

より良い解決策は、認証を/の場所に追加して、/helloに継承されないようにすることです。

他の場所で基本的な認証とIPホワイトリストが必要な場合に問題が発生します。その場合、認証コンポーネントをインクルードファイルに移動するか、/にネストすることを検討する価値があります。

server {
    listen 80 default;

    # Lock down the "root" directory to specific IP addresses
    location / {
        satisfy any;

        # Basic auth
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;

        # IP whitelist
        include /etc/nginx/conf.d/ip-whitelist.conf.include;
        deny all;

        # Inherits auth settings from parent
        location ~ \.php$ {
            # PHP specific config
        }
    }

    # Lock down the "hello" directory to specific IP addresses
    location /hello/ {
        # Developers only - ever!
        allow 12.34.56.78;
        deny all;
    }
    # ...
}
8
robjingram