Samba4によるActiveDirectoryのドメインコントローラ用コンテナ～EHW2018「開発環境整備①」

# 概要

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

このエントリで記載するトピックは、Samba4を使って、ActiveDirectory(以降ADと略します)のドメインコントローラ総統の機能を実現することと、一式をdockerコンテナとして動かすことです。

# 前提

## おことわり

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

## 想定読者

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

> 作ったアプリのコンテナ化とレジストリへの格納までができた。コードを格納しておくための開発環境などについても準備しなくてはいけないなぜならEnterpriseネタだから。

# Samba4によるActiveDirectoryドメインコントローラ

## 用語など

- [Sambaの公式サイト](https://www.samba.org/)
- [Active Directory Domain Services Overview](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/virtual-dc/active-directory-domain-services-overview)(公式の解説サイト)

## 出来上がるもの

このエントリでは、以下、Samba4でADのドメインコントローラを動かしているコンテナが一つ稼働する状況を目指します。

|![EHW2018ENV.png](https://qiita-image-store.s3.amazonaws.com/0/65002/516270bd-2d05-b7c1-3ddf-d7716d39501d.png)｜
|:--:|:--:|

## 手本になるコンテナを探す

すでにコンテナとしてセットアップされたよい手本がないか探してみたところ、[Samba Active Directory Domain Controller for Docker](https://github.com/Fmstrat/samba-domain/)がよさそうに感じました。

以下が理由です。
- 例がわかりやすい
- セットアップ時に必要となりそうな部分が外部変数化されている
- 作り方はGitHubに公開されているので、後で自分でカスタマイズしやすそう

## 設定

サイトの例を参考にしながら、勘とフィーリングで設定します。

### インターフェースの追加

dockerエンジンが動いているホスト側で、ネットワークのエイリアスを追加します。筆者は、[VirtualBox](https://www.virtualbox.org/)の上でUbuntu18.04LTSを動かしているのですが、この場合、下記のようなスクリプトで追加します。

```bash
!/bin/sh

# change this according to your machine's setting.
# run /sbin/ifconfig and find out it.

NIC=enp0s3

sudo ifconfig ${NIC}:1 192.168.3.222 netmask 255.255.255.0 up
```
### .env

docker-compose.yml内で使用するDocker Compose用の変数を同じディレクトリに「.env」ファイルとして格納しました。

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

### docker-compose.yml

サイトの説明と変数名を眺めながら、適当に値をセットします。サイトに記載されているものとの違いは、下記です。
- version3にした
- networkは自動定義にした
- confディレクトリをdocker-compose.ymlと同じディレクトリに持つことにした
- 時間の連携はとりあえず何もしない
- DNSのフォワーダーは今のところいないので設定しない
- LDAPの"セキュアでない設定"を有効にする(ツールでの確認のしやすさのため)
- ドメイン名を"EHW2018.LOCAL"にした

出来上がったのがこちらのファイルです。

```yml
version: '3'

networks:
  extnet:

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

```

## 起動

```shell-session
$ sudo docker-compose up
Recreating samba ... done
Attaching to samba
samba    | Looking up IPv4 addresses
samba    | Looking up IPv6 addresses
samba    | No IPv6 address will be assigned
samba    | Setting up share.ldb
samba    | Setting up secrets.ldb
samba    | Setting up the registry
samba    | Setting up the privileges database
samba    | Setting up idmap db
samba    | Setting up SAM db
samba    | Setting up sam.ldb partitions and settings
samba    | Setting up sam.ldb rootDSE
samba    | Pre-loading the Samba 4 and AD schema
samba    | Adding DomainDN: DC=ehw2018,DC=local
samba    | Adding configuration container
samba    | Setting up sam.ldb schema
samba    | Setting up sam.ldb configuration data
samba    | Setting up display specifiers
samba    | Modifying display specifiers
samba    | Adding users container
samba    | Modifying users container
samba    | Adding computers container
samba    | Modifying computers container
samba    | Setting up sam.ldb data
samba    | Setting up well known security principals
samba    | Setting up sam.ldb users and groups
samba    | Setting up self join
samba    | Adding DNS accounts
samba    | Creating CN=MicrosoftDNS,CN=System,DC=ehw2018,DC=local
samba    | Creating DomainDnsZones and ForestDnsZones partitions
samba    | Populating DomainDnsZones and ForestDnsZones partitions
samba    | Setting up sam.ldb rootDSE marking as synchronized
samba    | Fixing provision GUIDs
samba    | A Kerberos configuration suitable for Samba 4 has been generated at /var/lib/samba/private/krb5.conf
samba    | Setting up fake yp server settings
samba    | Once the above files are installed, your Samba4 server will be ready to use
samba    | Server Role:           active directory domain controller
samba    | Hostname:              localdc
samba    | NetBIOS Domain:        EHW2018
samba    | DNS Domain:            ehw2018.local
samba    | DOMAIN SID:            S-1-5-21-2028212767-3557225369-1139172731
samba    | /usr/lib/python2.7/dist-packages/supervisor/options.py:297: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
samba    |   'Supervisord is running as root and it is searching '
samba    | 2018-12-08 23:30:54,706 CRIT Supervisor running as root (no user in config file)
samba    | 2018-12-08 23:30:54,707 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
samba    | 2018-12-08 23:30:54,726 INFO RPC interface 'supervisor' initialized
samba    | 2018-12-08 23:30:54,727 CRIT Server 'unix_http_server' running without any HTTP authentication checking
samba    | 2018-12-08 23:30:54,727 INFO supervisord started with pid 14
samba    | 2018-12-08 23:30:55,731 INFO spawned: 'samba' with pid 17
samba    | 2018-12-08 23:30:57,357 INFO success: samba entered RUNNING state, process has stayed up for > than 1 seconds
```

なんとなくいい感じです。

## 確認

何かのツールで動作確認をします。
このエントリでは、Sysinternalsの「[Active Directory Explorer](https://technet.microsoft.com/ja-jp/sysinternals/adexplorer.aspx)」を使った例を紹介します。

### 接続準備

筆者の環境は、下記のようになっているので、Teratermのポートフォワード機能を使い、AD用のコンテナのポート3268に対してローカルマシンのポート13268に対して接続できるようにします。

```
[Windows10] -ssh-> [Ubuntu1804 on VirtualBox] --> [AD in container]
         port 13268 --------------------------------> port 3268
```

TeraTermのポートフォワードの設定はこのような感じです。

![port-forward-tterm.png](https://qiita-image-store.s3.amazonaws.com/0/65002/89b50051-4eb0-f318-298b-307d965221fb.png)

### 接続

上で指定したローカルの13268ポートにActive Directory Explorerで接続します。

![adexplorer-login.png](https://qiita-image-store.s3.amazonaws.com/0/65002/d0a0d98e-de6b-d3d5-cdcf-c8103ae4fc41.png)

内容が確認できました。設定どおりになっていますね。

![adexplorer-tree.png](https://qiita-image-store.s3.amazonaws.com/0/65002/1eb448aa-9062-aaa0-8c60-5af89b27de02.png)


# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の8日目として、Samba4を使って、ActiveDirectoryのドメインコントローラ総統の機能を実現することと、一式をdockerコンテナとして動かすことをトピックとして取り上げました。

EHW2018のネタとしては、このあと、いくつか開発環境整備系のネタを、なるべくめんどくさく実現していくことを考えています。