2023年2月14日火曜日

UbuntuにActiveDirectoryをdockerで構築する方法

UbuntuにActiveDirectoryをdockerで構築する方法

概要

Samba をベースに bind や ldap と組み合わせると ActiveDirectory DC (Domain Controller) を構築できるようなのでやってみました

環境

  • Ubuntu 18.04
  • Samba 4

使用するイメージ

今回はこちらを使用します

公式などではないので注意が必要です
ActiveDirectory Domain Controller (以下、ADDC) に必要なコンポーネントが一式詰まっているイメージになります

事前準備

いくつか事前準備が必要なのでやっていきます

仮想ネットワークの作成

検証用なので作成します
本来は ADDC を配置したいネットワーク上に配置すれば OK です
またコンポーネントとして DNS (bind) があるので DNS がすでにネットワーク上に存在する場合は一旦停止するか存在しないネットワーク上にデプロイしましょう

  • sudo ifconfig ens192:1 192.168.3.222 netmask 255.255.255.0 up
  • sudo systemctl stop bind9

ADDC用のデータディレクトリ作成

永続化用に作成します

  • mkdir data
  • mkdir config
  • chmod -R 777 data
  • chmod -R 777 cofig

ADDCコンテナの作成

ではコンテナを起動していきます
まずは完成形は以下の通りとなります

docker run -t -i \
  -e "DOMAIN=CORP.EXAMPLE.COM" \
  -e "DOMAINPASS=yourAdminPassword" \
  -e "HOSTIP=192.168.3.222" \
  -e "INSECURELDAP=true" \
  -p 192.168.3.222:53:53 \
  -p 192.168.3.222:53:53/udp \
  -p 192.168.3.222:88:88 \
  -p 192.168.3.222:88:88/udp \
  -p 192.168.3.222:135:135 \
  -p 192.168.3.222:137-138:137-138/udp \
  -p 192.168.3.222:139:139 \
  -p 192.168.3.222:389:389 \
  -p 192.168.3.222:389:389/udp \
  -p 192.168.3.222:445:445 \
  -p 192.168.3.222:464:464 \
  -p 192.168.3.222:464:464/udp \
  -p 192.168.3.222:636:636 \
  -p 192.168.3.222:1024-1044:1024-1044 \
  -p 192.168.3.222:3268-3269:3268-3269 \
  -v /etc/localtime:/etc/localtime:ro \
  -v $(pwd)/data/:/var/lib/samba \
  -v $(pwd)/config:/etc/samba/external \
  --dns-search corp.example.com \
  --dns 192.168.3.222 \
  --add-host localdc.corp.example.com:192.168.3.222 \
  -h localdc \
  --name samba \
  --privileged \
  nowsci/samba-domain

ちょっと解説

DOMAIN の部分は ldap で言うところの dc に割り当てられます
あとで ldapsearch の動作確認コマンドも紹介しますがそこで使用します

DOMAINPASS は Administrator ユーザ用のパスワードになります
ADDC の場合少し特殊なパスワードポリシーがありいろいろと面倒なので INSECURELDAP を true にすることで回避しています

これが false のままだと

ldap_bind: Strong(er) authentication required (8)
        additional info: BindSimple: Transport encryption required.

というエラーが発生するのでそれの対処として設定します

各種ポートは必須になります
バインドするポートは作成した仮想ネットワーク上の IP を使ってバインドします

あとは特権を付与するのと必要なデータ領域のマウントをして起動してあげます

起動ログ

一応記載しておきます

Looking up IPv6 addresses
No IPv6 address will be assigned
Setting up share.ldb
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=corp,DC=example,DC=com
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=corp,DC=example,DC=com
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /var/lib/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba4 server will be ready to use
Server Role:           active directory domain controller
Hostname:              localdc
NetBIOS Domain:        CORP
DNS Domain:            corp.example.com
DOMAIN SID:            S-1-5-21-3454798468-3565208184-955098804
/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.
  'Supervisord is running as root and it is searching '
2023-02-08 09:00:30,600 CRIT Supervisor running as root (no user in config file)
2023-02-08 09:00:30,600 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
2023-02-08 09:00:30,608 INFO RPC interface 'supervisor' initialized
2023-02-08 09:00:30,608 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2023-02-08 09:00:30,608 INFO supervisord started with pid 17
2023-02-08 09:00:31,611 INFO spawned: 'samba' with pid 20
2023-02-08 09:00:32,796 INFO success: samba entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

動作確認

ldapsearch を使って ADDC にアクセスできるか確認します

LDAPTLS_REQCERT=never ldapsearch -x -b "dc=corp,dc=example,dc=com" -H ldap://192.168.3.222 -D "CN=Administrator,CN=Users,DC=CORP,DC=EXAMPLE,DC=COM" -w "yourAdminPassword"

とりあえずこれでいろいろと ADDC 内のエントリが検索できるのが確認できるかなと思います

自分が試した感じだと numResponses で 265 返却されました

LDAPTLS_REQCERT=never はなくても動作するかもしれません

最後に

Ubuntu に ADDC を構築してみました
今回は docker イメージを使用したので内部的に構成など詳しいことを気にせずサクっと構築しました
検証などではこのような方法で全然問題ないですが実際に運用する場合に理解を深めるためにも一から手動で構築してみるのもいいかなと思います

Tips

仮想ネットワークを作成しないで既存のネットワーク上にデプロイすることもできます

既存のネットワーク上ですでに bind9 などが動作している場合はそちらに Forward するような設定にしても OK です

例えば既存のネットワークである 10.100.xxx.xxx という IP アドレス対して動作させたい場合は以下のようになります

10.100.xxx.xxx ではすでに bind9 が動作しているのでそちらに forward するのと ADDC では 53 ポートを EXPOSE しないようにします

docker run -t -i \
  -e "DOMAIN=CORP.EXAMPLE.COM" \
  -e "DOMAINPASS=xxx" \
  -e "DNSFORWARDER=10.100.xxx.xxx" \
  -e "HOSTIP=10.100.xxx.xxx" \
  -e "INSECURELDAP=true" \
  -p 88:88 \
  -p 88:88/udp \
  -p 135:135 \
  -p 137-138:137-138/udp \
  -p 139:139 \
  -p 389:389 \
  -p 389:389/udp \
  -p 445:445 \
  -p 464:464 \
  -p 464:464/udp \
  -p 636:636 \
  -p 1024-1044:1024-1044 \
  -p 3268-3269:3268-3269 \
  -v /etc/localtime:/etc/localtime:ro \
  -v $(pwd)/data/:/var/lib/samba \
  -v $(pwd)/config:/etc/samba/external \
  --dns-search corp.example.com \
  --dns 10.100.xxx.xxx \
  --add-host localdc.corp.example.com:10.100.xxx.xxx \
  -h localdc \
  --name samba \
  --privileged \
  nowsci/samba-domain

参考サイト

0 件のコメント:

コメントを投稿