「CI/CD関連ツールのユーザー情報をLDAPで一元管理してみる」でCI/CD関連ツールの認証をLDAPと連携して行う方法をメモったので、今回はLDAPで管理しているグループと連携して認可を行う方法もメモっておく。
各ツールの対応状況
NOTE:
GitLab Enterprise EditionはLDAP連携できる(模様)。
LDAPサーバの状態
LDAPサーバ(OpenLDAP)の状態は以下の通り。
ユーザ名 | パスワード | 氏名 | 所属するグループ |
---|---|---|---|
kazuki | password | Kazuki Shimizu | project-managers, project-developers |
user | password | Taro Yamada | project-developers |
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)に対して権限定義を追加する。
LDAPからユーザが所属するグループ情報を取得するための設定例は以下の通り。
設定を保存した後に、kazukiでログインすると・・・レフトメニューバーに「Manage Jenkins」(システム管理権限を持つユーザでログインした際に表示されるメニュー)が表示される。
userでログインすると・・・レフトメニューバーに「Manage Jenkins」は表示されない。
SonarQube
SonarQubeのシステム管理権限を持つユーザでログインし、LDAPで管理しているグループ(project-managersとproject-developers)に対して権限定義を追加する。
LDAPからユーザが所属するグループ情報を取得するための設定例は以下の通り。
# Group Configuration
ldap.group.baseDn=ou=groups,dc=example,dc=com
ldap.group.request=(&(objectClass=groupOfUniqueNames)(uniquemember={dn}))
設定を保存した後に、kazukiでログインすると・・・トップメニューバーに「Administration」(システム管理権限を持つユーザでログインした際に表示されるメニュー)が表示される。
userでログインすると・・・トップメニューバーに「Administration」は表示されない。
Nexus
NEXUSのシステム管理権限を持つユーザでログインし、LDAPで管理しているグループ(project-managersとproject-developers)に対して権限定義を追加する。
project-managersの権限設定例:
project-developersの権限設定例:
LDAPからユーザが所属するグループ情報を取得するための設定例は以下の通り。
設定を保存した後に、kazukiでログインすると・・・トップメニューバーに「設定アイコン」(システム管理権限を持つユーザでログインした際に表示されるメニューアイコン)が表示される。
userでログインすると・・・トップメニューバーに「設定アイコン」は表示されない。
GitLab
グループの作成
グループを作る。ここでいうグループは、GitHubでいうところの組織(Organization)に相当する。
ユーザ情報の同期
グループにユーザを追加するためには、GitLab側にLDAPで管理しているユーザのユーザ情報を同期する必要がある。
同期する方法は、私が知る限りでは以下の2つの方法がサポートされている。
NOTE:
Enterprise Editionでは、定期的にLDAPサーバと同期してユーザ情報を取り込む機能がある(らしい)。
ログインして同期
LDAPユーザとしてログインする。
ログイン後にprofileを開く。
システム管理者権限があるユーザでログインしてユーザ一覧を確認すると、ユーザ情報が取り込まれたことが確認できる。
同じユーザ情報の登録
システム管理者権限を持つユーザでログインしてユーザ情報を登録する。
グループにメンバー追加
同期したユーザをグループメンバーとして追加する。
以下は、kazukiをMaster、userをDeveloperロールでメンバー追加した場合の画面例。
NOTE:
メンバー追加時に指定できるロールは以下の5つ。
- Guest
- Reporter
- Developer
- Master
- Owner
グループ追加後にログインしてみる
kazukiでログインして所属グループを確認する。
Masterロールにはグループにプロジェクトを作成する権限がある!
userでログインして所属グループを確認する。
Developerロールにはグループにプロジェクトを作成する権限がない!
どちらの方法でもグループに参加することができるが、ログインしてユーザ情報を同期する方が手間が(ちょっとだけ)少ない気がする。(CE版でもLDAPからユーザ情報を同期する方法がサポートされることを願う・・・)
Redmine
グループの作成
システム管理権限を持つユーザでログインしてグループを作成する。
ユーザ情報の同期
Loginにユーザ名を入力すると・・・LDAPで管理しているユーザに一致するユーザが候補プルダンに表示されるので、同期したいユーザを選択する。
グループにメンバー追加
プロジェクトにグループを割り当てる
プロジェクトにグループを割り当てることで、プロジェクトを利用できるユーザを追加する。
NOTE:
上記はグループを作る前提になっているが、実は・・・グループの作成は必須ではなく、ユーザを直接プロジェクトメンバーとして追加することもできる。
グループ単位で複数のプロジェクトメンバーになることが多い場合は、グループにユーザを割り当てて、グループをプロジェクトメンバーとして追加する方がメンテナンスコストが低くなるのかな!?
プロジェクトメンバー追加後にログインしてみる
kazukiでログインして所属プロジェクトを確認する。
Managerロールにはプロジェクトの設定がいろいろできる!
userでログインして所属プロジェクトを確認する。
Developerロールにはプロジェクトの設定が少ししかできない!
Mattermost
チームの作成
Mattermostにはグループという考え方はなく、グループの代わりにチームという概念がある。チームにメンバーを追加することで、チームメンバー内でコミュニケーションを取ることができる。
ここではシステム管理権限を持つユーザでチームを作るが、システム管理者以外のユーザでもチームを作ることはできる。
ユーザ登録&チームメンバー追加
すでにログイン済みのユーザ(Mattermostにユーザ情報が存在するユーザ)は、チーム管理者が自由にメンバー追加を行うことができますが、ユーザ情報がないユーザについては、チームメンバーへの招待が必要になる。
GitLab経由でログインする。
ロールの設定
チーム管理者でログインしてメンバー一覧を確認する。
招待して追加したチームメンバーのロールは「Memeber」となる。これはチーム管理者が変更できる。