はじめに
LDAP認証について理解深めるために備忘録として残します。画像はAIで生成しております。
LDAP認証
LDAP(Lightweight Directory Access Protocol)は、
ユーザー情報(ID、パスワード、部署、メールアドレスなど)を
ディレクトリサーバで一元管理するためのプロトコルのこと
LDAP のデータ構造(DIT:Directory Information Tree)
LDAP はツリー構造(DIT)で情報を管理している
dc=example,dc=com
├── ou=People
│ ├── uid=taro
│ └── uid=hanako
└── ou=Groups
├── cn=admin
└── cn=dev
-
dc: ドメインを構成する要素 -
ou: 部署・組織 -
uid: ユーザーID -
cn: グループ名
ユーザーは DN(Distinguished Name) で一意に識別されている。
例:
uid=taro,ou=People,dc=example,dc=com
LDAP認証フロー
一般的なLDAP認証は以下の2段階らしい
サービスアカウント(Bind DN)でBindし、ユーザーDNを検索
アプリケーションは DN を知らないため検索が必要
- アプリが Bind DN(サービスアカウント)でBind
-
uid=taroを条件に検索(Search) - ユーザーの DN を取得
例:uid=taro,ou=People,dc=example,dc=com
ユーザーDN と パスワードで Bind(認証)
- 取得したユーザーDN とユーザー入力パスワードを使って再Bind
- LDAP サーバが内部でパスワード照合
- 成功(OK)または失敗(NG)を返す
- アプリが結果をユーザーに返す
パスワードの保存と照合の仕組み
LDAP に保存される userPassword 属性には、以下のような形式が入る
{SSHA}3ShFja1df90sdf...
代表的な方式:
{SHA}-
{SSHA}(Salted SHA:ソルト付き) {MD5}{CRYPT}-
{PBKDF2}(新しいOpenLDAPなど)
- LDAP のパスワード照合は以下のようにしているよう
- クライアントはパスワードをそのまま送る(※TLS必須)
- LDAPサーバが
保存されている方式に合わせて ハッシュ + ソルト処理を実施 - 保存値と一致するか比較
- 一致すれば認証成功
まとめ
- ユーザー情報は階層構造(DIT)で管理され、DN で一意に識別される
- 認証は 「サービスアカウントで検索してDNを取得」→「ユーザーDNでBindして認証」 の2段階
- パスワード照合は LDAPサーバ側でハッシュ+ソルトを用いて実施
- Simple Bind は必ず TLS/LDAPS とセットで使う
参考記事
