DockerでOpenLDAPを動かす

# コンテナイメージの選択

[Docker Hub](https://hub.docker.com/)で`openldap`をキーワードに検索

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/221e8f9d-abc0-21a6-24f7-8d4dd6930fd1.png" width=100%>

最も人気のある以下のイメージを使用してみる。

https://hub.docker.com/r/osixia/openldap

# 環境

* ベアメタル
* Ubuntu 16.04.3
* Docker CE 19.03.12
* Docker-compose 1.26.2

# 構築

[Quick Start](https://github.com/osixia/docker-openldap#quick-start)を参考に、docker-composeを使ってインストールする。

作成したdocker-compose.yml

```yaml
version: "3.8"
services:
  openldap:
    image: osixia/openldap:1.5.0
    restart: always
    container_name: openldap
    environment:
      LDAP_ORGANISATION: "My Company"
      LDAP_DOMAIN: "my-company.com"
      LDAP_ADMIN_PASSWORD: "JonSn0w"
    ports:
    - "389:389"
    - "636:636"
    volumes:
    - "/srv/openldap/slapd/database:/var/lib/ldap"
    - "/srv/openldap/slapd/config:/etc/ldap/slapd.d"
    - "/srv/openldap/slapd/ldifs:/container/service/slapd/assets/custome" # ldifファイルの置き場として使用
```

docker-compose.ymlを使ってデプロイ

```
$ sudo mkdir -p /srv/openldap/slapd/database
$ sudo mkdir -p /srv/openldap/slapd/config
$ sudo mkdir -p /srv/openldap/slapd/ldifs
$ docker-compose up -d
Creating network "openldap_default" with the default driver
Pulling openldap (osixia/openldap:1.5.0)...
1.5.0: Pulling from osixia/openldap
45b42c59be33: Pull complete
ae7fb8f59730: Pull complete
55443d9da5d5: Pull complete
062b29194b6e: Pull complete
613ba832a7d4: Pull complete
48562e0b854d: Pull complete
3731e12f1fa4: Pull complete
b1feb4016881: Pull complete
d2744e887776: Pull complete
Digest: sha256:18742e9c449c9c1afe129d3f2f3ee15fb34cc43e5f940a20f3399728f41d7c28
Status: Downloaded newer image for osixia/openldap:1.5.0
Creating openldap ... done
$ docker-compose ps
  Name           Command         State                     Ports                   
-----------------------------------------------------------------------------------
openldap   /container/tool/run   Up      0.0.0.0:389->389/tcp, 0.0.0.0:636->636/tcp
```

ldapsearchしてみる。

```
$ docker exec openldap ldapsearch -x -b dc=my-company,dc=com -D "cn=admin,dc=my-company,dc=com" -w JonSn0w
# extended LDIF
#
# LDAPv3
# base <dc=my-company,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# my-company.com
dn: dc=my-company,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: My Company
dc: my-company

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
```

サーチ結果が返ったので、LDAPが動いているようである。

# LDAPアカウントの追加

ldifファイルの作成

```
$ docker exec openldap cp container/service/slapd/assets/test/new-user.ldif container/service/slapd/assets/custome/testuser.ldif
$ sudo -i
# cd /srv/openldap/slapd/ldifs/
# ls
testuser.ldif
# vim testuser.ldif
# cat testuser.ldif 
dn: uid=testuser,dc=my-company,dc=com
uid: testuser
cn: User
sn: Test
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
loginShell: /bin/bash
homeDirectory: /home/testuser
uidNumber: 2000
gidNumber: 2000
mail: testuser@my-company.com
gecos: "Test user"
```

アカウントの作成

```
$ docker exec openldap ldapadd -x -D "cn=admin,dc=my-company,dc=com" -w JonSn0w -f /container/service/slapd/assets/custome/testuser.ldif -ZZ
adding new entry "uid=testuser,dc=my-company,dc=com"
```

パスワード設定

```
$ docker exec openldap ldappasswd -s password -w JonSn0w -D "cn=admin,dc=my-company,dc=com" -x "uid=testuser,dc=my-company,dc=com"
```

ldapsearchを使って、作成したユーザーを確認

```
docker exec openldap ldapsearch -x -b "uid=testuser,dc=my-company,dc=com" -D "cn=admin,dc=my-company,dc=com" -w JonSn0w
# extended LDIF
#
# LDAPv3
# base <uid=testuser,dc=my-company,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# testuser, my-company.com
dn: uid=testuser,dc=my-company,dc=com
uid: testuser
cn: User
sn: Test
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
loginShell: /bin/bash
homeDirectory: /home/testuser
uidNumber: 2000
gidNumber: 2000
mail: testuser@my-company.com
gecos: "Test user"
userPassword:: e1NTSEF9a1QxQnU4b0E4TEpjNUF5a0NKUXROcnpMcWs2QlJLbVo=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
```

作成したユーザーの情報が返ってきた！

# 参考

* https://hub.docker.com/r/osixia/openldap
* https://github.com/osixia/docker-openldap