LDAP認証の仕組み
mod_authnz_ldapは、ユーザー名からLDAPエントリを検索し、見つかったユーザーDNと入力されたパスワードでBindして認証する。
mod_authnz_ldapとmod_ldap
Section titled “mod_authnz_ldapとmod_ldap”mod_authnz_ldapは、LDAPをBasic認証の認証プロバイダーとして使用し、LDAP属性やグループによる認可機能を提供する。
mod_ldapは、LDAPサーバーへの接続、TLS、接続プール、検索結果や認証結果のキャッシュを提供する。LDAP認証を使うときは両方のモジュールが関係する。
mod_auth_basic -> mod_authnz_ldap -> mod_ldap -> LDAP server検索・Bindの流れ
Section titled “検索・Bindの流れ”sequenceDiagram
participant C as Web client
participant A as Apache HTTP Server
participant L as LDAP server
C->>A: HTTPS request without credentials
A-->>C: 401 Basic challenge
C->>A: HTTPS request + Basic credentials
alt Anonymous search is allowed
A->>L: LDAP search for uid
else Search Bind is required
A->>L: LDAP Bind as search account
A->>L: LDAP search for uid
end
L-->>A: Unique user DN
A->>L: LDAP user bind with submitted password
L-->>A: Bind success or failure
A-->>C: HTTP 200 or 401
Apacheは、入力されたユーザー名をAuthLDAPURLの検索属性と追加フィルターへ組み込み、LDAP検索を行う。
検索結果が0件なら該当ユーザーが存在しない。複数件なら認証対象のDNを一意に決められない。1件だけ見つかった場合は、そのエントリのDNとクライアントが入力したパスワードでLDAP Bindする。
検索用BindとユーザーBindは目的が違う。検索用BindはユーザーDNを見つけるために使い、ユーザーBindは入力されたパスワードが正しいか確認するために使う。
AuthLDAPURL
Section titled “AuthLDAPURL”AuthLDAPURLは、LDAPサーバーとユーザー検索条件をまとめて指定する。
ldap://host:port/basedn?attribute?scope?filterhostとport
Section titled “hostとport”ldap://ldap.example.comは接続先LDAPサーバーを表す。ポートを省略したldap://はTCP 389を使う。
basedn
Section titled “basedn”ou=people,dc=example,dc=comなど、ユーザー検索を開始するDNを指定する。検索範囲をユーザー格納位置に限定すると、別のサブツリーにある同名属性を検索対象から外せる。
attribute
Section titled “attribute”uidなど、クライアントが入力したユーザー名と照合する属性を指定する。検索結果が一意になる属性を選ぶ。
検索範囲を指定する。
oneは、Base DNの直下にあるエントリだけを検索する。subは、Base DN自身とその配下にあるすべてのエントリを検索する。
AuthLDAPURLで指定できるscopeはoneとsubである。LDAP検索自体に存在するbaseはこのディレクティブではサポートされず、指定しても既定のsubとして処理される。
filter
Section titled “filter”(objectClass=posixAccount)など、検索対象を限定する追加フィルターを指定する。Apacheは追加フィルターと、入力されたユーザー名の条件をANDで組み合わせて検索する。
NONEとSTARTTLS
Section titled “NONEとSTARTTLS”AuthLDAPURLのURLの後ろには、接続方式を指定できる。
AuthLDAPURL "ldap://ldap.example.com/..." NONENONEは、TCP 389のLDAP接続をTLSへ昇格しない。Simple Bindのパスワードを含むLDAP通信は暗号化されない。
AuthLDAPURL "ldap://ldap.example.com/..." STARTTLSSTARTTLSは、TCP 389へ接続した後、同じ接続をTLSへ昇格する。ApacheとLDAPサーバーの間で送る検索用資格情報とユーザーBindの資格情報をTLSで保護できる。
WebクライアントとApache間のHTTPSと、ApacheとLDAPサーバー間のStartTLSは別の通信区間を保護する。
LDAPTrustedGlobalCert
Section titled “LDAPTrustedGlobalCert”LDAPTrustedGlobalCertは、LDAPサーバー証明書を検証するときに信頼するCA証明書を指定する。サーバー全体の設定で使用する。
LDAPTrustedGlobalCert CA_BASE64 "/etc/apache2/ldap/ca.crt"CA_BASE64は、PEM形式のCA証明書を読み込む指定である。LDAPサーバー証明書を発行したCAの証明書を指定する。
LDAPVerifyServerCert
Section titled “LDAPVerifyServerCert”LDAPVerifyServerCert Onは、LDAPサーバー証明書の検証を有効にする。既定値もOnである。
証明書検証では、信頼するCAへ証明書チェーンをたどれること、証明書の有効期間、接続先名とSANの一致などが重要になる。検証を無効化して接続するのではなく、CA、証明書チェーン、SAN、名前解決、時刻を確認する。
AuthLDAPBindDNとAuthLDAPBindPassword
Section titled “AuthLDAPBindDNとAuthLDAPBindPassword”LDAPサーバーがユーザー検索を匿名で許可しない場合は、検索専用アカウントを使う。
AuthLDAPBindDN "cn=readonly,dc=example,dc=com"AuthLDAPBindPassword "search-account-password"AuthLDAPBindDNは検索時にBindするDN、AuthLDAPBindPasswordはそのパスワードである。このアカウントには、ユーザー検索に必要なDNと属性だけを読めるACLを与える。
検索用パスワードはApache設定ファイルに記録されるため、root以外から読み取れないファイル権限にする。
LDAP認可とRequire
Section titled “LDAP認可とRequire”Require valid-userは、LDAP検索とユーザーBindに成功したすべてのユーザーを許可する。
mod_authnz_ldapは、特定ユーザー、LDAPグループ、属性、フィルターで認可するRequire ldap-user、Require ldap-group、Require ldap-attribute、Require ldap-filterなども提供する。
認証と認可の違いは認証と認可を参照する。
キャッシュとログ
Section titled “キャッシュとログ”mod_ldapはLDAP接続と認証・検索結果をキャッシュする。LDAP側でパスワード、ロック状態、グループなどを変更しても、Apacheのキャッシュ期間中は即座に反映されない場合がある。
LogLevelは、モジュールごとにログレベルを指定できる。
LogLevel warn authnz_ldap:debug ldap:debugauthnz_ldap:debugは検索・認証側、ldap:debugはLDAP接続側の詳細を増やす。debugは切り分け時だけ使用し、確認後は通常のログレベルへ戻す。
-
mod_authnz_ldap LDAPの検索・Bind、
AuthLDAPURL、LDAP認可。 -
mod_ldap LDAP接続、TLS、証明書検証、接続プール、キャッシュ。