LDAP (Lightweight Directory Access Protocol) is an application-layer protocol defined by the IETF that enables clients to search, read, and modify entries in hierarchical directory services over IP networks, commonly used for user authentication and identity data lookups via TCP connections to directory servers. The protocol operates on a client-server model where clients connect to a directory server, authenticate through bind operations, and send requests such as search, compare, add, modify, and delete operations, with data organized as a tree of entries identified by distinguished names and access controlled by server-side rules. Security and operational reliability depend heavily on proper configuration including encrypted connections (TLS on port 636 or StartTLS on port 389), least-privilege service accounts, certificate validation, redundant servers, and protection against LDAP injection attacks, as outages or misconfigurations can block logins across entire organizations that depend on centralized directory access.
LDAPの仕組み
LDAPはクライアント・サーバーモデルを採用しており、クライアントがディレクトリサーバーへの接続を確立し、認証を行った後、操作を送信すると、サーバーは結果と共に応答を返します。ディレクトリデータはエントリのツリー構造として整理されており、各エントリは識別名(DN)によって識別されます。
- 接続:クライアントはディレクトリサーバーへのTCP接続を確立します。通常はポート389を使用しますが、最初からTLSを使用する場合はポート636を使用します。
- セッションのセキュリティ確保:ポート 389 では、クライアントは StartTLS 操作を実行して、認証情報を送信する前に接続を暗号化されたものへとアップグレードすることができます。
- バインド:クライアントは認証のためにバインド要求を送信します。シンプルバインドでは識別名とパスワードが送信されますが、SASLバインドでは他の認証メカニズムがサポートされています。匿名バインドでは認証情報は送信されません。
- 送信操作:クライアントは、検索、比較、追加、変更、削除、またはDNの変更などのリクエストを送信します。検索では、ベースエントリ、スコープ、フィルタ、および返す属性を指定します。
- 結果の受信:サーバーは、各リクエストに対して一致するエントリと結果コードを返します。1つの接続で複数のリクエストが未処理の状態になることがあります。
- アンバインド:クライアントがアンバインド要求を送信すると、接続が切断されます。
上記の手順では、クライアントがサーバーをどのように見つけるか、またデータの一貫性がどのように保たれるかについては説明していません。クライアントは多くの場合、DNSのSRVレコードを通じてサーバーを特定し、ディレクトリサーバーは通常、相互にデータをレプリケートしますが、レプリケーションはコアプロトコルの機能ではありません。エントリや属性へのアクセスは、サーバー側のアクセス制御ルールによって管理されます。
LDAPの一般的な問題
StartTLS を使用せずにポート 389 で構成されたアプリケーションは、バインド DN とパスワードを暗号化せずに送信するため、パケットキャプチャや監査記録にそれらが記録されてしまいます。StartTLS またはポート 636 に切り替え、保護されていないセッションでのシンプルバインドを拒否してください。
ディレクトリサーバーの証明書が、クライアントが信頼していないCAによって署名されている場合、有効期限が切れている場合、または接続に使用されるホスト名が記載されていない場合、クライアントは「発行者が信頼できない」や「名前の不一致」などのエラーを報告します。証明書名ではなくIPアドレスを使用して接続することが、よくある原因です。
検索ベース、スコープ、またはフィルタがディレクトリツリーと一致しないため、検索結果にエントリが表示されないか、誤ったエントリが表示されることがあります。ディレクトリの再構築後など、認証情報が正しいにもかかわらずログインに失敗することがよくあります。
パスワードの有効期限が切れている、または変更されたアプリケーションのバインドアカウントは、繰り返し再試行を行い、最終的にロックアウトされてしまいます。これにより、そのアカウントに依存するすべてのログインが機能しなくなります。サービスアカウントからのバインド失敗を監視することで、この問題を早期に検知できます。
クライアントを1台のディレクトリサーバーに集中させると、そのサーバーの再起動やネットワーク障害が発生しただけで、すべての場所でのログインがブロックされてしまいます。複数のサーバーを使用するか、負荷分散された名前を使用し、それらのDNSレコードが正しく解決されるようにしてください。