Nginx でIPアドレスによるアクセス制御を行う

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回は、Nginx をインストールして、Basic認証 をかけてみました。今回は、IPアドレスでのアクセス制限をしてみます。

EC2の場合、セキュリティグループでもアクセス制限が出来ますが、今回は Nginx の機能を使います。
そのため、セキュリティーグループで、80ポートに対して 0.0.0.0/0 を許可をしておきます。

sg

nginx.conf の構成

具体的な設定を記述する前に、nginx.conf の構成について少し見てみます。
nginx.conf の設定は以下のようなディレクティブの集まりで出来ています。

worker_processes 1;

ディレクティブは Nginx の各モジュールによって導入されていて、
モジュールを有効にすることによって、そのモジュールで提供しているディレクティブが利用可能になります。
ディレクティブは各モジュールに対するブロックの中に記述します。
※ただし、Main モジュールは例外で設定ファイルのルート部分に記述します。

Nginx の基本的なモジュールは大きく分けて、以下の4つのモジュールがあります。

  • Mainモジュール: プロセス管理やセキュリティなどの基本機能を提供します。
  • Eventsモジュール: ネットワーク機能の内部メカニズムを設定します。
  • Configurationモジュール: ファイルのインクルードを実現します。

  • HTTPモジュール: HTTPサーバの基本ブロック、ディレクティブ、変数を格納しているコンポーネントです。

それぞれの定義箇所は以下の通りです。

(Mainモジュールのディレクティブを定義)

events {
  eventsブロック(Eventsモジュールのディレクティブを定義)
}

http {
  httpブロック(HTTPモジュールのディレクティブを定義)
}

httpブロックは、更に以下のような階層構造を持ちます。

http {
  server {
    serverブロック(Webサイトごとの設定を定義)
    location {
      locationブロック(Webサイトの特定の位置にだけに適用される設定を定義)
    }
  }
}

Configurationモジュールは、includeディレクティブを使って、下記のようにファイルのインクルードを行うだけのモジュールです。

include /file/path.conf;

IPアドレスでのアクセス制御

nginx でIPアドレスでのアクセス制御を行う場合は、HttpAccessモジュールを使用します。

以下のように記述します。

location /blog/ {
  allow xxx.xxxx.xxx.xxx;  
  deny all;
}

上記の場合、/blog/ パスには xxx.xxx.xxx.xxx のIPアドレスのみ許可して、それ以外からのアクセスは拒否するという形になります。

Nginx のルールは基本的にトップダウンで処理されます。

Apache の場合は、以下のように Order deny,allow のように順番を指定できました。

Order deny,allow
Deny from all 
Allow from xxx.xxx.xxx.xxx

上記だと、xxx.xxx.xxx.xxx を許可し、それ以外を拒否するという意味になりますが、
Nginx ですと、以下のように書いた場合は、(xxx.xxx.xxx.xxx を含み)すべてアクセス不可になってしまいます。

location /blog/ {
  deny all;
  allow xxx.xxx.xxx.xxx;
}

逆も同様で、以下のように書いた場合は、(xxx.xxx.xxx.xxx を含み)すべてアクセス可ということになります。

location /blog/ {
  allow all;
  deny xxx.xxx.xxx.xxx;
}

ちなみに、このディレクティブは、server、http ブロックでも使用可能です。

設定を反映させるために、リロードします。

$ sudo service nginx reload

指定されたIPアドレス以外からアクセスすると 403 となりました。

403 Forbidden

以上、簡単ではありますが、Basic認証 に続いて、IPアドレスによるアクセス制限をやってみました。
次回は、gzip圧縮とExpiresヘッダーについて書いてみたいと思います。

参考URL

http://wiki.nginx.org/HttpAccessModule