Proxmox上でSamba4 Active Directoryを構築

Linux

自宅にSamba4 Active Directoryを導入しましたので構築方法を記載します。

Active Directoryは、MicroSoft Windows Serverにある一つの機能で、企業がWindows PCのアカウント管理を一元化するために導入されています。

Windows Server機は高額で個人の手に届かないことから、今回はWindows ServerのADと互換性のあるSamba4のActive Directoryで代用する方法を記載します。

Samba4 ADの制約

Samba4のActive Directoryは、Windows Serverと比べていくつかの機能制約があります。

  • SYSVOLのレプリケーションが出来ない:追加ADサーバーを構築した際、SambaはSYSVOLのレプリケーション機能(自動コピー)を持ちません。rsyncなどで対処は出来ますが相当のLinux知識は必要となります。
  • Internal DNSの機能制限:SambaはADフォレストルートドメインの名前変更をサポートしていません。複数のADを稼働させる必要に迫られた場合は、Linuxのbind9に切り替える、もしくは、Windows Server機に切り替えてSIerに外部委託するほうが本業に専念できて良いと思います。

いずれの制約も企業規模が大きくなった場合に影響が出るくらいです。

1拠点であればSamba4でも十分運用に耐えれると思います。(Unixがさわれる担当は必要ですが)

環境整備とパラメータ設計

本記事は以下のハードウェア環境で構築しています。

  • ハードウェア:自作PC(Core i7-10700(8C/16T) , Mem 16G)にProxmox8を構築
  • OSバージョン:Ubuntu22.04LTS(ゲストOSとして2コアを割り当て)
  • SAMBAバージョン:4.15.13(記事記載時点でaptに上がってる最新バージョン)
  • AD構成:1台(小規模ですので当面は1台で運用します)

設定パラメータ

ADの運用を始めると設定を変えにくいため、設定パラメータは近い将来を考えて決定しておきます。

項目 備考
ドメイン名 falcon.local.org インターネット上に存在しない名称にする

「~.local」は使えない

ホスト名 ad1 ad2, ad3の拡張ができるようにするとあとあと便利
IPアドレス 192.168.0.121/24
完全修飾ドメイン名(FQDN) ad1.falcon.local.org
レルム FALCON.LOCAL.ORG

サーバーの事前設定

Windows端末との接続環境を構築

Proxmoxのコンソール画面ではコピペができませんので、Windows PCのTeratermで接続し、作業を進めるようにします。

Ubuntu側にsshをインストールします。

$ sudo apt install openssh-server

sshをインストール後、WindowsPCのteratermからSSHで接続します。

teratermはVer.4を使うほうが良いです。

Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 6.8.0-40-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.

0のアップデートはすぐに適用されます。

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

Last login: Sun Sep  8 16:02:55 2024 from 192.168.0.102
falcon@ad1:~$

AD構築作業はsuper userで行うため、"sudo su"で特権を取得します。

falcon@ad1:~$ sudo su
[sudo] falcon のパスワード:
root@ad1:/home/falcon#

設定ファイルの編集ですが、viエディタの操作が少々苦手なので、ubuntuにプリインストールされているnanoエディタを使いました。

ファイルシステムのサポート確認

カーネルでext4のACLサポートが有効になっていることを確認します。

# cat /boot/config-`uname -r`| grep -e CONFIG_EXT4_FS_SECURITY -e CONFIG_EXT4_FS_POSIX_ACL
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
File System Support - SambaWiki

ホスト名の設定

ホスト名に"ad1"が設定されていることを確認します。

# hostnamectl
 Static hostname: ad1
       Icon name: computer-vm
         Chassis: vm
      Machine ID: 13377827e5ae4da3bbeb66d6132935ad
         Boot ID: 7fa79480a19242268b9a6ed1e3b1f9c0
  Virtualization: kvm
Operating System: Ubuntu 22.04.4 LTS
          Kernel: Linux 6.8.0-40-generic
    Architecture: x86-64

hostsファイルの編集

/etc/hostsファイルに"ad1"のアドレスを追記します。

# cat /etc/hosts
127.0.0.1       localhost
192.168.0.121   ad1.falcon.local.org ad1

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

FQDN(ad1.falcon.local.org)にpingし、疎通できることを確認します。

# ping ad1.falcon.local.org
PING ad1.falcon.local.org (192.168.0.121) 56(84) bytes of data.
64 bytes from ad1.falcon.local.org (192.168.0.121): icmp_seq=1 ttl=64 time=0.014 ms
64 bytes from ad1.falcon.local.org (192.168.0.121): icmp_seq=2 ttl=64 time=0.015 ms
64 bytes from ad1.falcon.local.org (192.168.0.121): icmp_seq=3 ttl=64 time=0.017 ms

DNS設定

DNSはsamba4に内包されるモジュールを使いますが、Ubuntuの"systemd-resolved"が"/etc/resolv.conf"を書き換えてしまうため、"systemd-resolved"を無効化し、自動起動しないようにします。

# systemctl stop systemd-resolved.service
# systemctl disable systemd-resolved.service
# systemctl status systemd-resolved.service
○ systemd-resolved.service - Network Name Resolution
     Loaded: loaded (/lib/systemd/system/systemd-resolved.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:systemd-resolved.service(8)
             man:org.freedesktop.resolve1(5)
             https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
             https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
....

Active: inactive (dead)であれば、無効化設定は完了です。

/etc/resolve.confの作成

"/etc/resolv.conf"が、"/run/systemd/resolve/stub-resolv.conf"のシンボリックリンクとなっているため削除します。

# unlink /etc/resolv.conf

ad1のDNS用に"/etc/resolv.conf"を新規作成します。

# nano /etc/resolv.conf

設定は以下の通り記述します。後の工程でインターネットに出る必要がありますので、1番目はこのad、2番目にgoogle DNS(8.8.8.8)を設定します。

# cat /etc/resolv.conf
nameserver 192.168.0.121
nameserver 8.8.8.8

search falcon.local.org

ubuntuのネットワークインタフェース設定がnetplanに移行しているため、/etc/netplanの99番に新規設定を行います。

# nano /etc/netplan/99-cfg-proxmox.yaml

設定値はresolv.confのnameserverと値を合わせます。

"ens18"はLANインタフェース名称です。この値はPC環境により変動するため、事前に「ip a」コマンドでインタフェース確認した値を記述してください。

# cat 99-cfg-proxmox.yaml
# Generated by falconblog.org
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.0.121/24
      gateway4: 192.168.0.1
      nameservers:
        addresses:
          - [192.168.0.121, 8.8.8.8]

記述に誤りがないことを確認して、applyにより有効化します。

重要:netplanの値を間違うと通信が切断されて復旧が困難になります。記述内容は再度確認するようにします。

# netplan apply
** (process:22400): WARNING **: 17:10:45.523: `gateway4` has been deprecated, use default routes instead.

参考:"gateway4"の記述でWARNINGが出力されます。これはnetplan設定の移行期で記述が古いとされているため、現時点では放置しても大丈夫のようです。(今後のバージョンからはErrorになるかもしれません。)

NTPの設定

ADのkerberos認証においては時刻同期が必要であるため、今回はNTPサーバー機能を持つchronyを導入します。

# apt install chrony

chrony.confに設定を記述します。

# nano /etc/chrony/chrony.conf

ntpサーバーはNICTのみとし、デフォルトのubuntu ntpサーバーはすべてコメントアウトします。

またDNSサーバーの同期対象マシンをセグメント内の端末(192.168.0.0/24)に制限するよう追記します。

#pool ntp.ubuntu.com        iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
pool ntp.nict.jp iburst
allow 192.168.0.0/24

chronyサービスを再起動し、時刻同期が出来ていることを確認します。

# systemctl restart chrony
# systemctl status chrony
● chrony.service - chrony, an NTP client/server
     Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-09-06 11:22:11 JST; 6s ago
       Docs: man:chronyd(8)
             man:chronyc(1)
             man:chrony.conf(5)
    Process: 12491 ExecStart=/usr/lib/systemd/scripts/chronyd-starter.sh $DAEMON_OPTS (code=exited, status=0/SUCCESS)
   Main PID: 12501 (chronyd)
      Tasks: 2 (limit: 4608)
     Memory: 1.4M
        CPU: 36ms
     CGroup: /system.slice/chrony.service
             tq12501 /usr/sbin/chronyd -F 1
             mq12502 /usr/sbin/chronyd -F 1

 9月 06 11:22:11 ad1 systemd[1]: Starting chrony, an NTP client/server...
 9月 06 11:22:11 ad1 chronyd[12501]: chronyd version 4.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDN>
 9月 06 11:22:11 ad1 chronyd[12501]: Frequency -0.185 +/- 22.681 ppm read from /var/lib/chrony/chrony.drift
 9月 06 11:22:11 ad1 chronyd[12501]: Using right/UTC timezone to obtain leap second data
 9月 06 11:22:11 ad1 chronyd[12501]: Loaded seccomp filter (level 1)
 9月 06 11:22:11 ad1 systemd[1]: Started chrony, an NTP client/server.

同期ソースの確認も行っておきます。

# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ ntp-b2.nict.go.jp             1   6   177     3   -327us[ -327us] +/- 5125us
^* ntp-k1.nict.jp                1   6   177     4   -172us[ -188us] +/- 2851us
^+ ntp-a3.nict.go.jp             1   6   177     4   -490us[ -490us] +/- 5277us
^+ ntp-a2.nict.go.jp             1   6   177     4   -386us[ -386us] +/- 5458us

chronyサービスは、インストール時に自動起動で設定されていますので、後処理は不要でした。

# systemctl list-unit-files | grep chrony
chrony-dnssrv@.service                         static          -
chrony.service                                 enabled         enabled
chronyd.service                                alias           -
chrony-dnssrv@.timer                           disabled        enabled

SAMBAインストールと設定

SAMBAのインストール

aptコマンドでSAMBAインストールを行います。

# apt-get install acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle

Sambaバージョンにより必要モジュールが変わる可能性があるため、構築時は以下HPも参照するようにしてください。

Distribution-specific Package Installation - SambaWiki

インストールが始まると、レルム、Kerberosサーバー名(FQDN)、Kerberos管理サーバー名(FQDN)を入れるピンク色の画面になりますので、最初に決めた値を入力していきます。

  • Realm: FALCON.LOCAL.ORG (大文字で入れる)
  • Kerberos servers: ad1.falcon.local.org
  • Administrative server: ad1.falcon.local.org

参考:ここで入力を間違えた場合は、apt purgeコマンドでモジュールを削除し、インストールからやり直しするほうが手っ取り早いです。

# apt-get purge acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle

不要サービスの停止

samba-ad-dcの動作障害になるsamba、nmbd、winbindサービスを停止します。

# systemctl stop smbd nmbd winbind
# systemctl disable smbd nmbd winbind
# systemctl mask smbd nmbd winbind

samba-ad-dcの自動起動設定

マシン起動時にsamba-ad-dcが起動するようsystemctlの設定を行います。

後作業でも良いのですが、忘れてしまいがちなのでこのタイミングで処置しておきます。

# systemctl unmask samba-ad-dc
# systemctl enable samba-ad-dc

Active Directoryプロビジョニング

samba-toolでADの設定を行います。

/etc/smb.confが存在すると設定に失敗しますので、リネームしておきます。削除しても構いません。

# mv /etc/samba/smb.conf /etc/samba/smb.conf.org

samba-toolを用いてプロビジョニング設定を行います。

インターネットサイトに出る必要があるため、DNS forwarderのみ8.8.8.8(google_DNS)に設定します。

# samba-tool domain provision --use-rfc2307 --interactives
Realm [FALCON.LOCAL.ORG]:  そのままEnter
Domain [FALCON]:  そのままEnter
Server Role (dc, member, standalone) [dc]:  そのままEnter
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:  そのままEnter
DNS forwarder IP address (write 'none' to disable forwarding) [192.168.0.121]:  8.8.8.8 ←入力する
Administrator password: (入力する)
Retype password: (入力する)

オプション設定の詳細は、以下HPを参考にしてください。

Setting up Samba as an Active Directory Domain Controller - SambaWiki

パスワードの入力が終わると、pythonスクリプトにより設定が行われます。

これまでの設定に不備があると、このスクリプト動作中に止まります。

設定をミスった場合は、apt purgeでアプリをアンインストールし、最初からやり直すほうが早いです。

INFO 2024-09-06 11:25:53,613 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2108: Looking up IPv4 addresses
INFO 2024-09-06 11:25:53,613 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2125: Looking up IPv6 addresses
WARNING 2024-09-06 11:25:53,613 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2132: No IPv6 address will be assigned
INFO 2024-09-06 11:25:53,768 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2278: Setting up secrets.ldb
INFO 2024-09-06 11:25:54,092 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2283: Setting up the registry
INFO 2024-09-06 11:25:54,297 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2286: Setting up the privileges database
INFO 2024-09-06 11:25:54,924 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2289: Setting up idmap db
INFO 2024-09-06 11:25:55,415 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2296: Setting up SAM db
INFO 2024-09-06 11:25:55,528 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #880: Setting up sam.ldb partitions and settings
INFO 2024-09-06 11:25:55,529 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #892: Setting up sam.ldb rootDSE
INFO 2024-09-06 11:25:55,606 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1305: Pre-loading the Samba 4 and AD schema
Unable to determine the DomainSID, can not enforce uniqueness constraint on local domainSIDs

INFO 2024-09-06 11:25:55,806 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1383: Adding DomainDN: DC=falcon,DC=local,DC=org
INFO 2024-09-06 11:25:55,936 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1415: Adding configuration container
INFO 2024-09-06 11:25:56,072 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1430: Setting up sam.ldb schema
INFO 2024-09-06 11:25:57,759 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1448: Setting up sam.ldb configuration data
INFO 2024-09-06 11:25:57,850 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1489: Setting up display specifiers
INFO 2024-09-06 11:25:58,925 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1497: Modifying display specifiers and extended rights
INFO 2024-09-06 11:25:58,948 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1504: Adding users container
INFO 2024-09-06 11:25:58,948 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1510: Modifying users container
INFO 2024-09-06 11:25:58,949 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1513: Adding computers container
INFO 2024-09-06 11:25:58,950 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1519: Modifying computers container
INFO 2024-09-06 11:25:58,950 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1523: Setting up sam.ldb data
INFO 2024-09-06 11:25:59,025 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1553: Setting up well known security principals
INFO 2024-09-06 11:25:59,050 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1567: Setting up sam.ldb users and groups
INFO 2024-09-06 11:25:59,113 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #1575: Setting up self join
Repacking database from v1 to v2 format (first record CN=Network-Address,CN=Schema,CN=Configuration,DC=falcon,DC=local,DC=org)
Repack: re-packed 10000 records so far
Repacking database from v1 to v2 format (first record CN=remoteStorageServicePoint-Display,CN=413,CN=DisplaySpecifiers,CN=Configuration,DC=falcon,DC=local,DC=org)
Repacking database from v1 to v2 format (first record CN=82112ba0-7e4c-4a44-89d9-d46c9612bf91,CN=Operations,CN=DomainUpdates,CN=System,DC=falcon,DC=local,DC=org)
INFO 2024-09-06 11:26:01,487 pid:13456 /usr/lib/python3/dist-packages/samba/provision/sambadns.py #1200: Adding DNS accounts
INFO 2024-09-06 11:26:01,776 pid:13456 /usr/lib/python3/dist-packages/samba/provision/sambadns.py #1234: Creating CN=MicrosoftDNS,CN=System,DC=falcon,DC=local,DC=org
INFO 2024-09-06 11:26:01,787 pid:13456 /usr/lib/python3/dist-packages/samba/provision/sambadns.py #1247: Creating DomainDnsZones and ForestDnsZones partitions
INFO 2024-09-06 11:26:02,062 pid:13456 /usr/lib/python3/dist-packages/samba/provision/sambadns.py #1252: Populating DomainDnsZones and ForestDnsZones partitions
Repacking database from v1 to v2 format (first record DC=f.root-servers.net,DC=RootDNSServers,CN=MicrosoftDNS,DC=DomainDnsZones,DC=falcon,DC=local,DC=org)
Repacking database from v1 to v2 format (first record DC=_ldap._tcp.2b89b40a-ac64-4612-a862-3af6228de26b.domains,DC=_msdcs.falcon.local.org,CN=MicrosoftDNS,DC=ForestDnsZones,DC=falcon,DC=local,DC=org)
INFO 2024-09-06 11:26:02,835 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2012: Setting up sam.ldb rootDSE marking as synchronized
INFO 2024-09-06 11:26:02,879 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2017: Fixing provision GUIDs
INFO 2024-09-06 11:26:03,823 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2348: A Kerberos configuration suitable for Samba AD has been generated at /var/lib/samba/private/krb5.conf
INFO 2024-09-06 11:26:03,823 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2350: Merge the contents of this file with your system krb5.conf or replace it with this one. Do not create a symlink!
INFO 2024-09-06 11:26:04,022 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2082: Setting up fake yp server settings
INFO 2024-09-06 11:26:04,221 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #487: Once the above files are installed, your Samba AD server will be ready to use
INFO 2024-09-06 11:26:04,221 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #492: Server Role:           active directory domain controller
INFO 2024-09-06 11:26:04,221 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #493: Hostname:              ad1
INFO 2024-09-06 11:26:04,221 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #494: NetBIOS Domain:        FALCON
INFO 2024-09-06 11:26:04,221 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #495: DNS Domain:            falcon.local.org
INFO 2024-09-06 11:26:04,221 pid:13456 /usr/lib/python3/dist-packages/samba/provision/__init__.py #496: DOMAIN SID:            S-1-5-21-3194861734-1142622192-218957921

作成されたsmb.confの確認をします。

# cat /etc/samba/smb.conf
# Global parameters
[global]
        dns forwarder = 8.8.8.8
        netbios name = AD1
        realm = FALCON.LOCAL.ORG
        server role = active directory domain controller
        workgroup = FALCON
        idmap_ldb:use rfc2307 = yes

[sysvol]
        path = /var/lib/samba/sysvol
        read only = No

[netlogon]
        path = /var/lib/samba/sysvol/falcon.local.org/scripts
        read only = No

Kerberosファイルのコピー

Kerberosファイル(krb5.conf)も生成されているのでコピーします。

krb5.confは手動でコピーする必要があります。

# mv /etc/krb5.conf /etc/krb5.conf.org
# cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

/etc/krb5.confの内容も確認します。

# cat /etc/krb5.conf
[libdefaults]
        default_realm = FALCON.LOCAL.ORG
        dns_lookup_realm = false
        dns_lookup_kdc = true

[realms]
FALCON.LOCAL.ORG = {
        default_domain = falcon.local.org
}

[domain_realm]
        ad1 = FALCON.LOCAL.ORG

Samba AD起動と動作確認

samba-ad-dcを起動し、動作状態を確認します。

# systemctl start samba-ad-dc
# systemctl status samba-ad-dc
● samba-ad-dc.service - Samba AD Daemon
     Loaded: loaded (/lib/systemd/system/samba-ad-dc.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-09-06 11:24:35 JST; 2min 11s ago
       Docs: man:samba(8)
             man:samba(7)
             man:smb.conf(5)
   Main PID: 13025 (samba)
     Status: "samba: ready to serve connections..."
      Tasks: 60 (limit: 4608)
     Memory: 200.5M
        CPU: 1.528s
     CGroup: /system.slice/samba-ad-dc.service
             tq13025 "samba: root process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13026 "samba: tfork waiter process(13027)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13027 "samba: task[s3fs] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13028 "samba: tfork waiter process(13030)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13029 "samba: tfork waiter process(13031)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13030 "samba: task[rpc] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13031 /usr/sbin/smbd -D "--option=server role check:inhibit=yes" --foreground ""
             tq13032 "samba: tfork waiter process(13033)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13033 "samba: task[nbt] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13034 "samba: tfork waiter process(13035)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13035 "samba: task[wrepl] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13036 "samba: tfork waiter process(13038)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13037 "samba: tfork waiter process(13039)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13038 "samba: task[rpc] pre-forked worker(0)" "" "" "" "" "" "" "" "" "" ""
             tq13039 "samba: task[ldap] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13040 "samba: tfork waiter process(13041)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13041 "samba: task[rpc] pre-forked worker(1)" "" "" "" "" "" "" "" "" "" ""
             tq13042 "samba: tfork waiter process(13044)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13043 "samba: tfork waiter process(13045)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13044 "samba: task[cldap] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13045 "samba: task[rpc] pre-forked worker(2)" "" "" "" "" "" "" "" "" "" ""
             tq13046 "samba: tfork waiter process(13047)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13047 "samba: task[kdc] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13048 "samba: tfork waiter process(13049)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13049 "samba: task[rpc] pre-forked worker(3)" "" "" "" "" "" "" "" "" "" ""
             tq13050 "samba: tfork waiter process(13052)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13051 "samba: tfork waiter process(13053)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13052 "samba: task[drepl] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13053 "samba: task[kdc] pre-forked worker(0)" "" "" "" "" "" "" "" "" "" ""
             tq13054 "samba: tfork waiter process(13055)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13055 "samba: task[kdc] pre-forked worker(1)" "" "" "" "" "" "" "" "" "" ""
             tq13056 "samba: tfork waiter process(13058)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13057 "samba: tfork waiter process(13059)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13058 "samba: task[winbindd] pre-fork master" "" "" "" "" "" "" "" "" "" ""
             tq13059 "samba: task[kdc] pre-forked worker(2)" "" "" "" "" "" "" "" "" "" ""
             tq13060 "samba: tfork waiter process(13063)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13061 "samba: tfork waiter process(13064)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13062 "samba: tfork waiter process(13065)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13063 "samba: task[kdc] pre-forked worker(3)" "" "" "" "" "" "" "" "" "" ""
             tq13064 "samba: task[ntp_signd] pre-fork master" "" "" "" "" "" "" "" "" ""
             tq13065 /usr/sbin/winbindd -D "--option=server role check:inhibit=yes" --foreground ""
             tq13066 "samba: tfork waiter process(13067)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13067 "samba: task[kcc] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13068 "samba: tfork waiter process(13069)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13069 "samba: task[dnsupdate] pre-fork master" "" "" "" "" "" "" "" "" ""
             tq13070 "samba: tfork waiter process(13071)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13071 "samba: task[dns] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13078 /usr/sbin/smbd -D "--option=server role check:inhibit=yes" --foreground ""
             tq13079 /usr/sbin/smbd -D "--option=server role check:inhibit=yes" --foreground ""
             tq13083 "winbindd: domain child [FALCONBLOG]" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "">
             tq13084 "winbindd: idmap child" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ">
             tq13097 "samba: tfork waiter process(13098)" "" "" "" "" "" "" "" "" "" "" "" "" ""
lines 1-64             tq13098 "samba: task[ldap] pre-forked worker(0)" "" "" "" "" "" "" "" "" ""
             tq13099 "samba: tfork waiter process(13100)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13100 "samba: task[ldap] pre-forked worker(1)" "" "" "" "" "" "" "" "" ""
             tq13101 "samba: tfork waiter process(13102)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13102 "samba: task[ldap] pre-forked worker(2)" "" "" "" "" "" "" "" "" ""
             tq13103 "samba: tfork waiter process(13104)" "" "" "" "" "" "" "" "" "" "" "" "" ""
             tq13104 "samba: task[ldap] pre-forked worker(3)" "" "" "" "" "" "" "" "" ""
             mq13105 /usr/lib/x86_64-linux-gnu/samba/samba-bgqd --ready-signal-fd=47 --parent-watch-fd=13 --debuglevel=0 -F

 9月 06 11:24:35 ad1 samba[13025]:   binary_smbd_main: samba: using 'prefork' process model
 9月 06 11:24:35 ad1 systemd[1]: Started Samba AD Daemon.
 9月 06 11:24:35 ad1 smbd[13031]: [2024/09/06 11:24:35.930489,  0] ../../source3/smbd/server.c:1734(main)
 9月 06 11:24:35 ad1 smbd[13031]:   smbd version 4.15.13-Ubuntu started.
 9月 06 11:24:35 ad1 smbd[13031]:   Copyright Andrew Tridgell and the Samba Team 1992-2021
 9月 06 11:24:35 ad1 winbindd[13065]: [2024/09/06 11:24:35.972122,  0] ../../source3/winbindd/winbindd.c:1722(main)
 9月 06 11:24:35 ad1 winbindd[13065]:   winbindd version 4.15.13-Ubuntu started.
 9月 06 11:24:35 ad1 winbindd[13065]:   Copyright Andrew Tridgell and the Samba Team 1992-2021
 9月 06 11:24:36 ad1 winbindd[13065]: [2024/09/06 11:24:36.213194,  0] ../../source3/winbindd/winbindd_cache.c:3085(initialize_win>
 9月 06 11:24:36 ad1 winbindd[13065]:   initialize_winbindd_cache: clearing cache and re-creating with version number 2

「Active Running」が表示され、「Started Samba AD Daemon」であれば、ADは正常動作しています。

参考:以下はドメインが重複していた場合のFailログ(一部)になります。この場合はインストールからやり直しが良いでしょう。

9月 06 10:49:10 ad1 samba[11057]: [2024/09/06 10:49:10.072324,  0] ../../lib/util/util_runcmd.c:355(samba_runcmd_io_handler)
9月 06 10:49:10 ad1 samba[11057]:   /usr/sbin/samba_dnsupdate:   File "/usr/sbin/samba_dnsupdate", line 181, in get_credentials
9月 06 10:49:10 ad1 samba[11057]: [2024/09/06 10:49:10.072344,  0] ../../lib/util/util_runcmd.c:355(samba_runcmd_io_handler)
9月 06 10:49:10 ad1 samba[11057]:   /usr/sbin/samba_dnsupdate:     creds.get_named_ccache(lp, ccachename)
9月 06 10:49:10 ad1 samba[11057]: [2024/09/06 10:49:10.072360,  0] ../../lib/util/util_runcmd.c:355(samba_runcmd_io_handler)
9月 06 10:49:10 ad1 samba[11057]:   /usr/sbin/samba_dnsupdate: RuntimeError: kinit for AD1$@FALCONBLOG.ORG failed (Cannot contact>
9月 06 10:49:10 ad1 samba[11057]: [2024/09/06 10:49:10.072383,  0] ../../lib/util/util_runcmd.c:355(samba_runcmd_io_handler)
9月 06 10:49:10 ad1 samba[11057]:   /usr/sbin/samba_dnsupdate:
9月 06 10:49:10 ad1 samba[11057]: [2024/09/06 10:49:10.091632,  0] ../../source4/dsdb/dns/dns_update.c:85(dnsupdate_nameupdate_do>
9月 06 10:49:10 ad1 samba[11057]:   dnsupdate_nameupdate_done: Failed DNS update with exit code 1

時刻同期chronyの設定

Kerberos認証を機能させるには時刻同期が必須となります。

今回は時刻同期にchronyを使いましたのでchronyとKerberosの紐づけ設定を進めます。

参考:内蔵NTPを使う場合は以下HPを参照してください。

Time Synchronisation - SambaWiki

ntp_signdが_chronyグループからアクセスできるように権限を与えます。

# chown root:_chrony /var/lib/ntp_signd/
# chmod 750 /var/lib/ntp_signd/

/etc/chrony/chrony.confを編集します。

# nano /etc/chrony/chrony.conf

chrony.confの適当な場所に以下の設定を追記します。

# ipaddress of this DC
bindcmdaddress 192.168.0.121 
ntpsigndsocket /var/lib/ntp_signd

設定反映してステータス確認をします。「MS-SNTP authentication enabled」が出ていれば紐づけ設定は完了です。

# systemctl restart chronyd
# systemctl status chronyd
● chrony.service - chrony, an NTP client/server
     Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-09-08 19:31:49 JST; 9s ago
       Docs: man:chronyd(8)
             man:chronyc(1)
             man:chrony.conf(5)
    Process: 22796 ExecStart=/usr/lib/systemd/scripts/chronyd-starter.sh $DAEMON_OPTS (code=exited, status=0/SUCCESS)
   Main PID: 22807 (chronyd)
      Tasks: 2 (limit: 4608)
     Memory: 1.3M
        CPU: 34ms
     CGroup: /system.slice/chrony.service
             tq22807 /usr/sbin/chronyd -F 1
             mq22808 /usr/sbin/chronyd -F 1

 9月 08 19:31:49 ad1 systemd[1]: Starting chrony, an NTP client/server...
 9月 08 19:31:49 ad1 chronyd[22807]: chronyd version 4.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +A>
 9月 08 19:31:49 ad1 chronyd[22807]: Frequency -0.176 +/- 0.051 ppm read from /var/lib/chrony/chrony.drift
 9月 08 19:31:49 ad1 chronyd[22807]: Using right/UTC timezone to obtain leap second data
 9月 08 19:31:49 ad1 chronyd[22807]: MS-SNTP authentication enabled
 9月 08 19:31:49 ad1 chronyd[22807]: Loaded seccomp filter (level 1)
 9月 08 19:31:49 ad1 systemd[1]: Started chrony, an NTP client/server.
 9月 08 19:31:54 ad1 chronyd[22807]: Selected source 61.205.120.130 (ntp.nict.jp)
 9月 08 19:31:54 ad1 chronyd[22807]: System clock TAI offset set to 37 seconds

以上で設定作業は終了です。

Samba ADの動作確認

サーバー動作確認

Listenポートの確認

net-toolをインストールし、Listenポートを確認することで、ADのサービスポートが動いていることを確認します。

ubuntu標準のdaemonが動いていると正常に動作しません。その場合は、systemctl stop, disableでkillしておきます。

# apt install net-tools
# netstat -antp | egrep "sambad|samba"
tcp        0      0 0.0.0.0:3269            0.0.0.0:*               LISTEN      13538/samba: task[l
tcp        0      0 0.0.0.0:3268            0.0.0.0:*               LISTEN      13538/samba: task[l
tcp        0      0 0.0.0.0:636             0.0.0.0:*               LISTEN      13538/samba: task[l
tcp        0      0 0.0.0.0:135             0.0.0.0:*               LISTEN      13535/samba: task[r
tcp        0      0 0.0.0.0:49153           0.0.0.0:*               LISTEN      13535/samba: task[r
tcp        0      0 0.0.0.0:49152           0.0.0.0:*               LISTEN      13528/samba: task[r
tcp        0      0 0.0.0.0:49154           0.0.0.0:*               LISTEN      13535/samba: task[r
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      13569/samba: task[d
tcp        0      0 0.0.0.0:88              0.0.0.0:*               LISTEN      13545/samba: task[k
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      13538/samba: task[l
tcp        0      0 0.0.0.0:464             0.0.0.0:*               LISTEN      13545/samba: task[k
tcp6       0      0 :::3269                 :::*                    LISTEN      13538/samba: task[l
tcp6       0      0 :::3268                 :::*                    LISTEN      13538/samba: task[l
tcp6       0      0 :::636                  :::*                    LISTEN      13538/samba: task[l
tcp6       0      0 :::135                  :::*                    LISTEN      13535/samba: task[r
tcp6       0      0 :::49153                :::*                    LISTEN      13535/samba: task[r
tcp6       0      0 :::49152                :::*                    LISTEN      13528/samba: task[r
tcp6       0      0 :::49154                :::*                    LISTEN      13535/samba: task[r
tcp6       0      0 :::53                   :::*                    LISTEN      13569/samba: task[d
tcp6       0      0 :::88                   :::*                    LISTEN      13545/samba: task[k
tcp6       0      0 :::389                  :::*                    LISTEN      13538/samba: task[l
tcp6       0      0 :::464                  :::*                    LISTEN      13545/samba: task[k

Samba ADで使われるポートは以下ページを参照してください。

Samba AD DC Port Usage - SambaWiki

AD機能レベルの確認

samba-toolでAD機能バージョンを確認します。

# samba-tool domain level show
Domain and forest function level for domain 'DC=falcon,DC=local,DC=org'

Forest function level: (Windows) 2008 R2
Domain function level: (Windows) 2008 R2
Lowest function level of a DC: (Windows) 2008 R2

Windows 2008 R2と古く感じますが、機能レベルとしては問題ないです。

kerberos、ldap、Aレコード確認

kerberos、ldap、Aレコードの名前解決が機能することを確認します。

# host -t SRV _kerberos._udp.falcon.local.org
_kerberos._udp.falcon.local.org has SRV record 0 100 88 ad1.falcon.local.org.
# host -t SRV _ldap._tcp.falcon.local.org
_ldap._tcp.falcon.local.org has SRV record 0 100 389 ad1.falcon.local.org.
# host -t A falcon.local.org
falcon.local.org has address 192.168.0.121
# host -t A ad1.falcon.local.org
ad1.falcon.local.org has address 192.168.0.121

Samba Clientを使ったリソース確認

samba-clientをインストールし、ADのリソースが提供されていることを確認します。

workgroupがno workgroupとなっていますが問題は無いと思います。

# apt install samba-client
# smbclient -L falcon.local.org -N
Anonymous login successful

        Sharename       Type      Comment
        ---------       ----      -------
        sysvol          Disk
        netlogon        Disk
        IPC$            IPC       IPC Service (Samba 4.15.13-Ubuntu)
SMB1 disabled -- no workgroup available

kerberos認証の動作確認

以下コマンドでkerberosの動作確認を行います。

# smbclient //localhost/netlogon -UAdministrator -c 'ls'
Password for [FALCON\Administrator]:
  .                                   D        0  Fri Sep  6 11:25:55 2024
  ..                                  D        0  Fri Sep  6 11:25:59 2024

                65220172 blocks of size 1024. 50764444 blocks available

# kinit administrator
Password for administrator@FALCON.LOCAL.ORG:
Warning: Your password will expire in 39 days on 2024年10月18日 11時25分59秒

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@FALCON.LOCAL.ORG

Valid starting       Expires              Service principal
2024-09-08T22:07:07  2024-09-09T08:07:07  krbtgt/FALCON.LOCAL.ORG@FALCON.LOCAL.ORG
        renew until 2024-09-09T22:07:05

構築用DNSの削除

構築時のDNSに8.8.8.8を通していますが、今後は内部DNSでフォワードされ、不要な設定となりますのでコメントアウト等で書き換えておきます。

WindowsPCとの接続検証後に設定しても問題はありません。

/etc/resolv.confの修正
# cat /etc/resolv.conf
nameserver 192.168.0.121
#nameserver 8.8.8.8

search falcon.local.org
/etc/netplan/99-cfg-proxmox.yamlの修正
# cat /etc/netplan/99-cfg-proxmox.yaml
# Generated by VMWare customization engine.
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.0.121/24
      gateway4: 192.168.0.1
      nameservers:
        addresses:
#          - [192.168.0.121, 8.8.8.8]
          - 192.168.0.121

WindowsPCクライアントの設定

Samba ADが構築出来ましたので、いよいよWindowsPCをADに参加させてみます。

ネットワークとインターネットの設定→アダプタのオプションを変更→インターネットプロトコルバージョン4→プロパティでDNSを今回構築したADのIPアドレスに設定します。

コマンドプロンプトからnslookupコマンドでDNS動作を確認します。

c:\>nslookup falcon.local.org
サーバー:  UnKnown
Address:  192.168.0.121

名前:    falcon.local.org
Address:  192.168.0.121

Windowsマーク→設定→ホーム→詳細情報→システムの詳細情報→コンピュータ名に進み、ドメイン設定の変更をクリックします。

所属するグループに今回設定したドメインを記入し、OKをクリックします。

ドメイン参加の認証要求がありますので、ユーザー名:administrator、パスワード:ADプロビジョニング時に設定したもの、を入れます。

ドメイン参加が認められると「ドメインへようこそ。」がでますので、そのまま再起動します。

再起動後、(ADドメイン名)\administratorでログインできることを確認します。

ログイン後、システムのプロパティを確認し、ドメインに参加出来ていることを確認します。

以上でPCクライアントの設定は完了です。

AD管理ツールRSATの導入

ADの管理はLinuxコマンドでも出来るのですが、直感的に作業ができないため、Microsoftが提供しているRSATというツールを使うのが便利です。

RSATはWindows10に標準インストールされていますが、デフォルトで無効化されているため、個別に有効化設定を行う必要があります。

有効化手順は以下の通りです。

1.コントロールパネル→プログラムと機能→Windowsの機能の有効化または無効化

Active Directory ライトウェイトディレクトリサービスにチェックし、インストール

2.Windowsマーク→設定→ホーム→オプション機能→機能の追加をクリックし、以下機能を追加
  • RSAT: Active Directory 証明書サービス・ツール
  • RSAT:グループポリシー管理ツール
  • RSAT:サーバーマネージャー

有効化が完了するとWindows管理ツールにAD関係のツールが出てきます。

AD配下のアカウントから「Active Directory ユーザーとコンピューター」を起動すると、Windows Serverのサーバーマネージャと同じ画面が出ますので、GUIでアカウント作成などが出来るようになります。

Samba4 ADは高コスパ

Samba4でActive Directoryを組んでみましたが、コマンド類が特殊である上、ネットワークの知識もふんだんに必要であるため、高難度でした。

しかし、機能的にはWindows Serverと遜色がありませんし、ユーザーライセンス(CAL)も不要のため、労力以上のコストパフォーマンスが得られます。

ADの自宅運用は初めてですので、これから慣れていき、運用ノウハウを記事にしたいと思います。