メールアドレスで認証を振り分ける〜複数組織の認証を組み合わせたい〜
2026年01月14日 水曜日
CONTENTS
認証をnginx用にちょっと弄れる機能〜認証だってrewriteしたい〜の続き記事です。
ngx_auth_mod開発者のヒラマツです。
ここではメールアドレス形式で、複数の認証システムを組み合わせて認証をしたい方に、ngx_auth_modの新機能の用途を解説します。
複数の認証システムを組み合わせたい理由には、以下のようなものがあります。
- 認証が必要な資料を異なる組織で共有したい。
- 合併した組織の認証をすぐに用意したい。
- 組織の組み合わせが状況に応じて変わるので、認証を簡単には統合できない。

シングルサインオン(SSO)などの認証統合は、認証システムの入れ替えや部署間の調整が必要で、導入の手間がかかります。しかし、ngx_rewrite_switch_authを使って認証システムを呼び分ければ、既存の認証システムを流用できて、この手間を軽減してくれます。
メールアドレスのドメインが組織毎に違うのであれば、以下の図のようにメールアドレスで所属組織がわかります。

メールアドレスで所属組織が判れば、以下の図のようにngx_rewrite_switch_authで所属組織に対応する認証モジュールを呼び分けることができます。

この方法はサイト単位に少しずつ導入可能ですし、既存の認証システムも残せるので、組織間の調整も楽になりそうです。

設定手順の概略
以後はnginxでの具体的な設定を説明します。実際に使用する際に活用してください。
メールアドレスのドメインで認証モジュールを呼び分ける設定を、以下の順で説明します。
- 各ドメイン用の認証モジュールを用意する
- ngx_rewrite_switch_authの設定をする
- (必要であれば)認証結果キャッシュの設定をnginxに追加する
この後の説明では、以下のような構成を想定して説明します。利用する環境に合わせて、適宜読み替えてください。

1. 各ドメイン用の認証モジュールを用意する

事前準備として、各ドメイン用(各組織用)の認証を準備します。
ngx_http_auth_request_module用の認証モジュールであれば利用できますが、新規に作るのは本末転倒なので、うまく既存の認証システムを流用してください。
例えば、以下の2つの方法は流用部分が多いので、実用的です。
- ngx_rewrite_authで、既存サイトのBASIC認証を流用する。
- 隣のサイトへ認証を丸投げ〜認証を管理したくない〜の記事でこの方法を説明しています。
- ngx_auth_mod経由でLDAP認証を利用する。
- ngx_auth_modの「はじめに」のドキュメントで基本的な使い方を説明しています。
2. ngx_rewrite_switch_authの設定をする

ngx_rewrite_switch_authに、メールアドレスにマッチする正規表現で、ドメインごとの呼び分けとアカウント名の抽出を設定します。
設定例は、ドメイン毎に以下のような内容になります。
| ドメイン | 抽出用の正規表現 | 認証モジュールURL |
|---|---|---|
| example.com | ^([^@]+)@example\.com$ |
http://127.0.0.1:9300 |
| example.org | ^([^@]+)@example\.org$ |
http://127.0.0.1:9400 |
| example.jp | ^([^@]+)@example\.jp$ |
http://127.0.0.1:9500 |
以下は、この内容でのngx_rewrite_switch_auth設定例です。
socket_type = "tcp" socket_path = "127.0.0.1:9200" cache_seconds = 15 neg_cache_seconds = 2 use_etag = true auth_realm = "Select Authentication" [[switch]] username_re = '^([^@]+)@example\.com$' auth_url = "http://127.0.0.1:9300" set_username = "$1" set_password = "$p" # $pにはリクエストから受け取ったパスワードが設定される [[switch]] username_re = '^([^@]+)@example\.org$' auth_url = "http://127.0.0.1:9400" set_username = "$1" set_password = "$p" [[switch]] username_re = '^([^@]+)@example\.jp$' auth_url = "http://127.0.0.1:9500" set_username = "$1" set_password = "$p"
この設定例で利用しているパラメータごとに、設定内容の概要を説明しておきます。パラメータ自体の詳細については、ngx_rewrite_switch_authドキュメントも参照してください。
| パラメータ名 | 概要 |
|---|---|
socket_type、socket_path |
TCPソケットの127.0.0.1:9200で機能を提供 |
cache_seconds |
認証成功時のキャッシュ期間(15秒) |
neg_cache_seconds |
認証失敗結果のキャッシュ期間(2秒) |
use_etag |
ETagおよびIf-None-Matchヘッダーを使った検証を有効化(nginxがHTTPキャッシュの検証で利用) |
auth_realm |
BASIC認証の認証領域名(“Select Authentication”) |
[[switch]]のusername_re |
メールアドレスから@より前の部分(ローカル部)を取り出す正規表現(取得したアカウント名は$1に保存) |
[[switch]]のauth_url |
username_reにマッチしたときに呼び出す認証モジュールのURL |
[[switch]]のset_username |
username_reの正規表現で取得したアカウント名を渡す($1) |
[[switch]]のset_password |
リクエストから受け取ったパスワード($p)をそのまま渡す |
[[switch]]部分のパラメータは、対応するドメイン名の数だけ記述する必要があります。
ngx_rewrite_switch_authの起動は、ngx_auth_modの他のモジュールと同様でsystemdなどで行います。
具体的な起動方法についてはngx_auth_modの「はじめに」で紹介していますので、そちらを参照してください。
3. (必要であれば)認証結果キャッシュの設定をnginxに追加する
認証モジュールの負荷軽減が必要な場合は、nginxで認証結果をキャッシュする設定をします。
nginxで認証結果をキャッシュする方法の詳細は、応用編: nginxで認証結果をキャッシュしたい〜認証処理の負荷を下げたい〜で解説したので参照してください。
設定手順の説明は以上です。
複数組織間の認証を手軽に構築して、より快適な情報共有ライフを!