コンテンツにスキップ

LDAP認証の仕組み

mod_authnz_ldapは、ユーザー名からLDAPエントリを検索し、見つかったユーザーDNと入力されたパスワードでBindして認証する。


mod_authnz_ldapは、LDAPをBasic認証の認証プロバイダーとして使用し、LDAP属性やグループによる認可機能を提供する。

mod_ldapは、LDAPサーバーへの接続、TLS、接続プール、検索結果や認証結果のキャッシュを提供する。LDAP認証を使うときは両方のモジュールが関係する。

mod_auth_basic
-> mod_authnz_ldap
-> mod_ldap
-> LDAP server

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は、LDAPサーバーとユーザー検索条件をまとめて指定する。

ldap://host:port/basedn?attribute?scope?filter

ldap://ldap.example.comは接続先LDAPサーバーを表す。ポートを省略したldap://はTCP 389を使う。

ou=people,dc=example,dc=comなど、ユーザー検索を開始するDNを指定する。検索範囲をユーザー格納位置に限定すると、別のサブツリーにある同名属性を検索対象から外せる。

uidなど、クライアントが入力したユーザー名と照合する属性を指定する。検索結果が一意になる属性を選ぶ。

検索範囲を指定する。

  • oneは、Base DNの直下にあるエントリだけを検索する。
  • subは、Base DN自身とその配下にあるすべてのエントリを検索する。

AuthLDAPURLで指定できるscopeはoneとsubである。LDAP検索自体に存在するbaseはこのディレクティブではサポートされず、指定しても既定のsubとして処理される。

(objectClass=posixAccount)など、検索対象を限定する追加フィルターを指定する。Apacheは追加フィルターと、入力されたユーザー名の条件をANDで組み合わせて検索する。


AuthLDAPURLのURLの後ろには、接続方式を指定できる。

AuthLDAPURL "ldap://ldap.example.com/..." NONE

NONEは、TCP 389のLDAP接続をTLSへ昇格しない。Simple Bindのパスワードを含むLDAP通信は暗号化されない。

AuthLDAPURL "ldap://ldap.example.com/..." STARTTLS

STARTTLSは、TCP 389へ接続した後、同じ接続をTLSへ昇格する。ApacheとLDAPサーバーの間で送る検索用資格情報とユーザーBindの資格情報をTLSで保護できる。

WebクライアントとApache間のHTTPSと、ApacheとLDAPサーバー間のStartTLSは別の通信区間を保護する。


LDAPTrustedGlobalCertは、LDAPサーバー証明書を検証するときに信頼するCA証明書を指定する。サーバー全体の設定で使用する。

LDAPTrustedGlobalCert CA_BASE64 "/etc/apache2/ldap/ca.crt"

CA_BASE64は、PEM形式のCA証明書を読み込む指定である。LDAPサーバー証明書を発行したCAの証明書を指定する。


LDAPVerifyServerCert Onは、LDAPサーバー証明書の検証を有効にする。既定値もOnである。

証明書検証では、信頼するCAへ証明書チェーンをたどれること、証明書の有効期間、接続先名とSANの一致などが重要になる。検証を無効化して接続するのではなく、CA、証明書チェーン、SAN、名前解決、時刻を確認する。


LDAPサーバーがユーザー検索を匿名で許可しない場合は、検索専用アカウントを使う。

AuthLDAPBindDN "cn=readonly,dc=example,dc=com"
AuthLDAPBindPassword "search-account-password"

AuthLDAPBindDNは検索時にBindするDN、AuthLDAPBindPasswordはそのパスワードである。このアカウントには、ユーザー検索に必要なDNと属性だけを読めるACLを与える。

検索用パスワードはApache設定ファイルに記録されるため、root以外から読み取れないファイル権限にする。


Require valid-userは、LDAP検索とユーザーBindに成功したすべてのユーザーを許可する。

mod_authnz_ldapは、特定ユーザー、LDAPグループ、属性、フィルターで認可するRequire ldap-user、Require ldap-group、Require ldap-attribute、Require ldap-filterなども提供する。

認証と認可の違いは認証と認可を参照する。


mod_ldapはLDAP接続と認証・検索結果をキャッシュする。LDAP側でパスワード、ロック状態、グループなどを変更しても、Apacheのキャッシュ期間中は即座に反映されない場合がある。

LogLevelは、モジュールごとにログレベルを指定できる。

LogLevel warn authnz_ldap:debug ldap:debug

authnz_ldap:debugは検索・認証側、ldap:debugはLDAP接続側の詳細を増やす。debugは切り分け時だけ使用し、確認後は通常のログレベルへ戻す。



  • mod_authnz_ldap LDAPの検索・Bind、AuthLDAPURL、LDAP認可。

  • mod_ldap LDAP接続、TLS、証明書検証、接続プール、キャッシュ。