メールアドレスで認証を振り分ける〜複数組織の認証を組み合わせたい〜

2026年01月14日 水曜日


【この記事を書いた人】
ヒラマツ

セキュリティ本部 セキュリティ情報統括室に所属 システム開発者。2000年問題で「2038年問題は定年で対応しなくていい!」とフラグを...。

「メールアドレスで認証を振り分ける〜複数組織の認証を組み合わせたい〜」のイメージ

認証をnginx用にちょっと弄れる機能〜認証だってrewriteしたい〜の続き記事です。

ngx_auth_mod開発者のヒラマツです。

ここではメールアドレス形式で、複数の認証システムを組み合わせて認証をしたい方に、ngx_auth_modの新機能の用途を解説します。

複数の認証システムを組み合わせたい理由には、以下のようなものがあります。

  • 認証が必要な資料を異なる組織で共有したい。
  • 合併した組織の認証をすぐに用意したい。
  • 組織の組み合わせが状況に応じて変わるので、認証を簡単には統合できない。
認証の統合が難しいイメージ

シングルサインオン(SSO)などの認証統合は、認証システムの入れ替えや部署間の調整が必要で、導入の手間がかかります。しかし、ngx_rewrite_switch_authを使って認証システムを呼び分ければ、既存の認証システムを流用できて、この手間を軽減してくれます。

メールアドレスのドメインが組織毎に違うのであれば、以下の図のようにメールアドレスで所属組織がわかります。

ドメイン名判断のイメージ

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

email認証呼び分けのイメージ

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

認証を呼び分ける良いイメージ


設定手順の概略

以後はnginxでの具体的な設定を説明します。実際に使用する際に活用してください。

メールアドレスのドメインで認証モジュールを呼び分ける設定を、以下の順で説明します。

  1. 各ドメイン用の認証モジュールを用意する
  2. ngx_rewrite_switch_authの設定をする
  3. (必要であれば)認証結果キャッシュの設定をnginxに追加する

この後の説明では、以下のような構成を想定して説明します。利用する環境に合わせて、適宜読み替えてください。

構成例

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

構成例1

事前準備として、各ドメイン用(各組織用)の認証を準備します。

ngx_http_auth_request_module用の認証モジュールであれば利用できますが、新規に作るのは本末転倒なので、うまく既存の認証システムを流用してください。
例えば、以下の2つの方法は流用部分が多いので、実用的です。

  1. ngx_rewrite_authで、既存サイトのBASIC認証を流用する。
  2. ngx_auth_mod経由でLDAP認証を利用する。

2. ngx_rewrite_switch_authの設定をする

構成例2

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_typesocket_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で認証結果をキャッシュしたい〜認証処理の負荷を下げたい〜で解説したので参照してください。


設定手順の説明は以上です。

複数組織間の認証を手軽に構築して、より快適な情報共有ライフを!

ヒラマツ

2026年01月14日 水曜日

セキュリティ本部 セキュリティ情報統括室に所属 システム開発者。2000年問題で「2038年問題は定年で対応しなくていい!」とフラグを...。

Related
関連記事