CI/CD関連ツールの認可をLDAPと連携して実現してみる(連携できないツールあり・・・)

「[CI/CD関連ツールのユーザー情報をLDAPで一元管理してみる](https://qiita.com/kazuki43zoo/items/0d4e5c22d7c76fc3c76f)」でCI/CD関連ツールの認証をLDAPと連携して行う方法をメモったので、今回はLDAPで管理しているグループと連携して認可を行う方法もメモっておく。

# 各ツールの対応状況

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/43c3d3f5-913e-6460-ed9d-93d85e4a89c9.png)

> **NOTE:**
>
> GitLab Enterprise EditionはLDAP連携できる（模様）。

# LDAPサーバの状態

LDAPサーバ(OpenLDAP)の状態は以下の通り。

| ユーザ名 | パスワード | 氏名 | 所属するグループ |
| -------- | -------- | --------------- | ------ |
| kazuki | password | Kazuki Shimizu | project-managers, project-developers |
| user | password | Taro Yamada | project-developers |

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/71067459-828f-ddfc-7daa-0e536b0bc360.png)

```:openldap/schema.ldif
version: 1

dn: ou=groups,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: groups

dn: cn=project-managers,ou=groups,dc=example,dc=com
cn: project-managers
objectclass: groupOfUniqueNames
objectclass: top
uniquemember: uid=kazuki,ou=people,dc=example,dc=com

dn: cn=project-developers,ou=groups,dc=example,dc=com
cn: project-developers
objectclass: groupOfUniqueNames
objectclass: top
uniquemember: uid=user,ou=people,dc=example,dc=com
uniquemember: uid=kazuki,ou=people,dc=example,dc=com

dn: ou=people,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people

dn: uid=kazuki,ou=people,dc=example,dc=com
cn: Kazuki Shimizu
mail: kazuki@example.com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
sn: Shimizu
givenName: Kazuki
uid: kazuki
userpassword: {CRYPT}7pnoyta7lRz7M


dn: uid=user,ou=people,dc=example,dc=com
cn: Taro Yamada
mail: user@example.com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
sn: Yamada
givenName: Taro
uid: user
userpassword: {CRYPT}SjPCVdR9pFLD6
```

# Jenkins

Jenkinsのシステム管理権限を持つユーザでログインし、LDAPで管理しているグループ(project-managersとproject-developers)に対して権限定義を追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/e64a2a38-19ab-7212-187f-d96c90d948c6.png)

LDAPからユーザが所属するグループ情報を取得するための設定例は以下の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/bb39be62-8044-5b35-17c8-6d763e6ba9d7.png)

設定を保存した後に、kazukiでログインすると・・・レフトメニューバーに「Manage Jenkins」（システム管理権限を持つユーザでログインした際に表示されるメニュー）が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/67f7e104-1a27-c584-9e83-e9e4b148a4f9.png)

userでログインすると・・・レフトメニューバーに「Manage Jenkins」は表示されない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/209565d6-d5cb-af0c-cb97-f0055f55851c.png)

# SonarQube

SonarQubeのシステム管理権限を持つユーザでログインし、LDAPで管理しているグループ(project-managersとproject-developers)に対して権限定義を追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/7b25829c-5fa1-de65-53af-fb71857ec612.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/6cc17519-0b8a-0b23-ed27-ffad720b6d52.png)

LDAPからユーザが所属するグループ情報を取得するための設定例は以下の通り。

```properties:sonarqube/sonar.properties
# Group Configuration
ldap.group.baseDn=ou=groups,dc=example,dc=com
ldap.group.request=(&(objectClass=groupOfUniqueNames)(uniquemember={dn}))
```

設定を保存した後に、kazukiでログインすると・・・トップメニューバーに「Administration」（システム管理権限を持つユーザでログインした際に表示されるメニュー）が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/211b4f4d-7f8e-02a5-7fcf-c8b5114a7803.png)

userでログインすると・・・トップメニューバーに「Administration」は表示されない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/e5c8f942-8549-7e2e-4980-86f3085edcee.png)


# Nexus

NEXUSのシステム管理権限を持つユーザでログインし、LDAPで管理しているグループ(project-managersとproject-developers)に対して権限定義を追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/0d3abd66-fd9d-8952-1122-3614e066bbeb.png)

project-managersの権限設定例：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/cfed9629-fdf6-0e04-518e-d3f2fa488d12.png)

project-developersの権限設定例：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/537bddf2-e68b-abf4-c1f6-9c7cf783565f.png)

LDAPからユーザが所属するグループ情報を取得するための設定例は以下の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d51064a7-a4ec-c55c-a96d-c532234c7146.png)

設定を保存した後に、kazukiでログインすると・・・トップメニューバーに「設定アイコン」（システム管理権限を持つユーザでログインした際に表示されるメニューアイコン）が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/1ea8c5a9-8c34-a1e4-33d4-27f0bde3cd9e.png)

userでログインすると・・・トップメニューバーに「設定アイコン」は表示されない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/0b4fed91-8ba0-e872-cd75-2a9ac61ef337.png)


# GitLab

## グループの作成

グループを作る。ここでいうグループは、GitHubでいうところの組織（Organization）に相当する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/0578ff30-03cd-45e4-74a7-72de75b7834b.png)

## ユーザ情報の同期

グループにユーザを追加するためには、GitLab側にLDAPで管理しているユーザのユーザ情報を同期する必要がある。
同期する方法は、私が知る限りでは以下の２つの方法がサポートされている。

> **NOTE:**
>
> Enterprise Editionでは、定期的にLDAPサーバと同期してユーザ情報を取り込む機能がある（らしい）。

### ログインして同期

LDAPユーザとしてログインする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/f4b9dc54-366b-d768-4616-858804aa4d21.png)

ログイン後にprofileを開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/5c52ab3d-525c-fe9a-7c14-16a29b1c1a77.png)

システム管理者権限があるユーザでログインしてユーザ一覧を確認すると、ユーザ情報が取り込まれたことが確認できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/f0922cf5-0d41-d791-7efe-a523cf33b9fd.png)

### 同じユーザ情報の登録

システム管理者権限を持つユーザでログインしてユーザ情報を登録する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/725d8236-4cf0-b224-e9aa-fc681b057ac5.png)

## グループにメンバー追加

同期したユーザをグループメンバーとして追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/3c8107b2-0808-fe36-81d4-fbb226a3f619.png)

以下は、kazukiをMaster、userをDeveloperロールでメンバー追加した場合の画面例。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/fd5b4392-9053-12f3-8dce-3f1d317320e3.png)


> **NOTE:**
>
> メンバー追加時に指定できるロールは以下の５つ。
>
> * Guest
> * Reporter
> * Developer
> * Master
> * Owner

## グループ追加後にログインしてみる

kazukiでログインして所属グループを確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/ceac2783-aa03-5ca0-a569-a3ccf0bfe2b9.png)

Masterロールにはグループにプロジェクトを作成する権限がある！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/2cd9bf96-09e5-e4c4-7fab-40f7aaaff579.png)

userでログインして所属グループを確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/b91d9725-087c-4eee-e9e2-f7e4fc405ea1.png)

Developerロールにはグループにプロジェクトを作成する権限がない！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/8d0c234d-f765-8db0-3df0-6eb5ef4741a8.png)


どちらの方法でもグループに参加することができるが、ログインしてユーザ情報を同期する方が手間が（ちょっとだけ）少ない気がする。（CE版でもLDAPからユーザ情報を同期する方法がサポートされることを願う・・・）


# Redmine

## グループの作成

システム管理権限を持つユーザでログインしてグループを作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/29476987-152a-e215-3dd1-ca6ef574bbc5.png)

## ユーザ情報の同期

Loginにユーザ名を入力すると・・・LDAPで管理しているユーザに一致するユーザが候補プルダンに表示されるので、同期したいユーザを選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/16f3be8b-0535-1365-64d9-4cc0092337f9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/3168a2f4-fc97-213b-50e5-acee6f92928c.png)

## グループにメンバー追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/f7aee431-f1d0-15e1-0a83-96e3375e0c01.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d3272fe0-1bc2-8be6-2ce9-d61cc0bf337e.png)

## プロジェクトにグループを割り当てる

プロジェクトにグループを割り当てることで、プロジェクトを利用できるユーザを追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/6d8e581e-387d-6260-93c0-ccb92baaa7e5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/287b12ba-5069-3c61-687f-e2da4ddbfb04.png)

> **NOTE:**
>
> 上記はグループを作る前提になっているが、実は・・・グループの作成は必須ではなく、ユーザを直接プロジェクトメンバーとして追加することもできる。
> グループ単位で複数のプロジェクトメンバーになることが多い場合は、グループにユーザを割り当てて、グループをプロジェクトメンバーとして追加する方がメンテナンスコストが低くなるのかな！？

## プロジェクトメンバー追加後にログインしてみる

kazukiでログインして所属プロジェクトを確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/a3c0013f-bbaa-ac66-3471-25450b280337.png)

Managerロールにはプロジェクトの設定がいろいろできる！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/be65905e-53c5-c3b5-8ac0-0e81e56d3564.png)

userでログインして所属プロジェクトを確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/c7391a94-05d2-00ec-a1fe-a426ff9c1d6a.png)

Developerロールにはプロジェクトの設定が少ししかできない！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/934f54ca-9ceb-2e82-a74f-eeb38717c58f.png)


# Mattermost

## チームの作成

Mattermostにはグループという考え方はなく、グループの代わりにチームという概念がある。チームにメンバーを追加することで、チームメンバー内でコミュニケーションを取ることができる。
ここではシステム管理権限を持つユーザでチームを作るが、システム管理者以外のユーザでもチームを作ることはできる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/704eef54-032d-d9dd-0437-a1c404f6b15b.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/e14352df-4566-773e-7d00-03f3e4ecf2c7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/f420cf96-c148-7ed2-5d55-67621313d775.png)

## ユーザ登録&チームメンバー追加

すでにログイン済みのユーザ（Mattermostにユーザ情報が存在するユーザ）は、チーム管理者が自由にメンバー追加を行うことができますが、ユーザ情報がないユーザについては、チームメンバーへの招待が必要になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/578b1c98-8688-efe3-a65d-814be547b017.png)

GitLab経由でログインする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/3a50ae54-885a-ccd7-6fbb-01fe14ae5b6a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/f2e1f2c2-b9d7-965a-52af-9a9dcabc8d74.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/1bbc35b8-32b8-e81e-d8e6-06ef03d9131e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d9ee6d4d-b9ae-accc-0058-846cc42132b6.png)

## ロールの設定

チーム管理者でログインしてメンバー一覧を確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/6dbb66b8-97da-213a-85a4-2fb19e341ef1.png)

招待して追加したチームメンバーのロールは「Memeber」となる。これはチーム管理者が変更できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/c16befa3-6807-5eff-3040-57a43a0d63ca.png)