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

# 概要

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

このエントリで記載するトピックは、GitLabをコンテナで動かしてSamba4のActiveDirectoryでユーザ認証することです。

2日前からのエントリをつなげると、下図のような世界になります。

|![EHW2018DevEnv(1).png](https://qiita-image-store.s3.amazonaws.com/0/65002/04e2001e-d779-fb6d-5bc5-1153063bf332.png)|
|:---:|

# 前提

## おことわり

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

## 想定読者

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

> HelloWorldのソースコードを格納する先を作らなければいけない。認証も統合したい。GitリポジトリでAD連携できてローカルで動くやつ、たのむ

# GitLab CEを立ち上げる

## GitLab CE

本エントリ執筆時点で、GitLabには、サービス版とオンプレ版、コミュニティー向け無償版とエンタープライズ向けのサポート付き有償版が存在します。

本エントリでは、前提として置いている、なるべくオンプレに見立てたローカル環境で作業を進めたいため、サービス利用ではなくコンテナでローカルに立ち上げます。サポートがなく機能が限定されているものの、今回のAdvent Calendarでやりたいことは十分満たすので、CE版で話を進めます。

## dockerコンテナ

GitLabは、公式サイトで[コンテナのイメージが提供されている](https://docs.gitlab.com/omnibus/docker/)ため、これを使用します。動作の設定はgitlab.rbファイルで細かく指定することができます。設定については後述します。

## docker-compose.yml

GitLabの動作設定を格納する先として、dockerのホスト環境のディスクをdockerのVolumeとしてマウントして利用します。

docker-compose用の変数を「.env」で指定し、

```sh
ADS_ADDR=192.168.3.222
EXT_DNS_ADDR=192.168.3.1
AD_DOMAIN_PASSWORD=P@ssw0rd
CONF_DIR=./conf_dir

GITLAB_ADDR=192.168.3.220
JENKINS_ADDR=192.168.3.220
```

docker-compose.ymlを[本家サイト](https://docs.gitlab.com/omnibus/docker/)を参考にして指定します。

```yaml
version: '3.7'

networks:
  extnet:
    name: my-external-net

services:

（中略：初日のSambaサービス）

  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.ehw2018.local'
    #environment:
      #GITLAB_OMNIBUS_CONFIG: |
      #  external_url 'https://gitlab.example.com'
        # Add any other gitlab.rb configuration here, each on its own line
    networks:
      - extnet
    ports:
      - "${GITLAB_ADDR}:80:80"
      - "${GITLAB_ADDR}:443:443"
      - "${GITLAB_ADDR}:10022:22"
    volumes:
      - '${CONF_DIR}/gitlab/config:/etc/gitlab'
      - '${CONF_DIR}/gitlab/logs:/var/log/gitlab'
      - '${CONF_DIR}/gitlab/data:/var/opt/gitlab'
    links:
      - samba

（中略：初日のJenkinsサービス）
```

## GitLab.rb

設定ファイルは、「/etc/gitlab/gitlab.rb」です。一度コンテナを立ち上げると、ホスト側でボリュームを提供しているフォルダにファイルができるため、一度"docker-compose up"して、"docker-compose stop"します。

そうすると、ホスト側の「${CONF_DIR}/gitlab/config/gitlab.rb」ファイルができているため、これに手を加えます。
このファイルはページに全て転記するには長いため、本エントリ関係分だけ抜粋します。本エントリ執筆時点では230行目あたり、「ldap」でファイル内検索をしたりしていたどり着いてください。

```ruby
gitlab_rails['ldap_enabled'] = true

###! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
  main: # 'main' is the GitLab 'provider ID' of this LDAP server
    label: 'LDAP'
    host: 'samba.my-external-net'
    port: 389
    uid: 'sAMAccountName'
    bind_dn: 'CN=Administrator,CN=Users,DC=ehw2018,DC=local'
    password: 'P@ssw0rd'
    #encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
    encryption: 'start_tls' # "start_tls" or "simple_tls" or "plain"
    verify_certificates: false
    active_directory: true
    allow_username_or_email_login: true
    lowercase_usernames: false
    block_auto_created_users: false
    base: 'DC=ehw2018,DC=local'
    user_filter: ''
    ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
EOS

```

ポイントは、エントリの2日前からの設定に合わせると、
- encryptionは 'start_tls'
- 'CN=Administrator,CN=Users,DC=ehw2018,DC=local'で接続（本当は、サービス用がbindするためのアカウントを別にすべきですが、まずはつなげます）

## 起動

```shell-session
$ sudo docker-compose restart
```

dockerのホスト側で、「192.168.2.220:80」にsshでポート転送するなどして（2日前のエントリなど参考）つなげてみてください。

うまくいっていれば、2日前に作ったSambaのEHW2018.LOCALドメインのユーザ「Administrator/P@ssword」下図のようなホーム画面に入れるはずです。

![gitlab_home.png](https://qiita-image-store.s3.amazonaws.com/0/65002/68fa51ac-ef6b-e29a-3424-e361b465892d.png)

# 補足

## GitLabの管理者アカウントのパスワードをリセットするには

GitLabコンテナ内で、[本家サイトの「How to reset your root password 」](https://docs.gitlab.com/ee/security/reset_root_password.html)に従って作業すると、管理者アカウントのパスワードがリセットできます。

```
root@gitlab:/# gitlab-rails console production
-------------------------------------------------------------------------------------
 GitLab:       11.5.3 (aa11737)
 GitLab Shell: 8.4.1
 postgresql:   9.6.8
-------------------------------------------------------------------------------------
Both Deployment and its :status machine have defined a different default for "status". Use only one or the other for defining defaults to avoid unexpected behaviors.
Loading production environment (Rails 4.2.10)

irb(main):013:0> user = User.where(id: 1).first
=> #<User id:1 @root>
irb(main):014:0> user.email
=> "admin@example.com"
irb(main):015:0> user.name
=> "Administrator"
irb(main):016:0> user.password = "P@ssw0rd"
=> "P@ssw0rd"
irb(main):017:0> user.password_confirmation = "P@ssw0rd"
=> "P@ssw0rd"
irb(main):018:0> user.save!
Enqueued ActionMailer::DeliveryJob (Job ID: c43571bb-0e3d-45ef-878b-0804762ea012) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", gid://gitlab/User/1
=> true
irb(main):019:0> exit
```

## SambaでのActiveDirectoryを利用したLDAP認証が通らない時

ユーザのアカウントが有効で、パスワードが正しくても、ActiveDirectoryを利用したLDAPでログインできないことがあります。
いくつか原因はありますが、動いていたものが突然動かなくなるパターンだと、LDAP接続用のユーザアカウントのパスワードが期限切れになっている場合もあります。
(これが、わかりにくい)

このシリーズでは、Administratorアカウントをそのまま使っていますので、Sambaサーバ側で下記のようにパスワードをリセットします。

```shell-session
# samba-tool user setpassword Administrator
```


# まとめ

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

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