RaspberryPi上にドメインコントローラを構築する

ActiveDirectoryのドメインコントローラは長らくWindowsServerで構築しないと実用になりませんでしたが、世の中が進歩してWindowsServerを使用しなくてもほぼ実用できるようになりましたので、RaspberryPi上に構築してみました

WindowsServerでActiveDirectoryを構築しなかった理由

今回WindowsServerでActiveDirectoryを構築しなかった理由として

  • Windows10のマシンの認証環境はAzure Active Directoryに順次移行している
    Azure Active Directory とは
  • 今後認証必要になるのはAzure Active Directoryに対応していないWindows10以前のマシンだけになる
  • 現時点でWindowsServerを使用しないで構築できるActiveDirectoryはWindowsServer2008R2相当だが上記の理由で問題ないと判断した
  • 今後利用頻度の低くなっていく環境の認証環境として消費電力の大きいWindowsServerマシンを維持しつづけるのはどうだろうとの判断

などが挙げられます

どういう環境で構築するか?

WindowsServerを仮想環境で構築するというチョイスもありましたが、実験的なことをやってみようということでRaspberryPiで構築してみようということになりました
ラズベリーパイ Raspberry Pi 2 モデル B Raspberry Pi 2 Model B

設定メモ

今回は環境構築にMacOSXを利用した

Raspbian Stretch Liteをダウンロードする

https://downloads.raspberrypi.org/raspbian_lite_latest
ダウンロードしたzipアーカイブはThe Unarchiverを利用して解凍してimgファイルを取り出しておく

Raspbianを書き込む先になるmicroSDを特定する

今回は転がっていたmicroSDを再利用することにした

$ diskutil list
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.6 GB    disk4
   1:             Windows_FAT_32 boot                    43.8 MB    disk4s1
   2:                      Linux                         15.5 GB    disk4s2

※今回は/dev/disk4でmicroSDが認識されていた

RaspbianのOSイメージを書き込むためmicroSDをアンマウントする

$ sudo diskutil unmountDisk /dev/disk4
Password:
Unmount of all volumes on disk4 was successful

RaspbianのOSイメージをmicroSDに書き込む

$ sudo dd bs=1m if=~/Downloads/2017-09-07-raspbian-stretch-lite.img of=/dev/disk4
1768+1 records in
1768+1 records out
1854590976 bytes transferred in 1144.485245 secs (1620459 bytes/sec)

ssh接続を有効にしておく

bootとしてマウントされているWindows_FAT_32パーティションにsshという空ファイルを作成しておく

$ diskutil list
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.6 GB    disk4
   1:             Windows_FAT_32 boot                    43.8 MB    disk4s1
   2:                      Linux                         1.8 GB     disk4s2
$ touch /Volumes/boot/ssh

取り外したmicroSDをRaspberry Piに取り付けて起動する

$ sudo diskutil unmountDisk /dev/disk4
Password:
Unmount of all volumes on disk4 was successful

RaspberryPiにssh接続する

$ ssh [email protected]

※初期パスワード:raspberry

RaspberryPiに接続できたらとりあえずやっておくこと

  • パスワードは変更しておく

    $ passwd
    Changing password for pi.
    (current) UNIX password:
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    
  • 最新環境にアップデートして再起動する

    $ sudo apt-get update
    $ sudo apt-get -y upgrade
    $ sudo apt-get dist-upgrade
    $ sudo rpi-update
    $ sudo reboot
    
  • GPUメモリ割り当て

    $ sudo raspi-config nonint do_memory_split 16
    
  • TimeZoneの設定

    $ sudo timedatectl set-timezone Asia/Tokyo
    $ sudo dpkg-reconfigure -f noninteractive tzdata 
    
  • Localeを変更

    $ sudo perl -pe 's/^# (ja_JP.UTF-8 UTF-8)/$1/g' -i /etc/locale.gen
    $ sudo locale-gen
    $ sudo update-locale LANG=ja_JP.UTF-8
    $ sudo dpkg-reconfigure -f noninteractive locales
    
  • swapを使わない

    $ sudo systemctl disable dphys-swapfile
    $ sudo dphys-swapfile swapoff
    $ sudo apt-get -y remove dphys-swapfile
    
  • IPv6を無効化

    $ sudo bash -c "echo net.ipv6.conf.all.disable_ipv6 = 1 >> /etc/sysctl.conf"
    
  • よく使うものをインストールしておく

    $ sudo apt-get -y install git
    $ sudo apt-get -y install screen
    
  • IPアドレスとホスト名を設定しておく

    $ sudo nano /etc/dhcpcd.conf
    interface eth0
    static ip_address=192.168.0.253/24
    static routers=192.168.0.254
    static domain_name_servers=8.8.8.8
    $ sudo raspi-config nonint do_hostname dc.activedirectory.takeuchi.tk
    $ sudo nano /etc/hosts
    192.168.0.253   dc dc.activedirectory.takeuchi.tk
    

    以前によく見かけたほにゃらら.local的なドメインはおすすめしない
    AppleのBonjourもほにゃらら.localを名前解決に使うので非常にマッチングがわるい
    所有しているドメインのサブドメインを使うのが良さそう

Sambaをビルドに必要なパッケージをインストールする

$ sudo apt-get -y install acl attr autoconf bison build-essential \
  debhelper dnsutils docbook-xml docbook-xsl flex gdb krb5-user \
  libacl1-dev libaio-dev libattr1-dev libblkid-dev libbsd-dev \
  libcap-dev libcups2-dev libgnutls28-dev libjson-perl \
  libldap2-dev libncurses5-dev libpam0g-dev libparse-yapp-perl \
  libpopt-dev libreadline-dev perl perl-modules pkg-config \
  python-all-dev python-dev python-dnspython python-crypto \
  xsltproc zlib1g-dev

Sambaのソースコードアーカイブをダウンロードする

$ sudo mkdir /opt/samba
$ cd /opt/samba/
$ sudo wget https://download.samba.org/pub/samba/stable/samba-4.7.1.tar.gz

Sambaのソースコードアーカイブを展開してconfigure、make、install

# tar -zxf samba-4.7.1.tar.gz
# cd samba-4.7.1/
# ./configure
# make
Waf: Leaving directory `/opt/samba/samba-4.7.1/bin'
'build' finished successfully (2h4m29.497s)
# make install
Waf: Leaving directory `/opt/samba/samba-4.7.1/bin'
'install' finished successfully (28m9.799s)

ドメインコントローラを構築する

# /usr/local/samba/bin/samba-tool domain provision --use-rfc2307 --interactive --function-level=2008_R2
Realm [ACTIVEDIRECTORY.TAKEUCHI.TK]:
 Domain [ACTIVEDIRECTORY]:
 Server Role (dc, member, standalone) [dc]:
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
 DNS forwarder IP address (write 'none' to disable forwarding) [8.8.8.8]:
Administrator password:
Retype password:
Looking up IPv4 addresses
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=activedirectory,DC=takeuchi,DC=tk
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=activedirectory,DC=takeuhi,DC=tk
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 AD has been generated at /usr/local/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba AD server will be ready to use
Server Role:           active directory domain controller
Hostname:              dc
NetBIOS Domain:        ACTIVEDIRECTORY
DNS Domain:            activedirectory.takeuchi.tk
DOMAIN SID:            S-1-5-21-*-*-797587748

ドメインコントローラの構築に失敗したときは?

以下のコマンドを実行してドメインコントローラを構築を再実行してみる

# rm -rf /usr/local/samba/private/*
# rm -rf /usr/local/samba/etc/smb.conf
# rm -rf /usr/local/samba/var/locks/sysvol/*

Sambaの起動用スクリプトの作成

$ sudo wget "http://anonscm.debian.org/gitweb/?p=pkg-samba/samba.git;a=blob_plain;f=debian/samba.samba-ad-dc.init;h=3132d2e367675f822342a5b7bc2e50c046aa3b8f;hb=HEAD" -O /etc/init.d/samba-ad-dc 
$ sudo sed -i 's|/usr/sbin|/usr/local/samba/sbin|g' /etc/init.d/samba-ad-dc
$ sudo sed -i 's|/etc/samba|/usr/local/samba/etc|g' /etc/init.d/samba-ad-dc
$ sudo sed -i 's|/var/run/samba|/usr/local/samba/var/run|g' /etc/init.d/samba-ad-dc
$ sudo sed -i 's|samba-tool|/usr/local/samba/bin/samba-tool|g' /etc/init.d/samba-ad-dc
$ sudo chmod 755 /etc/init.d/samba-ad-dc
$sudo update-rc.d samba-ad-dc defaults

krb5.confの編集

$ sudo mv /etc/krb5.conf /etc/krb5.conf.orig
$ sudo cp /usr/local/samba/private/krb5.conf /etc
$ sudo nano /etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = ACTIVEDIRECTORY.TAKEUCHI.TK
 dns_lookup_realm = false
 dns_lookup_kdc = true

[realms]
 ACTIVEDIRECTORY.TAKEUCHI.TK = {
  kdc = dc.activedirectory.takeuchi.tk
 }

[domain_realm]
 .activedirectory.takeuchi.tk = ACTIVEDIRECTORY.TAKEUCHI.TK
 activedirectory.takeuchi.tk = ACTIVEDIRECTORY.TAKEUCHI.TK

起動テスト

$ sudo /etc/init.d/samba-ad-dc start
[ ok ] Starting samba-ad-dc (via systemctl): samba-ad-dc.service.

$ # sudo kinit [email protected]
Password for [email protected]:
Warning: Your password will expire in 41 days on 2017年12月31日 23時59分59秒

$ /usr/local/samba/bin/smbclient -L localhost -U%

        Sharename       Type      Comment
        ---------       ----      -------
        netlogon        Disk
        sysvol          Disk
        IPC$            IPC       IPC Service (Samba 4.7.1)
Reconnecting with SMB1 for workgroup listing.

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------

$ /usr/local/samba/bin/smbclient //dc.activedirectory.takeuchi.tk/netlogon -Uadministrator
Enter ACTIVEDIRECTORY\administrator's password:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Sun Nov 19 19:38:12 2017
  ..                                  D        0  Sun Nov 19 19:39:01 2017

                14902912 blocks of size 1024. 12176604 blocks available
smb: \> pwd
Current directory is \\dc.activedirectory.takeuchi.tk\netlogon\
smb: \> exit