JenkinsでAzure AD認証を設定する手順(Azure AD Plugin利用)

Jenkinsの認証にAzure ADを使う場合の設定方法を調べてみました。

検索するとSAMLやOpenID Connectで連携する手順も出てきますが、今回は [こちらのAzure AD Plugin](https://wiki.jenkins.io/display/JENKINS/Azure+AD+Plugin) を使用しました。以下が設定手順となります。

Jenkinsのバージョンは 2.108, Azure AD Pluginのバージョンは 0.3.0で確認しました。

# 認証設定のバックアップ

設定後すぐAzure AD認証に切り替わるので、念のため設定のバックアップを取得しておきます。
ファイルは <b>/var/lib/jenkins/config.xml</b> です。

```shell-session
# cp /var/lib/jenkins/config.xml /var/lib/jenkins/config.xml.bak
```

何かあったらファイルを戻してJenkinsを再起動すれば元のユーザ(セキュリティ設定)でログインできます。

```shell-session:Ubuntuの場合
# service jenkins restart
```

# Azure ADの設定

まず、Azure ADの設定を行います。

Azureポータルから Azure Active Directory -> アプリの登録 -> 新しいアプリケーションの登録 を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/6e18ca91-16fa-b20b-41b3-b9df65ba4b9b.png)

名前(何でもいいです)を入力して、アプリケーションの種類は「Webアプリ/API」を選択します。
サインオンURLには <font color="red"><b>{JenkinsのURL}/securityRealm/finishLogin</b></font> を入力して「作成」を押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/08beef47-35a8-c4cc-e2af-13e2da79a997.png)

作成されるとプロパティが表示されるので、<font color="blue"><b>アプリケーションID</b></font> をコピーしておきます。
後述するように、これをJenkinsの設定画面で <font color="red"><b>Client ID</b></font> として入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/cba9054d-38d8-0227-ee18-d875b88a9d11.png)

引き続き、作成されたアプリケーションのメニューから「設定」->「キー」を選択して<font color="blue"><b>パスワード</b></font>を発行します。これをJenkinsの設定画面で <font color="red"><b>Client Secret</b></font> として入力するので、コピーしておきます。
警告メッセージが出ているように、パスワードは発行時にコピーしないと再取得できないので注意して下さい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/c82f2ccc-951c-e68c-411d-8b4afd1a37ad.png)

次に、作成されたアプリケーションのメニューから「必要なアクセス許可」を選択します。
<font color="red"><b>Read directory data(2ヶ所)</b></font>に追加のチェックを入れて、保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/1150d8fe-97c7-66b1-bc0c-75fdd252ed1f.png)

保存後に戻る設定画面で、アクセス許可の付与をおこないます。（ただし、ここで付与するとAzure AD上の全ユーザに付与されるので、一部のユーザに付与したい場合はAzure ADの「ユーザー」メニューから個別に付与して下さい。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/8c25ebeb-ec94-6297-6caa-bfd6973ee0ba.png)

次に、アプリケーションのメニューから「応答URL」を選択します。
作成時に設定した<b>{JenkinsのURL}/securityRealm/finishLogin</b>パスが設定されていることを確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/97dd0fff-c823-6451-a761-145fbd937c16.png)

最後に、Azure Active Directoryのプロパティに戻り、<font color="blue"><b>ディレクトリID</b></font> をコピーしておきます。
これをJenkinsの設定画面で <font color="red"><b>Tenant</b></font> として入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/e814d0e0-096d-ef90-9c63-3947379f3bc6.png)

以上でADの設定は完了です。

# Jenkinsの設定と動作確認

Jenkinsの管理 -> プラグインの管理 -> 利用可能タブ から、Azure ADプラグインを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/7f38c154-7607-bf26-ae2e-97fa9bfb512e.png)

追加後、Jenkinsの管理 -> グローバルセキュリティの設定 に Azure Active Directory が追加されているので、保存しておいた

- <font color="red"><b>Client ID</b></font> （<font color="blue"><b>アプリケーションID</b></font>）
- <font color="red"><b>Client Secret</b></font>（<font color="blue"><b>パスワードの値</b></font>）
- <font color="red"><b>Tenant</b></font>（<font color="blue"><b>ディレクトリID</b></font>）

を設定して、"Verify Application"を押します。"Successfully verified"と表示されればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/3cef9bf5-7211-fd6a-8be3-bcedf475a948.png)

問題なければ、その下の設定で "Azure Active Directory Matrix-based security" を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/280cbdce-1400-6730-ce04-47fd60270fcd.png)

上記はログイン済みユーザ全員に権限設定する設定ですが、ユーザごとに権限付与することも可能です。
ユーザの名前を入力すればサジェスト表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/e113dc28-caf6-0689-2fab-bf114959c1a1.png)

設定を保存後Jenkinsにログインし、Azure ADユーザでログインできることを確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/e64a289a-6f7d-9654-1c0f-bac9a6e4229c.png)

以上で設定は完了です。

# その他

アクセス権が不足している場合、以下のエラーメッセージが表示されました。403なので権限まわりだとは分かりますが...最初はちょっとびっくりしますね。

```java

com.microsoft.azure.management.graphrbac.GraphErrorException: Status code 403, 
{"odata.error":{"code":"Authorization_RequestDenied","message":
{"lang":"en","value":"Insufficient privileges to complete the operation."}}}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/b47874c9-fae4-e3b3-f5a1-e05b4efa67c1.png)

# 参考資料

- [Azure AD Plugin](https://wiki.jenkins.io/display/JENKINS/Azure+AD+Plugin)