docker上にRedmine、gitlabのopenLDAP認証環境を構築

# docker環境で openLDAP認証を使用してRedmine、gitlabにログインする。

[docker上にRedmineのインストール](http://qiita.com/ir-shin1/items/65b935b7a57787a76053)を行ったが、gitlabやJenkinsなどの導入を考慮すると、ユーザ管理の認証に工夫が必要になる。
いろいろググると、openLDAP、Active DirectoryやOAuthで認証する方法があるらしいので、まずは、openLDAPでの認証を試してみる。

## 環境

  * docker desktop for mac 2.1.0.5
  * OpenLDAP osixia/openldap:1.3.0、osixia/phpldapadmin:0.9.0
  * DB postgres:12.1-alpine
  * Redmine redmine:4.0.5-alpine

いつものように、dockerのイメージはlatestではない最新のタグを使用する。
openldapでサーチを行うと、osixia/openldapが先頭に出てきたので、使用するopenLDAPはosixia/openldapとした。本当はOFFICIALなopenLDAPがあれば良かったのだが。

## 1. docker設定

[osixia/docker-openldap](https://github.com/osixia/docker-openldap)を参考にインストール、起動を行う。

今までdockerコマンドを直接叩いていたが、docker-compose を使ってみる。
使用するポートは、80がredmine用、8080がPHPLDAPadminの設定用に割り当てる。また、LDAPの認証確認のため永続化のためのvolumeは割り当てない。

docker-compose.yml の記述方法バージョンがあり、version 2にするとlinksの設定が上手く各コンテナの /etc/hosts に反映されなかったので、バージョン未指定にしていたが、コンテナ内でpingを打つと応答が返ってきたので、dockerのDNSサーバがアドレス解決しているようだ。

```:docker-compose.yml
version: '2'

services:
  openldap:
    image: osixia/openldap:1.1.9
    container_name: test1-ldap
    environment:
      LDAP_ORGANISATION: "example"
      LDAP_DOMAIN: "example.com"
      LDAP_ADMIN_PASSWORD: "ldappw"

  admin:
    image: osixia/phpldapadmin:0.7.0
    container_name: test1-ldapadmin
    environment:
      PHPLDAPADMIN_LDAP_HOSTS: "ldap"
      PHPLDAPADMIN_HTTPS: "false"
    ports:
      - "8080:80"
    links:
      - "openldap:ldap"

  redmine:
    image: redmine:3.4.2
    container_name: test1-redmine
    environment:
      REDMINE_DB_PASSWORD: rdpassword
    ports:
      - "80:3000"
    links:
      - "postgres:postgres"
      - "openldap:ldap"

  postgres:
    image: postgres:9.6.3
    container_name: test1-postgres
    environment:
      POSTGRES_PASSWORD: rdpassword
      POSTGRES_USER: redmine
```

## 3. 起動

```
$ docker-compose up -d
Creating network "dockeropenldap_default" with the default driver
Creating test1-postgres
Creating test1-ldap
Creating test1-ldapadmin
Creating test1-redmine
$ docker ps
CONTAINER ID   IMAGE                       COMMAND                 CREATED         STATUS         PORTS                           NAMES
c8a2dc1abb60   redmine:3.4.2               "/docker-entrypoint.s"  15 seconds ago  Up 13 seconds  0.0.0.0:80->3000/tcp            test1-redmine
f0e6bd74985b   osixia/phpldapadmin:0.7.0   "/container/tool/run"   15 seconds ago  Up 13 seconds  443/tcp, 0.0.0.0:8080->80/tcp   test1-ldapadmin
9d2a041e880e   osixia/openldap:1.1.9       "/container/tool/run"   17 seconds ago  Up 14 seconds  389/tcp, 636/tcp                test1-ldap
b2aeed884b3a   postgres:9.6.3              "docker-entrypoint.sh"  17 seconds ago  Up 15 seconds  5432/tcp                        test1-postgres
```

## 4. OpenLDAPの設定

ホストPCからゲストにアクセスする。 http://192.168.45.131:8080

![phpLDAPadminホーム](https://qiita-image-store.s3.amazonaws.com/0/137664/58e4f569-decb-7cf7-55b6-c207b42241f7.png)


### 4.1 ログイン

loginを押下し、ログインを行う。

```
  Login DN: cn=admin,dc=example,dc=com
  Password: ldappw
```

![phpLDAPadminログイン](https://qiita-image-store.s3.amazonaws.com/0/137664/0fc1a524-11a4-5918-3320-72689e501f7e.png)

ログインするとホーム画面を表示

![phpLDAPadminホーム画面](https://qiita-image-store.s3.amazonaws.com/0/137664/e9bf505d-8529-f441-2d57-2408ac996761.png)

### 4.2 Organisational Unitの作成

認証するユーザを登録するUnit(ou)を作成する。

「dc=example,dc=com」を開き、「Create new entry here」を選択

![Organisational Unitの作成](https://qiita-image-store.s3.amazonaws.com/0/137664/58605fc4-254a-9ecb-92fd-fe6dbb42c22e.png)

  「Generic: Organisational Unit」を選択、Unit名に「ProjectX」を入力

![Organisational Unit名の選択](https://qiita-image-store.s3.amazonaws.com/0/137664/26347239-0592-6a03-3585-cf44bb6da1be.png)

  「ProjectX」を入力後、「Create Object」、「commit」を選択しouを作成

![Organisational Unit名の設定](https://qiita-image-store.s3.amazonaws.com/0/137664/0edca330-ed27-b15d-e871-59b9b24f1abd.png)

### 4.3 ユーザの登録

「ou=ProjectX,dc=example,dc=com」配下にユーザを登録する。

「ou=ProjectX」を開き、「Create a child entry」を選択

![ユーザの登録](https://qiita-image-store.s3.amazonaws.com/0/137664/6445a8b7-a3de-a147-659a-de2a8d1d8e89.png)

「Kolab: User Entry」を選択

![ユーザ情報入力](https://qiita-image-store.s3.amazonaws.com/0/137664/4beb7a47-766a-ef08-294d-8f1ff9799f11.png)

  以下の入力フィールドに値を入れる。Common NameをRedmineのログインIDとするため、Common Nameは半角英数字としている。

  * First name (例:山田)
  * Last name (例:太郎)
  * Common Name (例:taro.yamada)
  * Email (例:taro.yamada@example.com)
  * Password (パスワードの暗号化は、何でも良いが、趣味で ssha)

![ユーザ情報入力](https://qiita-image-store.s3.amazonaws.com/0/137664/2eaad836-a5bf-b6d4-5a2e-57b8ec7a4751.png)

「Create Object」(ページの下の端)、「commit」を選択しユーザを作成する。

![ユーザ登録](https://qiita-image-store.s3.amazonaws.com/0/137664/96a7c7bd-5cb9-b257-556d-947cc289d8a5.png)

  複数人ユーザを登録する場合は、これを繰り返す。

## 5. Redmineの設定

ホストPCからゲストにアクセスする。http://192.168.45.131

### 5.1 ログイン

![redmineログイン](https://qiita-image-store.s3.amazonaws.com/0/137664/f59abde7-0e8a-5646-d2e6-8974b413c34f.png)

ユーザadmin、パスワードadminでログインする。パスワード変更画面になるので、adminのパスワードを変更する。

### 5.2 新しい認証方式の追加

「管理」⇒「LDAP認証」⇒「新しい認証方式」で設定方式の追加を行う。

![認証方式情報入力](https://qiita-image-store.s3.amazonaws.com/0/137664/d2db8f92-ee6f-2322-3f76-6d21537d6cab.png)

  * 名称:openLDAP
  * ホスト:ldap
  * ポート:389
  * アカウント:cn=admin,dc=example,dc=com
  * パスワード:ldappw
  * ベースDN:ou=ProjectX,dc=example,dc=com

あわせてユーザーを作成:チェック

  * ログインIDの属性:cn
  * 名の属性:givenName
  * 姓の属性:sn
  * メールアドレスの属性:mail

![認証方式登録](https://qiita-image-store.s3.amazonaws.com/0/137664/39f07233-7913-7d82-7f98-279d20c41261.png)


![認証方式登録](https://qiita-image-store.s3.amazonaws.com/0/137664/7318f0b2-5fbf-92e5-7d62-0d981969f8b0.png)

### 5.3 ログアウトし、LDAPで登録したユーザ(taro.yamada)でログイン

「あわせてユーザーを作成」をチェックしているので、Redmineに登録していないユーザは自動的に登録される。

![登録ユーザログイン](https://qiita-image-store.s3.amazonaws.com/0/137664/e3b389a1-afaf-c85b-3f74-5409258f3c54.png)


## 6. Redmineの終了

コンテナを終了後、コンテナを削除し、獲得したvolumeを削除する。

```
$ docker-compose down -v
```

# 課題?

Redmineの個人設定の画面から、名、性、メールアドレスが変更できるが、変更した内容がopenLADPへは反映されない。また、パスワードを変更する場合は、openLDAPにログインして行う必要がある。

![個人設定画面](https://qiita-image-store.s3.amazonaws.com/0/137664/31c9030c-0f29-1743-ab02-ecff2ed22b3d.png)


# 参考

 * [dockerでLDAP Serverを起動。ついでにphpLDAPadminも](http://qiita.com/kokardy/items/1179bb2f96f790acc6c5)
 * [Vagrant+DockerでLDAPサーバを構築](http://qiita.com/salty-vanilla/items/3eba2875f0f9695f5e9d#_reference-d910c0f3cf159f2abd06)