Nginx 振り分け処理とアクセス制御

Nginx の設定について、前回触っていない項目をいじってるメモ。

目次

allow と deny

/etc/nginx/conf.d/allow_deny.confを以下のように作成します。

/etc/nginx/conf.d/allow_deny.conf
1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name _;
error_page 404 /404.html;
root /usr/share/nginx/html;

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

http://[サーバーのグローバルIPアドレス]に手元の PC とキャリア回線接続のスマートフォンでそれぞれアクセス。
前者の時は 403 が返ってくることが確認できます。

しかし、ロードバランサーを介した場合、判断されるのが中継したロードバランサーの IP になってしまいます。
$http_x_forwarded_forによって判定できるように工夫します。

/etc/nginx/conf.d/allow_deny.confを以下のように直します。

/etc/nginx/conf.d/allow_deny.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
map $http_x_forwarded_for $local {
default 0;
~\s*xxx.xxx.xxx.xxx$ 1;
}


server {
listen 80;
server_name _;
error_page 404 /404.html;
root /usr/share/nginx/html;

location / {
if ( $local ){
return 403;
}
}
}

http://[ロードバランサーで割り当てたドメイン]に手元の PC とキャリア回線接続のスマートフォンでそれぞれアクセス。
前者の時は 403 が返ってくることが確認できます。
ロードバランサーによる中継前のアドレスでアクセス制御できました。
結果として、$http_x_forwarded_forを使うとき、allow と deny を使わないことになってしまいました。

条件に合致したら basic 認証

以前、nginx での basic 認証を試していました。
条件に合致した時だけ、basic 認証を要求するようにしてみます。

/etc/nginx/conf.d/if_basic.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
map $http_x_forwarded_for $local {
default off;
~\s*xxx.xxx.xxx.xxx$ "user1";
}

server {
listen 80;
server_name _;
error_page 404 /404.html;
root /usr/share/nginx/html;

location / {
auth_basic $local;
auth_basic_user_file /etc/nginx/passwords/.password_basic;
}
}

http://[ロードバランサーで割り当てたドメイン]に手元の PC とキャリア回線接続のスマートフォンでそれぞれアクセス。
前者の時は、認証要求画面が出ることを確認できます。
auth_basicに対して、offを渡すと basic 認証がかからないことから、このように記述できます。


nginx でアクセス元の IP アドレスをベースにしたアクセス制御を試みてみました。

ではでは。