Sambaを使ったActive Directory
2台目(以降)のDCの展開
まずは今回の構成のおさらいです。
- ドメイン名: example.
com - 1台目のDC
(前回構築したもの) - ホスト名: samba-ad-dc01
- IPアドレス: 192.
168. 1.150
- 2台目のDC
(今回構築するもの) - ホスト名: samba-ad-dc02
- IPアドレス: 192.
168. 1.151
- 1台目のDC
- OS: Ubuntu Server 24.
04 LTS
2台目
まず、必要なパッケージは1台目と同じです。また、無効にするサービスや/etc/
samba-ad-dc02$ sudo apt install -y samba-ad-dc krb5-user bind9-dnsutils samba-ad-dc02$ sudo systemctl disable --now smbd nmbd winbind samba-ad-dc02$ sudo systemctl mask smbd nmbd winbind samba-ad-dc02$ sudo rm /etc/samba/smb.conf
/etc/
を編集し、1台目のDCを参照できるようにします。
samba-ad-dc02$ sudo unlink /etc/resolv.conf samba-ad-dc02$ cat << EOF | sudo tee /etc/resolv.conf > nameserver 192.168.1.150 > search example.com > EOF
事前準備が完了したら、ドメインにDCとして参加します。次はAdministrator@example.
の権限でexample.
ドメインにDC
として参加するというコマンドです。
samba-ad-dc02$ sudo samba-tool domain join example.com DC -U '[email protected]' ... INFO 2025-02-25 13:12:29,011 pid:3843 /usr/lib/python3/dist-packages/samba/join.py #106: Finding a writeable DC for domain 'example.com' INFO 2025-02-25 13:12:29,015 pid:3843 /usr/lib/python3/dist-packages/samba/join.py #108: Found DC samba-ad-dc01.example.com Password for [[email protected]]: ... INFO 2025-02-25 13:12:32,248 pid:3843 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2432: A Kerberos configuration suitable for Samba AD has been generated at /var/lib/samba/private/krb5.conf INFO 2025-02-25 13:12:32,248 pid:3843 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2434: Merge the contents of this file with your system krb5.conf or replace it with this one. Do not create a symlink! ... INFO 2025-02-25 13:12:34,681 pid:3843 /usr/lib/python3/dist-packages/samba/join.py #1631: Joined domain EXAMPLE (SID S-1-5-21-1227575069-1623886296-1303063441) as a DC
また、これも1台目同様ですがログの抜粋箇所で指示があるように、/etc/
を置き換えます。
samba-ad-dc02$ sudo cp -f /var/lib/samba/private/krb5.conf /etc/krb5.conf
作成された/etc/
を見ると、DNSフォワーダーなど、1台目のADと設定が揃っていない部分があります。DC同士は同じ設定を持つべきであるため、次のように1台目と内容を揃えておきます。
samba-ad-dc02$ cat /etc/samba/smb.conf # Global parameters [global] dns forwarder = 192.168.1.1 # 追加 netbios name = SAMBA-AD-DC02 realm = EXAMPLE.COM server role = active directory domain controller workgroup = EXAMPLE idmap_ldb:use rfc2307 = yes # 追加 [sysvol] path = /var/lib/samba/sysvol read only = No [netlogon] path = /var/lib/samba/sysvol/example.com/scripts read only = No
そして、1台目同様、systemd-resolved
を無効化・
samba-ad-dc02$ sudo systemctl disable systemd-resolved --now samba-ad-dc02$ sudo systemctl enable samba-ad-dc --now
2台目のDCの動作を確認します。
samba-ad-dc02$ kinit Administrator Password for [email protected]: Warning: Your password will expire in 41 days on Mon 07 Apr 2025 02:04:04 PM UTC samba-ad-dc02$ klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: [email protected] Valid starting Expires Service principal 02/25/2025 13:13:56 02/25/2025 23:13:56 krbtgt/[email protected] renew until 02/26/2025 13:13:54 samba-ad-dc02$ for srv in _ldap._tcp _kerberos._tcp _kerberos._udp _kpasswd._udp; do echo -n "${srv}.example.com: "; dig @localhost +short -t SRV ${srv}.example.com; done _ldap._tcp.example.com: 0 100 389 samba-ad-dc01.example.com. 0 100 389 samba-ad-dc02.example.com. _kerberos._tcp.example.com: 0 100 88 samba-ad-dc01.example.com. 0 100 88 samba-ad-dc02.example.com. _kerberos._udp.example.com: 0 100 88 samba-ad-dc01.example.com. 0 100 88 samba-ad-dc02.example.com. _kpasswd._udp.example.com: 0 100 464 samba-ad-dc01.example.com. 0 100 464 samba-ad-dc02.example.com.
また、上で見られるように2台目のDCもDNSサーバーとして動作しています。そのため、今後は2台目のDCも自身のDNSサーバーで名前解決させられるよう、最後に/etc/
を
samba-ad-dc02$ cat << EOF | sudo tee /etc/resolv.conf > nameserver 127.0.0.1 > search example.com > EOF
ドメインにすでに参加しているコンピューターは2台目のDCもDNSサーバーとして参照するように設定変更します。
SYSVOLフォルダのレプリケート
ドメインに参加した時点で、1台目のDCから2台目のDCにドメインのユーザーやコンピューターなどのLDAPの情報はレプリケートされています[2]。一方、グループポリシーオブジェクト
状況説明のため、本家のWindows Serverのディレクトリサービス
実際に確認してみると1台目のDCにはPolicies
ディレクトリがありますが、2台目のDCにはありません。
samba-ad-dc01$ sudo ls -la /var/lib/samba/sysvol/example.com total 32 drwxrwx---+ 4 root BUILTIN\administrators 4096 Nov 29 04:47 . drwxrwx---+ 3 root BUILTIN\administrators 4096 Nov 29 04:47 .. drwxrwx---+ 4 root BUILTIN\administrators 4096 Nov 29 04:47 Policies drwxrwx---+ 2 root BUILTIN\administrators 4096 Nov 29 04:47 scripts
samba-ad-dc02$ sudo ls -la /var/lib/samba/sysvol/example.com total 12 drwxr-xr-x 3 root root 4096 Dec 1 05:35 . drwxr-xr-x 3 root root 4096 Dec 1 05:35 .. drwxr-xr-x 2 root root 4096 Dec 1 05:35 scripts
つまり、接続するDCによってSYSVOLフォルダの中身
この状況に対し、Sambaの公式Wikiでは回避策の1つとして
その前に、
まずは
続いて、
ただ、実際には
今回は前述の通り、1台目のDCから2台目のDCの一方向にSYSVOLフォルダをレプリケートすることで、DFSRを使わずに同様のことを実現します。ただし、DFSRが双方向レプリケーションなのに対し、この方式は一方向のレプリケーションとなるため、次のような前提・
- 基本的には1台目のDCにPDCエミュレーターFSMOロールをもたせるようにする。
- GPOの管理者はPDCエミュレーターFSMOロールを持つDCに接続して
(「グループ ポリシー管理エディター」 の場合はデフォルトの挙動のまま操作して)、GPO関連の操作をする。 - PDCエミュレーターFSMOロールを移動させるときはSYSVOLフォルダのレプリケーションについても適宜対応
(例:レプリケーションの方向を変えるor停止するといった対応) を取る。
前置きが長くなりましたが、実際に設定を進めていきます。
まずは、1台目のDC側の設定です。次のような内容でrsyncdを構成、動作させます[7]。
samba-ad-dc01$ cat << EOF | sudo tee /etc/rsyncd.conf # rsyncdの設定 [SYSVOL] path = /var/lib/samba/sysvol hosts allow = 192.168.1.151 # レプリケート先のDCのIPアドレス hosts deny = * list = true uid = root gid = root read only = yes auth users = sysvol-replication secrets file = /etc/samba/rsyncd.secret EOF samba-ad-dc01$ cat << EOF | sudo tee /etc/samba/rsyncd.secret # 接続ユーザーとパスワード情報の配置 sysvol-replication:P@ssw0rd EOF samba-ad-dc01$ sudo chmod 600 /etc/samba/rsyncd.secret # パーミッションの設定 samba-ad-dc01$ sudo systemctl enable rsync.service --now # rsyncdの有効化・起動
また、SYSVOLフォルダはSMB/idmap.
というファイルなのですが、同じドメインのDC間でもビルトインのユーザー・idmap.
を取得し、2台目のDCと同期させます。
まずは準備として、次のコマンドで1台目のDCからidmap.
を取得しておきます。
samba-ad-dc01$ sudo tdbbackup -s .bak /var/lib/samba/private/idmap.ldb
コマンドを実行すると/var/
というファイルが作成されるため、これを2台目のDCの任意の場所に任意の方法でコピーします。これで、1台目の準備は完了です。
続いて2台目のDC側の設定です。先ほどコピーしてきたidmap.
で2台目のDCのidmap.
を上書きし、キャッシュをクリアしてIDマッピングを同期します。
samba-ad-dc02$ sudo cp idmap.ldb.bak /var/lib/samba/private/idmap.ldb samba-ad-dc02$ sudo net cache flush
これでDC間のSIDとUID/
続いて、rsyncコマンドで1台目のDCへ接続する際に使用する認証情報ファイルを配置します。
samba-ad-dc02$ cat << EOF | sudo tee /etc/samba/rsync-sysvol.secret P@ssw0rd EOF samba-ad-dc02$ sudo chmod 600 /etc/samba/rsync-sysvol.secret
SYSVOLフォルダの同期をおこなうサービスユニット[9]とそれを定期的
samba-ad-dc02$ cat << EOF | sudo tee /etc/systemd/system/sysvol-replication.service [Unit] Description=SYSVOL synchronization service [Service] ExecStart=/usr/bin/rsync -XAavz --delete-after --password-file=/etc/samba/rsync-sysvol.secret rsync://[email protected]/SYSVOL /var/lib/samba/sysvol EOF samba-ad-dc02$ cat << EOF | sudo tee /etc/systemd/system/sysvol-replication.timer [Unit] Description=Synchronize SYSVOL every 5 minutes [Timer] OnBootSec=5min OnUnitActiveSec=5min [Install] WantedBy=timers.target EOF
最後にユニットファイルをリロードし、タイマーを有効化します。
samba-ad-dc02$ sudo systemctl daemon-reload samba-ad-dc02$ sudo systemctl enable sysvol-replication.timer --now
これでSYSVOLフォルダが1台目のDCから2台目のDCに定期的にレプリケートされるようになりました。Ubuntuマシンであればadsysを使ってGPOを適用できるようになります。
なお、2台目以降のDCを作成する場合も同じ作業を繰り返します。
今回までの作業でSambaを使ったDC2台構成のAD互換環境を作成できました。次回はSamba ADの基本的な操作などについて解説します。