Restricting Access


Restricting Access

このセクションでは、webサイトまたはその一部へのアクセスを制約(特定のIPアドレスまたは認証済みのユーザにアクセスを許可する)する方法、アクセスを制限する方法、接続のリクエスト数の最大数を設定する方法(あるいは、サーバからコンテンツをダウンロードする最大レート)を説明します。

Restricting Access

クライアントのIPアドレスまたはHTTP Basic 認証を使って、アクセスを許可あるいは拒否します。

あるアドレスのセット、あるいは全てのアドレスからのアクセスを許可または拒否するには、allowdeny ディレクティブを使います。

location / {
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny 192.168.1.2;
    deny all;
}

認証を有効にするには、auth_basicディレクティブを使います。ユーザはwebサイトにアクセスするために、正しいユーザ名とパスワードを入力する必要があるでしょう。ユーザ名とパスワードはauth_basic_user_file ディレクティブで指定されたファイルに列挙されている必要があります。

server {
    ...
    auth_basic "closed website";
    auth_basic_user_file conf/htpasswd;
}

offパラメータが付いた auth_basicディレクティブは、他の設定レベルからの影響をキャンセルします。例えば、サイト全てへのアクセスを制限しているが、幾つかのlocationは公に利用することができる:

server {
    ...
    auth_basic "closed website";
    auth_basic_user_file conf/htpasswd;

    location /public/ {
        auth_basic off;
    }
}

IPアドレスと認証による制限を組み合わせるには、satisfy ディレクティブを使います。デフォルトでは、allに設定され、クライアントがアクセスを許可されるには両方の条件を満たす必要があります。satisfy ディレクティブがany に設定された場合、少なくとも一つの条件が満たされた場合にアクセスが許可されます。従って、認証されていないユーザのIPアドレスが許可されたIPアドレスに含まれる場合はアクセスすることができます。しかしながら、アクセスが拒否されているIPアドレスからのユーザは、ユーザ名とパスワードが正しい場合にアクセスすることができます。次の例はlocationへのアクセスを制限するための二つのメソッドを組み合わせる方法を示します。

location / {
    satisfy any;

    allow 192.168.1.0/24;
    deny  all;

    auth_basic           "closed site";
    auth_basic_user_file conf/htpasswd;
}

アクセスの制限

以下を制限することができます:

  • キーの値ごとの接続数(例えば、IPアドレスあたり)
  • キーの値ごとのリクエストレート(秒または分あたりで処理することができるリクエスト数)
  • 接続のダウンロード速度

IPアドレスはNATデバイスの後ろで共有することができ、IPアドレスの制限は慎重に使われる必要があることに注意してください。

接続数の制限

接続数の制限をするには、まずlimit_conn_zone ディレクティブを使って共有メモリ領域のキーの定義とパラメータの設定をします(workerプロセスはこの領域を使ってキー・値のためのカウンターを共有するでしょう)。最初のパラメータとして、キーとして評価される表現を指定します。二つ目のパラメータには、領域の名前とそのサイズを指定します。

limit_conn_zone $binary_remote_address zone=addr:10m;

次に、limit_conn ディレクティブを使って、loction内、バーチャルサーバ、あるいはhttpコンテキストの全体に対して制限を適用します。最初のパラメータとして共有メモリ領域の名前を指定し、二つ目のパラメータにキーあたりに許可された接続の数を指定します。

location /download/ {
    limit_conn addr 1;
}

ここで、$binary_remote_address 変数がキーとして使われているため、接続数はIPアドレスベースで制限されます。指定されたサーバへの接続数は、$server_name 変数を使って制限することができます:

http {
    limit_conn_zone $server_name zone=servers:10m;

    server {
        limit_conn servers 1000;
    }
}

リクエストレートの制限

リクエストレートを制限するには、まず limit_req_zone ディレクティブを使ってカウンターを保持するためにキーと共有メモリ領域を設定します。

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

キーはlimit_conn_zoneと同じようにして指定されます。rate パラメータは、リクエスト毎秒 (r/s)またはリクエスト毎分(r/m)で指定することができます。後者は1リクエスト毎秒未満のレートを指定するために使われます。例えば、秒間あたり半分のリクエストのレートを設定するには、パラメータを30r/mに設定します。

まず共有メモリ領域が設定されてから、リクエストレートを制限するためにバーチャルサーバまたはlocation(または必要であればグローバル)にlimit_req ディレクティブを使います。

location /search/ {
    limit_req zone=one burst=5;
}

これで、NGINXはこのlocationで秒間あたり1つ以上のリクエストを処理しないでしょう。レートを超えると、制限を越えたリクエストはキューに配置され、全体のレートが指定値より大きくならないように処理が遅延されます。burst パラメータは処理されるまでに待つリクエストの最大数を設定します。burst 制限より多いリクエストについては、NGINXは503エラーを返すでしょう。

burstの間遅れるのがまずい場合は、nodelay フラグを追加します。

limit_req zone=one burst=5 nodelay;

帯域の制限

接続あたりの帯域を制限するには、limit_rate ディレクティブを使います:

location /download/ {
    limit_rate 50k;
}

この設定によりクライアントは一つの接続を通して秒間あたり50キロバイトの最大スピードでコンテンツをダウンロードすることができます。しかしながら、クライアントは複数の接続を開くことができます。そういうわけで、目的がダウンロードスピードが指定した値より大きくなることを防ぐことであれば、接続数も制限されるべきです。例として、IPアドレスあたり一つの接続(上で指定された共有メモリゾーンが使われた場合):

location /download/ {
    limit_conn addr 1;
    limit_rate 50k;
}

クライアントがある量のデータをダウンロードした後で制限を課すには、limit_rate_after ディレクティブを使います。クライアントがある量のデータ(例えば、ファイルのヘッダ - フィルムのインデックス)をすばやくダウンロードするのを許可し、残りのデータ(ユーザにダウンロードではなくフィルムを見せる)のダウンロードのレートを制限する事には意味があります。

limit_rate_after 500k;
limit_rate 20k;

次の例では接続数と帯域を制限する設定の組み合わせを示します。接続の最大許可数は1クライアントあたり5接続です。最新のブラウザは一般的に一度に3つまで接続を開くため、これはもっともよく適合するでしょう。一方でdownloadを提供するlocationは一つの接続だけのみ許可します。

http {
    limit_conn_zone $binary_remote_address zone=addr:10m

    server {
        root /www/data;
        limit_conn addr 5;

        location / {
        }

        location /download/ {
            limit_conn addr 1;
            limit_rate 1m;
            limit_rate 50k;
        }
    }
}
TOP
inserted by FC2 system