nginxのauth request moduleに、LDAPのbind処理の結果を流用して認証と、ヘッダーに設定したパス情報を元にした認可を提供するモジュールです。
エラー時は、プロセスが異常ステータスで終了します。
コマンドラインは、以下の通りです。
ngx_ldap_path_auth 設定ファイル名
自前ではdaemon化等のバックグラウンド実行の機能は提供しません。
systemd等のプロセス管理のシステムから起動してください。
LDAPの情報で認証ユーザを制限したい場合は、LDAPのsearch処理のフィルタを使って(uniq_filterの設定)、工夫してください。
パスごとの認可処理が必要ない場合は、ngx_ldap_authを使用してください。
nginx側の設定方法については、auth request moduleのドキュメントを参照してください。
ngx_ldap_path_authの設定ファイルは、TOMLフォーマットで、以下がサンプルです。
socket_type = "tcp"
socket_path = "127.0.0.1:9201"
#cache_seconds = 0
#use_etag = true
auth_realm = "TEST Authentication"
path_header = "X-Authz-Path"
[ldap]
host_url = "ldaps://ldap.example.com"
start_tls = 0
#skip_cert_verify = 0
root_ca_files = [
"/etc/ssl/certs/Local-CA-Chain.cer",
]
base_dn = "DC=group,DC=example,DC=com"
bind_dn = "CN=%s,OU=Users,DC=group,DC=example,DC=com"
uniq_filter = "(&(objectCategory=person)(objectClass=user)(memberOf=CN=Group1,DC=example,DC=com)(userPrincipalName=%[email protected]))"
timeout = 5000
[authz]
user_map_config = "/etc/ngx_auth_mod/usermap_config.conf"
user_map = "/etc/ngx_auth_mod/usermap.conf"
path_pattern = "^/([^/]+)/"
nomatch_right = "@admin"
default_right = "*"
[authz.path_right]
"test" = "@dev"
設定ファイルの各パラメータの意味は以下のとおりです。
パラメータ名 | 意味 |
---|---|
socket_type | tcp(TCPソケット)とunix(Unixドメインソケット)が指定できます。 |
socket_path | tcpの場合はIPアドレスとポート番号、unixの場合はソケットファイルのファイルパスを指定します。 |
cache_seconds | nginxに渡すキャッシュ期間の秒数です。ただし、その値が0の場合、キャッシュを利用しなくなります。 詳細については認証キャッシュ制御を参照してください。 |
use_etag | true に設定するとETag タグを使ったキャッシュの検証を行なうようになります。詳細については認証キャッシュ制御を参照してください。 |
auth_realm | HTTPのrealmの文字列です。 |
path_header | 認可処理の使うパスを設定するHTTPヘッダーです。デフォルト値はX-Authz-Path です。nginxの設定ファイルの適切な箇所で、proxy_set_header X-Authz-Path $request_uri; などのように、ヘッダーの値を設定してください。 |
パラメータ名 | 意味 |
---|---|
host_url | LDAPサーバの接続アドレスのURLです。パス部 分は利用しません。 |
start_tls | TLSのStartTLSを利用する場合は1を指定します。 |
skip_cert_verify | 証明書のチェック結果を無視する場合は1を指定します。 |
root_ca_files | CA証明書のPEMファイルのリストです。LDAPサーバが、プライベートCAによる証明書を利用している時に使います。 |
base_dn | LDAPサーバに接続するときのbase DNです。 |
bind_dn | LDAPのbind処理を行う時に使うbind DNです。%sが含まれているとリモートユーザ名を埋め込みます。%%が含まれていると%に変換します |
uniq_filter | 設定された場合、bind処理のあとこの値をフィルターに指定してsearch処理が実施されます。その結果応答されたDNが1つだった場合以外は、認証の失敗として扱います。この値を指定しない場合は、bind処理の結果だけで判定が行われます。 |
timeout | LDAPサーバとの通信に利用するタイムアウト時間(単位はms)です。 |
パラメータ名 | 意味 |
---|---|
user_map_config | user_mapでの、ユーザ名とグループ名の扱いを指定するファイルです。ファイルの書式は別途説明します。 |
user_map | ユーザ名とグループ名のマッピングファイルです。ファイルの書式は別途説明します。 |
path_pattern | path_headerのヘッダで渡されたパス情報から認可判定を行う文字列を抽出する正規表現です。抽出された文字列は、path_rightで権限を指定するために使われます。() の正規表現を1つだけ使って、認可権限の判断に使う文字列部分を指定してください。抽出箇所の指定に() の正規表現を1回だけ使ってください。 |
nomatch_right | path_patternの正規表現のマッチが失敗した場合の認可権限です。認可権限の詳細は、「認可権限の詳細」の説明を見てください。 |
default_right | path_patternの正規表現のマッチが成功し、かつ、path_rightに該当のキーが無い場合の、認可権限です。認可権限の詳細は、「認可権限の詳細」の説明を見てください。 |
path_right | path_patternの正規表現のマッチに成功したときの、抽出文字列ごとの認可権限の設定です。抽出文字列をキーとして指定します。認可権限の詳細は、「認可権限の詳細」の説明を見てください。 |
[authz]のnomatch_right、default_right、path_rightのテーブルの各要素の値は、以下の判定処理の記述を|で結合した文字列を指定します。結合された判定処理は、倫理和(or)で計算します。結果が真の場合は、認可されます。
認可方法 | 意味 |
---|---|
空文字 | ユーザー名に関係なく真と判断します。 |
! |
ユーザ名に関係なく偽と判断します。 |
* |
ユーザ名が存在すれば、真と判断します。 |
@グループ名 |
@の後ろをグループ名として扱い、そのグループにユーザが含まれる場合に真と判断します。グループはuser_mapファイルで定義します。 |
@ |
(@のみ、グループ名無し) user_mapファイルに利用者のユーザ名が記述されていれば、真と判断します。 |
ユーザ名 | 利用者のユーザ名と一致する場合に真と判断します。 |
user_mapは、ユーザとグループを定義するテキストファイルを指定します。 このテキストファイルは、以下のように、各行にユーザ名と所属グループ名(無し及び複数も可能)を記述して、ユーザ名とグループ名のマッピングを表現します。
ユーザ名1:グループ名1 グループ名2 ...
...
ユーザ名とグループ名の間は:
で区切ります。グループ名が複数の場合は
(空白文字)で区切ります。:
と
(空白文字)をユーザ名やグループ名で使いたいときは、\
でエスケープします。
user_map_configは、ユーザ名とグループ名の扱いを定義するファイルです。
許容されるユーザ名とグループ名を、以下のように、正規表現で表現します。
user_regex = '^[a-z_][0-9a-z_\-]{0,32}$'
group_regex = '^[a-z_][0-9a-z_\-]{0,32}$'
パラメータ名 | 意味 |
---|---|
user_regex | ユーザ名として許可する文字列の正規表現です。 |
group_regex | グループ名として許可する文字列の正規表現です。 |