<div class="alert text-white bg-warning">
    注意: この記事は未完成です
</div>

# LDAP攻略への道

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

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

## 初心者に優しくない
今回少しだけ LDAP を触って見たところ、LDAP は初心者が一人で勉強して運用できるようになるにはかなり時間がいると思いました。理由は
- 専門用語が多すぎる
- ドキュメントはあることにはあるがいろんな情報が錯乱してて正確な操作を見つけ出すのが困難
- 可視化できたらイメージしやすいのに十分に可視化できるツールがない
    - 根元の権限設定などをする場合特に
    - phpldapadmin はそこまで頼りにならない
- ldif ファイル実行時の結果が反映されてるのかわかりづらい

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

## LDAP の基礎

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

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

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

![image.png](/attachment/5e48b2571ec5e4004811d4eb)

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

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

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

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

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

| 変数名            | 略称 | 意味                                           | 例(TODO:上図に追加)                  |
| ----------------- | ---- | ---------------------------------------------- | ------------------------------------ |
| Distinguish Name  | dn   | オブジェクト（後述）の識別子（上記の経路の例） | dn: cn=user1,ou=male,dc=team1,dc=org |
| Common Name       | cn   | 一般名、人（ツリーでいう葉っぱ）               | cn: user1                            |
| Domain Component  | dc   | ドメイン構成要素、分類、所属（ツリーでいう幹） | dc: team1                            |
| Organization Unit | ou   | 組織単位、グループ                             | 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
    - 権限もしくは
- 属性がない
- 

---

## Page Navigation

- Canonical URL: https://tips.weseek.co.jp/開発日記/LDAP攻略への道
- Permalink: https://tips.weseek.co.jp/5e48b2561ec5e4004811d4e9
- Parent: [開発日記](/5e3d294bcff797004b16abba.md)
- Children: 0 total
- Total descendants: 0
- Siblings: 20 total
  - [GROWIのAPIを使用したアプリケーション](/5e5bd0e3e7f8db0048df3a08.md)
  - [GitとGitHubの違い](/5e417dcadecd0a0049953ad7.md)
  - [Migrationsファイルを作成する](/5e9d1dc7b682620049e55a64.md)
  - [QiitaでGROWIが設計書システムとして紹介されました](/5e535a04eb17ce0048b9fb13.md)
  - [UserManagement](/65069da24603e7ff39a6b3d2.md)
  - [aタグ以外での画面遷移](/5e9cfd51b682620049e55a5d.md)
  - [jestを使ったテストを初実装しました](/5ef1ed225eea4b004a1912b2.md)
  - [npm とyarn の違いを簡単に説明](/5e3e6822591d7f0048b3cc5e.md)
  - [react-card-flipを使って回転するカードレイアウトを作る](/5ebaa05ad3055000488bd526.md)
  - [throttleでスクロールイベントを間引く](/5e8de43931511b0048ecf612.md)
  - [vuepressのテンプレート内で二重波括弧をエスケープ](/5f16ecf4c2f6150048b2955b.md)
  - [なぜsetStateをComponentDidMountで使用してはいけないのか](/5eb7728458c8ea00480d0825.md)
  - [アジャイルとウォーターフォール](/5e4137d343c1c400499b6bac.md)
  - [セルフレビューはどこまで確認しようか](/5e3d2adfcff797004b16abbe.md)
  - [ソート機能の実装](/5e8aadc15245e70048c22c7c.md)
  - [タスクを円滑にこなすために必要な垂れ流しとは](/5e47a18a927c020048448a18.md)
  - [ページ内リンクの実装](/5e93c9d511007300489677ff.md)
  - [レビュー依頼する際に確認すること](/5e3ae41225751e00499297f6.md)
  - [動作確認用にページをたくさん作りたい](/5f80326633588b0048eaf865.md)
  - [間違えてマージしてさらにプッシュしちゃった](/5e9d176db682620049e55a60.md)
- Last updated: 2020-03-04T01:29:09.987Z by deleted_at_1672138409189
- Full page listing (all children regardless of count): https://tips.weseek.co.jp/_api/v3/page-listing/children?id=5e48b2561ec5e4004811d4e9
