注意: この記事は未完成です

LDAP攻略への道

はじめに

LDAP は「単なるツリー構造のデータベースを利用した認証方式」といった点では、シンプルで簡単に思えます。ただ拡張機能がありすぎる(らしい)ためにその設定が複雑に感じたり、略語が多かったりと、実際に扱ってみようとすると初心者としてはなかなか慣れにくいものだと思います。

そこで今回は LDAP 初心者が、どうすれば LDAP を攻略できるようになるかを勉強しながら書いていきます。

初心者に優しくない

今回少しだけ LDAP を触って見たところ、LDAP は初心者が一人で勉強して運用できるようになるにはかなり時間がいると思いました。理由は

  • 専門用語が多すぎる
  • ドキュメントはあることにはあるがいろんな情報が錯乱してて正確な操作を見つけ出すのが困難
  • 可視化できたらイメージしやすいのに十分に可視化できるツールがない
    • 根元の権限設定などをする場合特に
    • phpldapadmin はそこまで頼りにならない
  • ldif ファイル実行時の結果が反映されてるのかわかりづらい

なので上記でお困りの方にこの記事が役立てばと思いながら書いてきます。

LDAP の基礎

まずはイメージを掴みましょう。

LDAP は ツリー構造のデータベースを利用した認証方式です。これにつきます。

ツリー構造というのは↓こんな感じですね。根(画像上部の「会社Objective」)から幹が複数本伸びていって、幹の先には葉っぱ(画像下部)がついているような構造。

image.png

ここで大事な特徴としては、「各葉っぱには、根元からその葉っぱにたどり着くための経路がただ一つだけある」ということですね。例えば画像の一番左の個人O(bjective)に、根(会社Objective)から辿るには

会社O → 部署O → チームO → 個人O

という経路になります。チームに降りてから部署に戻るみたいな遠回りをしなければこの一通りしかありません。(この例では部署や個人に名前がつけられてないのでわかりづらいですね、あとで差し替えます💦)

LDAPでは「〇〇会社のXX部署の△△チームに所属する□□さん」という情報をたくさん持つデータベースを構築し、ある組織を表現する。そして、今ログインしようとしてるユーザーはこの会社に所属しているかを検索、判定し、認証する、という流れになります。

LDAP 用語(TBD)

やはり LDAP の世界で生きてくためにはその業界用語がわからないことには何もできません。用語ありすぎるのでほんの一部を抜粋しただけなので他は各自調べてください。

変数名略称意味例(TODO:上図に追加)
Distinguish Namednオブジェクト(後述)の識別子(上記の経路の例)dn: cn=user1,ou=male,dc=team1,dc=org
Common Namecn一般名、人(ツリーでいう葉っぱ)cn: user1
Domain Componentdcドメイン構成要素、分類、所属(ツリーでいう幹)dc: team1
Organization Unitou組織単位、グループou: male
  • Object
    • ツリーの中の葉っぱとか幹とかをオブジェクトと呼びます
  • Bind(バインド)
    • ldap ディレクトリにログインすること
  • Bind DN
    • バインド時に使用する ユーザー DN (要はログインユーザーの指定)
  • Base DN
    • バインド時のログイン先オブジェクトDN。このDNへのアクセス権限があるBindDNならバインドできる。
    • バインド後の操作の出発点はこのDNとなる(はず)
  • objectClass

実践

イメージと用語がわかったら実際に作って見ましょう

Macには標準で LDAP を使うライブラリが入ってるはず(?)なのでそれを使うやり方と、docker 上で立ち上げるやり方の2通り紹介します。どちらも openldap というライブラリを使っていて、構築自体はどちらも簡単ですが、後者は少しばかり docker の基礎知識があった方がいいので初心者には前者をお勧めします。

方法1 Mac OS の openldap を使う場合

(openldap が入ってない場合)openldap のインストール

起動

起動確認

phpldapadmin で接続

phpldapadmin を起動
ログイン
オブジェクト追加
  • posix group
  • user account

権限変更

ldif ファイルの作成
ldif ファイルの実行

cn=config について

ldap.conf

方法2 docker 上で openldap を使う場合

osixia/docker-openldap のインストールと起動

phpldapadmin で接続

方法1と同様

権限変更

docker コンテナの bash に接続

vim が入ってなければインストール
ldif ファイルの作成
ldif ファイルの実行

cn=config について

  • olcRootDN
  • olcRootPW
  • olcDatabese

失敗ログ(WIP)

  • docker で立ち上げたldapサーバーに、docker 上のphpldapadmin からは繋がるのにGrowiから接続できない
    • 原因: ローカルのポートと docker 上のldapサーバのポートを紐づけていない
    • 解決策:
  • cn=config でログインできない
    • 原因: パスワードが違う
    • 解決策: パスワードを変更する
      • tbd

ldif ファイル実行時のエラー

  • dn 指定方法
  • olcAccess no allowed
    • 権限もしくは
  • 属性がない