株式会社エスロジカル
株式会社エスロジカル
SSL証明書(DV、OV、EV)、セキュリティ、Web開発、Linux開発、Go言語

HOME > 技術ドキュメント > Nginx アクセス制御入門

Nginx アクセス制御入門(Basic認証・IP制限・レート制限)


HTTPS 化したサイトでも、管理画面・API エンドポイント・特定パスへのアクセスを制限することで 不正アクセスのリスクを大きく下げられます。
本ドキュメントでは Nginx の代表的なアクセス制御機能として、 Basic認証・IP制限・レートリミットの設定方法を解説します。

動作確認環境:Ubuntu 24.04 LTS / Nginx 1.24


Basic認証はユーザー名とパスワードで特定の location を保護します。 パスワードファイルの作成には apache2-utilshtpasswd コマンドを使います。

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

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;
}

limit_req_zonelimit_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 バースト内のリクエストを即時処理(遅延なし)。省略するとキュー待ちになる

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;
    }
}

実際の管理画面では複数の制御を組み合わせます。

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トークンを組み合わせることで 強固な多層防御が構成できます。


# 構文チェック
sudo nginx -t

# 設定の反映(無停止)
sudo systemctl reload nginx

# レートリミットが発動しているか確認(429 / 503 が出るか)
curl -o /dev/null -s -w "%{http_code}\n" https://example.com/api/test

Basic認証を含むアクセス制御は、通信が HTTPS で暗号化されていることが前提です。 HTTP のまま Basic認証を使うと、パスワードが平文で盗聴されます。
エスロジカルではデジサート・サイバートラストの正規取扱代理店として、 2009年から16年以上、RapidSSL 3,960円/1年(税込)〜でSSL証明書を販売しています。審査サポート・インストール代行も対応しています。

SSL証明書の購入はこちら / SSL証明書とは? / Nginx SSL/TLS 設定


← 技術ドキュメント一覧へ戻る