HOME > 技術ドキュメント > Nginx アクセス制御入門
Nginx アクセス制御入門(Basic認証・IP制限・レート制限)
HTTPS 化したサイトでも、管理画面・API エンドポイント・特定パスへのアクセスを制限することで
不正アクセスのリスクを大きく下げられます。
本ドキュメントでは Nginx の代表的なアクセス制御機能として、
Basic認証・IP制限・レートリミットの設定方法を解説します。
動作確認環境:Ubuntu 24.04 LTS / Nginx 1.24
1. Basic 認証(htpasswd)
Basic認証はユーザー名とパスワードで特定の location を保護します。
パスワードファイルの作成には apache2-utils の htpasswd コマンドを使います。
sudo apt install apache2-utils # パスワードファイル作成(-c は新規作成、2回目以降は省略) sudo htpasswd -c /etc/nginx/.htpasswd admin # New password: (パスワードを入力) # Re-type new password: # ユーザー追加 sudo htpasswd /etc/nginx/.htpasswd user2 # 確認 cat /etc/nginx/.htpasswd # admin:$apr1$...(ハッシュ化されたパスワード)
Nginx 設定ファイルで auth_basic を有効にします。
server {
listen 443 ssl;
server_name example.com;
# SSL 設定(省略)
# /admin 以下を Basic認証で保護
location /admin {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
}
# それ以外は認証不要
location / {
proxy_pass http://127.0.0.1:8080;
}
}
sudo nginx -t sudo systemctl reload nginx
2. IP 制限(allow / deny)
allow / deny ディレクティブで、特定の IP アドレスやサブネットのみアクセスを許可します。
ルールは上から順に評価され、最初にマッチしたルールが適用されます。
location /admin {
# 許可する IP(自社 IP や VPN のアドレスを指定)
allow 203.0.113.0/24; # 例:オフィスのサブネット
allow 198.51.100.5; # 例:特定のサーバー
allow 127.0.0.1;
# 上記以外はすべて拒否
deny all;
proxy_pass http://127.0.0.1:8080;
}
IP制限と Basic認証を組み合わせることで、二重の保護が実現できます。
location /admin {
# IP 制限(許可 IP 以外は 403)
allow 203.0.113.0/24;
deny all;
# さらに Basic認証
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
}
3. レートリミット(limit_req)
limit_req_zone と limit_req を使うことで、同一 IP からの過剰なリクエストを制限し、
ブルートフォース攻撃や DDoS の負荷を軽減できます。
# /etc/nginx/nginx.conf の http ブロック内に定義
http {
# ゾーン定義:キー = $binary_remote_addr(IP)、10MB のメモリ、1秒あたり 10 リクエスト
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
# ログイン専用の厳しい制限(1秒あたり 1 リクエスト)
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
}
server {
# API エンドポイント:バースト 20 まで許容、超過は 503
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://127.0.0.1:8080;
}
# ログイン:バースト 5 まで、超過はキュー待ち(delay 設定)
location /login {
limit_req zone=login_limit burst=5;
proxy_pass http://127.0.0.1:8080;
}
}
| パラメータ | 説明 |
|---|---|
rate=10r/s |
1秒あたり10リクエストまで許可 |
burst=20 |
瞬間的な超過をバーストとして20リクエストまで許容 |
nodelay |
バースト内のリクエストを即時処理(遅延なし)。省略するとキュー待ちになる |
4. 接続数制限(limit_conn)
limit_conn は同時接続数を制限します。ダウンロード系のエンドポイントや
重い処理に対して使います。
http {
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}
server {
location /download {
limit_conn conn_limit 5; # 同一 IP から同時5接続まで
root /var/www/files;
}
}
5. 組み合わせ設定例(管理画面の多層防御)
実際の管理画面では複数の制御を組み合わせます。
http {
limit_req_zone $binary_remote_addr zone=admin_limit:10m rate=5r/s;
}
server {
listen 443 ssl;
server_name example.com;
location /admin/ {
# ① IP 制限(社内・VPN のみ)
allow 203.0.113.0/24;
deny all;
# ② レートリミット(5r/s、バースト10)
limit_req zone=admin_limit burst=10 nodelay;
# ③ Basic認証
auth_basic "Admin";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
}
}
これら3層に加え、アプリ側でのセッション認証・CSRFトークンを組み合わせることで 強固な多層防御が構成できます。
6. 設定確認と reload
# 構文チェック
sudo nginx -t
# 設定の反映(無停止)
sudo systemctl reload nginx
# レートリミットが発動しているか確認(429 / 503 が出るか)
curl -o /dev/null -s -w "%{http_code}\n" https://example.com/api/test
SSL証明書でアクセス制御を完全に機能させる
Basic認証を含むアクセス制御は、通信が HTTPS で暗号化されていることが前提です。
HTTP のまま Basic認証を使うと、パスワードが平文で盗聴されます。
エスロジカルではデジサート・サイバートラストの正規取扱代理店として、
2009年から16年以上、RapidSSL 3,960円/1年(税込)〜でSSL証明書を販売しています。審査サポート・インストール代行も対応しています。
SSL証明書の購入はこちら / SSL証明書とは? / Nginx SSL/TLS 設定
