Jenkinsをコンテナで動かしてSamba4のActiveDirectoryで認証～EHW2018「開発環境整備②」

# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/9向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで１つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、Jenkinsをコンテナで動かしてActiveDirectory(以降AD)で認証することです。

|![EHW2018DevEnv.png](https://qiita-image-store.s3.amazonaws.com/0/65002/6e1e5a1a-8754-007f-c889-5d09b81c9fb4.png) |
|:---:|


# 前提

## おことわり

- このEnterpfise "hello, world"シリーズは、ネタのためのエントリです。実環境でそのまま利用ことを目的とはしていません。
- 動かしやすさを優先してセキュリティを意図的に低くする設定など入れてありますのでご注意ください。


## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> 開発環境を作るからにはCIを動かす基盤としてJenkinsを入れておきたい。

## 関連エントリ

ADは、前日分のエントリで作っていますので参照ください。

# Jenkinsコンテナの起動と初期設定

## docker-compose.yml

[前回のエントリ:Samba4によるActiveDirectoryのドメインコントローラ用コンテナ～EHW2018「開発環境整備①」](https://qiita.com/hrkt/items/68ae33cdfae4713d7566)に、Jenkins用の設定を追加します。
ネットワークに名前を付けているところも、前日と異なります。

```yml
version: '3.7'

networks:
  extnet:
    name: my-external-net

services:

  # see: https://github.com/Fmstrat/samba-domain
  samba:
    image: nowsci/samba-domain
    container_name: samba
    volumes:
      #- /etc/localtime:/etc/localtime:ro
      - ${CONF_DIR}/samba/data/:/var/lib/samba
      - ${CONF_DIR}/samba/config/samba:/etc/samba/external
    environment:
      - DOMAIN=EHW2018.LOCAL
      - DOMAINPASS=${AD_DOMAIN_PASSWORD}
      - JOIN=false
      - INSECURELDAP:true
      #- DNSFORWARDER=${EXT_DNS_ADDR}
    networks:
      - extnet
    ports:
      - ${ADS_ADDR}:53:53
      - ${ADS_ADDR}:53:53/udp
      - ${ADS_ADDR}:88:88
      - ${ADS_ADDR}:88:88/udp
      - ${ADS_ADDR}:135:135
      - ${ADS_ADDR}:137-138:137-138/udp
      - ${ADS_ADDR}:139:139
      - ${ADS_ADDR}:389:389
      - ${ADS_ADDR}:389:389/udp
      - ${ADS_ADDR}:445:445
      - ${ADS_ADDR}:464:464
      - ${ADS_ADDR}:464:464/udp
      - ${ADS_ADDR}:636:636
      - ${ADS_ADDR}:1024-1044:1024-1044
      - ${ADS_ADDR}:3268-3269:3268-3269
    dns_search:
      - ehw2018.local
    dns:
      - ${ADS_ADDR}
      #- ${EXT_DNS_ADDR}
    extra_hosts:
      - localdc.ehw2018.local:${ADS_ADDR}
    hostname: localdc
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun
    privileged: true
    restart: always

  jenkins:
    image: 'jenkins/jenkins:lts'
    networks:
      - extnet
    ports:
      - "${JENKINS_ADDR}:8080:8080"
    volumes:
      - '${CONF_DIR}/jenkins/data:/var/jenkins_home'
    links:
      - samba
```

## 起動

```
$ sudo docker-compose up
```

いつもの、起動初回の画面が出ます。

![unlock_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/1f67e0b0-66ea-0c2c-ec2e-f9db3385c688.png)

Jenkinsの設定は、docker-compose.ymlが格納されたディレクトリのconf_dir/jenkins以下にVolumeをマウントしてあるところから確認できます。

たとえば、初期パスワードは、以下のようにして確認できます。


```
$ cat conf_dir/jenkins/data/secrets/initialAdminPassword
```

おすすめのカスタマイズをインストール方を選択して次に進みます。

![customize_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/374e3b28-f1e3-c2e6-65fa-bc7faff18c1a.png)

おすすめプラグインの自動インストールが始まります。

![gettingstarted_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/f005c112-c52a-9df3-1828-86da2d49d6fa.png)

最初の管理者を作り、（このエントリでは「JenkinsAdmin」としました）

![create_first_user_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/d68677e6-df26-3607-9025-e114151e959b.png)

Jenkinsが生成する各種リンクに使うURLを指定して（仮に、http://ehw2018.local:18080としました）

![instance_configuration_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/3ea3e4e7-a8e7-80c7-c7dc-ebc866a49717.png)

「Finish」ボタンを押せばおしまいです。ホーム画面が出てきます。

![home_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/fd4e16b4-60d2-44c1-03c0-8a0cbb1d6b6e.png)

# ActiveDirectory連携

「Jenkinsの管理」から「プラグインの管理」を選択します。
（筆者がエントリを書いていた時点では、一度Jenkins管理コンソールからログアウトして、もう一度一人目の管理者として指定した"JenkinsAdmin"でログインしました）

![plugins_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/ce3f86bc-3c93-c241-eef0-3ef03045dfd1.png)

「利用可能」のタブから、"Active Directory Plugin"を選び、「再起動せずにインストール」します。

![adplugin_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/921b5b10-a6ec-993a-33ee-853455086f49.png)

トップ画面に戻り、「Jenkinsの管理」から「Global Security Config」を選び、Active Directoryの指定を行います。

疎通確認のため、Administratorでつなげてみます。前日に構成したADを使う場合には下記のように「CN=Administrator,CN=Users,DC=ehw2018,DC=local」を指定し、

![addomain_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/65002/9f3f26e1-314e-7ecc-5dd6-60ff4173f262.png)

「高度な設定」ボタンを押して、"Group Membership Lookup Strategy"を"Recursive Group Queries"にすることがポイントです。[参考：外部のQAサイト](https://serverfault.com/questions/885027/jenkins-active-directory-conntection-login-fails-with-indexed-and-full-searches)

「Test Domain」を押します。
（エントリ執筆時には、操作は成功しますが、一部警告が出ました「Success - but ehw2018.local does not look like a valid domain name」）使っていておかしいことがあれば、適宜補足します。

このあと、「ログアウト」して、前日のAD構築時に使ったAdministratorとパスワードの組でログインすると、Active Directoryでの認証が成功しています。

# 補足

## Jenkinsの認証設定を何か間違えてログインできなくなったとき

「conf_dir/jenkins/data/config.xml」の下記部分を"false"にしてコンテナを再起動すると、認証なしでログインできるので、そこからやり直すとよいでしょう。

```xml
<useSecurity>true</useSecurity>
```




# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の9日目として、Jenkinsをコンテナで動かしてActiveDirectoryで認証することをトピックとして取り上げました。

EHW2018のネタとしては、このあと、開発環境の整備をもう少し続ける予定です。