Ubuntu 22.04とSamba 4.15で2台目のActive Directoryドメインコントローラを構築してみる

どうも、Tです。

Samba Active Directoryを冗長性(2台構成)にした検証を行ったので備忘録です。

スポンサーリンク
アドセンス1

やりたいこと

概要

先日、Samba Active Directoryを1台構成で構築した記事を書きました。

Ubuntu 22.04とSamba 4.15でActive Directoryドメインコントローラを構築してみる
どうも、Tです。 ActiveDirectory(以下AD)が欲しいけどライセンスがないので、Samba ActiveDirector...

上記に2台目のSamba Active Directoryを導入して2台構成にします。

環境

バージョン

Ubuntu Serverをほぼデフォルトでインストールしたものを使用しています。

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"

Ubuntuは、vSphere ESXi上の仮想マシンにインストールしています。

操作はrootユーザーで行っています。

パッケージはaptコマンドで取得できるもののみ使用しています。(ソースコンパイルなどは行っていません)

主なパラメーター

項目1台目AD値2台目AD
ADドメイン名k.local.lab
ホスト名k-addc01k-addc02
IPアドレス192.168.10.201 / 255.255.255.0 192.168.10.202 / 255.255.255.0
Sambaバージョン4.15.13

1台目のADは前回構築済みのため、本記事では主に2台目の構築になります。

1台目のAD操作は【k-addc01

2台目のAD操作は【k-addc02

のようにタイトルにプレフィックスを付けます。

k-addc02】ファイルシステムのサポート確認

カーネルでACLサポートが必要です。

下記のコマンドを実行して結果が「y」であることを確認します。

# 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

今回はファイルシステムがext4の場合を記載しています。他のファイルシステムの場合に必要なカーネルオプションは下記に記載されています。

File System Support - SambaWiki

k-addc02】ホスト名設定

ホスト名の設定

ホスト名「k-addc02」が設定されいていることを確認します。

# hostnamectl
 Static hostname: k-addc02
Icon name: computer-vm
Chassis: vm
Machine ID: 995942c21c0b3dcea106ce2964b09b9e
Boot ID: 96b58b4fde4f4f1b9b02ed1a48496fda
Virtualization: vmware
Operating System: Ubuntu 22.04.2 LTS
Kernel: Linux 5.15.0-76-generic
Architecture: x86-64
Hardware Vendor: VMware, Inc.
Hardware Model: VMware20,1

hostsファイルの設定

hostsのエントリに2台目のADサーバ自身の「192.168.10.202 k-addc02.k.local.lab k-addc02」を追加します。

# cat /etc/hosts
127.0.0.1 localhost

# 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

192.168.10.202  k-addc02.k.local.lab k-addc02

FQNDでpingが実行できることを確認します。

# ping k-addc02.k.local.lab
PING k-addc02.k.local.lab (192.168.10.202) 56(84) bytes of data.
64 bytes from k-addc02.k.local.lab (192.168.10.202): icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from k-addc02.k.local.lab (192.168.10.202): icmp_seq=2 ttl=64 time=0.031 ms
64 bytes from k-addc02.k.local.lab (192.168.10.202): icmp_seq=3 ttl=64 time=0.031 ms
^C
--- k-addc02.k.local.lab ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.018/0.026/0.031/0.006 ms

k-addc02】DNSリゾルバ設定

DNSリゾルバサービスの無効化

UbuntuのDNS構成を制御する「systemd-resolved」が「resolv.conf」を勝手に書き換えてしまします。「systemd-resolved」は不要となるため無効化し起動していないことを確認します。

# systemctl status systemd-resolved.service
# systemctl stop systemd-resolved.service
# systemctl disable systemd-resolved.service
# systemctl status systemd-resolved.service

resolv.confのリンク削除

「resolv.conf」ファイルは/runの下のシンボリックファイルになっています。

シンボリックファイルを解除しておきます。

# unlink /etc/resolv.conf

自身をDNSリゾルバーとして強制

手動で「resolv.conf」を作成して編集します。

# touch /etc/resolv.conf
# vi /etc/resolv.conf

「resolv.conf」を下記のように作成しておきます。

nameserverに1台目のAD【k-addc01】のIPアドレスを指定します。

# cat /etc/resolv.conf
nameserver 192.168.10.201

search k.local.lab

ネットワークインターフェースに設定されいているDNSエントリも修正します。

 # vi /etc/netplan/99-netcfg-vmware.yaml

下記のようにnameserverを「resolv.conf」と合わせておきます。

# Generated by VMWare customization engine.
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.10.202/24
      gateway4: 192.168.10.254
      nameservers:
        addresses:
          - 192.168.10.201

修正後、インターフェースの変更を適用します。

# netplan apply

** (generate:2532): WARNING **: 10:22:41.263: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

WARNINGが出力されているのは、デフォルトゲートウェイの設定が現在非推奨の記載方法になっているためです。面倒なのでそのまましていますが、気になる方は修正してください。

Ubuntu22.04 netplanでgateway4は非推奨といわれた
Ubuntu 22.04 LTSがリリースされたので、早速サーバーをインストールして動かしてみた。インストール時に固定IPアドレスを設定したのだが、それが間違っているので修正したところ、gateway4は非推奨といわれてしまった。

k-addc02】NTP設定

時刻同期とするNTPを導入します。k-addc01と同じChronyを導入し、【k-addc01と時刻同期できていることを確認します。

設定方法は、下記の記事を参照してください。

Ubuntu 22.04とChronyでNTPサーバをつくってみた
どうも、Tです。 Ubuntu 22.04でNTPサーバーを作った備忘録です。 環境 Ubuntu Serverをほぼデフ...

注意点として、【k-addc02】はNTPクライアントとして動作し、【k-addc01】と時刻同期を行うため、poolの指定は【k-addc01】のIPアドレスもしくはホスト名になります。

pool 192.168.10.201 iburst

Samba Active Directoryが複数あるときの時刻同期のベストプラクティスは、下記を参照ください。

Time Synchronisation - SambaWiki

k-addc02】samba設定

インストール

パッケージインデックスを更新し、samba ADに必要となるパッケージをインストールします。

# apt update
# apt install acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle net-tools smbclient

後ほどの動作確認で使うコマンドのため、net-tools smbclientを追加しています。

samba ADに必要なパッケージは下記を参照ください。

Distribution-specific Package Installation - SambaWiki

1台目のAD【k-addc01】の場合はインストールが完了すると、紫色のセットアップ画面がでてきましたが、【k-addc02】では表示されませんでした。

不要サービス停止

Samba Active Directoryに不要なサービスを停止し、手動でも起動できないようにmaskしておきます。

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

サービス自動起動有効化

Samaba Active Directoryサービスをunmaskし自動起動を有効化しておきます。

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

Kerberosの構成

下記のケルベロス設定を行います。

https://wiki.samba.org/index.php/Joining_a_Samba_DC_to_an_Existing_Active_Directory#Kerberos 

Kerberos設定ファイルを退避し手動で作成します。

# mv /etc/krb5.conf /etc/krb5.conf.origin
# touch /etc/krb5.conf 
# vi /etc/krb5.conf

記載内容は下記になります。default_realmに自分のレルム名を大文字で指定します。

[libdefaults]
    default_realm = K.LOCAL.LAB
    dns_lookup_realm = false
    dns_lookup_kdc = true

kinitコマンドでadministraotrのKerberosチケットを要求します。

# kinit administrator
Password for administrator@K.LOCAL.LAB: ←パスワードを入力
Warning: Your password will expire in 41 days on Thu 24 Aug 2023 12:48:27 PM JST

klistコマンドでチケットが表示されることを確認します。

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@K.LOCAL.LAB

Valid starting Expires Service principal
07/14/2023 10:56:26 07/14/2023 20:56:26 krbtgt/K.LOCAL.LAB@K.LOCAL.LAB
renew until 07/15/2023 10:56:22

Samba Active Directoryへの参加

k-addc02】をADドメインに参加させます。

Joining a Samba DC to an Existing Active Directory - SambaWiki

処理時にsmb.confが自動的に作成されつため、デフォルトの設定ファイルを退避しておきます。

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

「samba-tool domain join」コマンドでJOINします。

# samba-tool domain join k.local.lab DC --username="K\administrator" --option="dns forwarder=8.8.8.8" --option='idmap_ldb:use rfc2307 = yes'
INFO 2023-07-14 11:34:32,847 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #105: Finding a writeable DC for domain 'k.local.lab'
INFO 2023-07-14 11:34:32,856 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #107: Found DC k-addc01.k.local.lab
Password for [K\administrator]: ←パスワード入力

「samba-tool domain join」コマンドで指定している意味は次の通りです。

項目意味
DCドメインコントローラ(DC)の役割として参加。
–username=”K\administrator”ドメインの管理者ユーザーを指定。
–option=”dns forwarder=8.8.8.8″smb.confへ設定を追加。

ここではDNSフォワーダを追加している。

–option=’idmap_ldb:use rfc2307 = yessmb.confへ設定を追加。

1台目のAD構築時にrfc2307(NIS拡張)を指定している場合、合わせておく。

join処理が行われる。

全文は下記。

 # samba-tool domain join k.local.lab DC --username="K\administrator" --option="dns forwarder=8.8.8.8" --option='idmap_ldb:use rfc2307 = yes'
INFO 2023-07-14 11:34:32,847 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #105: Finding a writeable DC for domain 'k.local.lab'
INFO 2023-07-14 11:34:32,856 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #107: Found DC k-addc01.k.local.lab
Password for [K\administrator]: ←パスワード入力
INFO 2023-07-14 11:34:42,487 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1527: workgroup is K
INFO 2023-07-14 11:34:42,488 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1530: realm is k.local.lab
Adding CN=K-ADDC02,OU=Domain Controllers,DC=k,DC=local,DC=lab
Adding CN=K-ADDC02,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=k,DC=local,DC=lab
Adding CN=NTDS Settings,CN=K-ADDC02,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=k,DC=local,DC=lab
Adding SPNs to CN=K-ADDC02,OU=Domain Controllers,DC=k,DC=local,DC=lab
Setting account password for K-ADDC02$
Enabling account
Calling bare provision
INFO 2023-07-14 11:34:42,819 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2108: Looking up IPv4 addresses
INFO 2023-07-14 11:34:42,820 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2125: Looking up IPv6 addresses
WARNING 2023-07-14 11:34:42,820 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2132: No IPv6 address will be assigned
INFO 2023-07-14 11:34:43,012 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2274: Setting up share.ldb
INFO 2023-07-14 11:34:43,020 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2278: Setting up secrets.ldb
INFO 2023-07-14 11:34:43,027 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2283: Setting up the registry
INFO 2023-07-14 11:34:43,048 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2286: Setting up the privileges database
INFO 2023-07-14 11:34:43,059 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2289: Setting up idmap db
INFO 2023-07-14 11:34:43,067 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #2296: Setting up SAM db
INFO 2023-07-14 11:34:43,070 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #880: Setting up sam.ldb partitions and settings
INFO 2023-07-14 11:34:43,070 pid:6319 /usr/lib/python3/dist-packages/samba/provision/__init__.py #892: Setting up sam.ldb rootDSE
INFO 2023-07-14 11:34:43,072 pid:6319 /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 2023-07-14 11:34:43,097 pid:6319 /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 2023-07-14 11:34:43,097 pid:6319 /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!
Provision OK for domain DN DC=k,DC=local,DC=lab
Starting replication
Schema-DN[CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab] objects[402/1739] linked_values[0/0]
Schema-DN[CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab] objects[804/1739] linked_values[0/0]
Schema-DN[CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab] objects[1206/1739] linked_values[0/0]
Schema-DN[CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab] objects[1608/1739] linked_values[0/0]
Schema-DN[CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab] objects[1739/1739] linked_values[0/0]
Analyze and apply schema objects
Partition[CN=Configuration,DC=k,DC=local,DC=lab] objects[402/1624] linked_values[0/1]
Partition[CN=Configuration,DC=k,DC=local,DC=lab] objects[804/1624] linked_values[0/1]
Partition[CN=Configuration,DC=k,DC=local,DC=lab] objects[1206/1624] linked_values[0/1]
Partition[CN=Configuration,DC=k,DC=local,DC=lab] objects[1608/1624] linked_values[0/1]
Partition[CN=Configuration,DC=k,DC=local,DC=lab] objects[1624/1624] linked_values[30/30]
Replicating critical objects from the base DN of the domain
Partition[DC=k,DC=local,DC=lab] objects[97/97] linked_values[23/23]
Partition[DC=k,DC=local,DC=lab] objects[271/271] linked_values[23/23]
Done with always replicated NC (base, config, schema)
Replicating DC=DomainDnsZones,DC=k,DC=local,DC=lab
Partition[DC=DomainDnsZones,DC=k,DC=local,DC=lab] objects[43/43] linked_values[0/0]
Replicating DC=ForestDnsZones,DC=k,DC=local,DC=lab
Partition[DC=ForestDnsZones,DC=k,DC=local,DC=lab] objects[18/18] linked_values[0/0]
Exop on[CN=RID Manager$,CN=System,DC=k,DC=local,DC=lab] objects[3] linked_values[0]
Committing SAM database
Repacking database from v1 to v2 format (first record CN=msSFU-30-Max-Gid-Number,CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab)
Repack: re-packed 10000 records so far
Repacking database from v1 to v2 format (first record CN=nTFRSSubscriber-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration,DC=k,DC=local,DC=lab)
Repacking database from v1 to v2 format (first record DC=_gc._tcp.Default-First-Site-Name._sites,DC=k.local.lab,CN=MicrosoftDNS,DC=DomainDnsZones,DC=k,DC=local,DC=lab)
Repacking database from v1 to v2 format (first record DC=_kerberos._tcp.dc,DC=_msdcs.k.local.lab,CN=MicrosoftDNS,DC=ForestDnsZones,DC=k,DC=local,DC=lab)
Repacking database from v1 to v2 format (first record CN=rpc,CN=ypServ30,CN=RpcServices,CN=System,DC=k,DC=local,DC=lab)
INFO 2023-07-14 11:34:47,447 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1100: Adding 1 remote DNS records for K-ADDC02.k.local.lab
INFO 2023-07-14 11:34:47,489 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1163: Adding DNS A record K-ADDC02.k.local.lab for IPv4 IP: 192.168.10.202
INFO 2023-07-14 11:34:47,503 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1191: Adding DNS CNAME record 15c5fb46-1ec9-4422-bd74-cedd0c6251ce._msdcs.k.local.lab for K-ADDC02.k.local.lab
INFO 2023-07-14 11:34:47,515 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1216: All other DNS records (like _ldap SRV records) will be created samba_dnsupdate on first startup
INFO 2023-07-14 11:34:47,515 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1222: Replicating new DNS records in DC=DomainDnsZones,DC=k,DC=local,DC=lab
Partition[DC=DomainDnsZones,DC=k,DC=local,DC=lab] objects[2/2] linked_values[0/0]
INFO 2023-07-14 11:34:47,532 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1222: Replicating new DNS records in DC=ForestDnsZones,DC=k,DC=local,DC=lab
Partition[DC=ForestDnsZones,DC=k,DC=local,DC=lab] objects[2/2] linked_values[0/0]
INFO 2023-07-14 11:34:47,544 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1237: Sending DsReplicaUpdateRefs for all the replicated partitions
INFO 2023-07-14 11:34:47,562 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1267: Setting isSynchronized and dsServiceName
INFO 2023-07-14 11:34:47,568 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1282: Setting up secrets database
INFO 2023-07-14 11:34:47,597 pid:6319 /usr/lib/python3/dist-packages/samba/join.py #1544: Joined domain K (SID S-1-5-21-471741904-173470251-2082303177) as a DC


下記の「smb.conf」ファイルが作成される。

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

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

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

「Active Directoryユーザとコンピューター」をみると【k-addc02】がドメインコントローラーとして参加できていることがわかります。

「Active Directoryサイトとサービス」にも【k-addc02】が表示されます。

DNSレコードも登録されます。スクリーンショットの取得を失念していましたが、NSレコードも登録されています。

原因はわからなかったのですが、Aレコードのホスト名とkrb5.confファイルの[domain_realm]の【k-addc02】のホスト名が大文字になっていました。
Aレコード、krb5.confファイルとも小文字に戻して問題なく動作することをかくにんしています。

Kerberos設定

Kerberos設定ファイルも自動的に作成されるため置き換えます。

元のkrb5.confを退避し、自動生成されたkrb5.confをコピーします。

# rm -rf /etc/krb5.conf
# cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

krb5.confはコピーする必要があります。シンボリックリンクを設定してはいけません。

Setting up Samba as an Active Directory Domain Controller - SambaWiki

Do not create a symbolic link to the the generated krb5.conf file. In Samba 4.7 and later, the /usr/local/samba/private/ directory is no longer accessible by other users than the root user. If the file is a symbolic link, other users are not able to read the file and, for example, dynamic DNS updates fail if you use the BIND_DLZ DNS back end.

krb5.confの中は下記のようになっています。

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

[realms]
K.LOCAL.LAB = {
        default_domain = k.local.lab
}

[domain_realm]
        K-ADDC02 = K.LOCAL.LAB
原因はわからなかったのですが、Aレコードのホスト名とkrb5.confファイルの[domain_realm]の【k-addc02】のホスト名が大文字になっていました。
Aレコード、krb5.confファイルとも小文字に戻して問題なく動作することをかくにんしています。

レプリケーション構成

ここからかなり面倒な手順になります。Samaba ADではSysvolレプリケーションがサポートされていません。そのためSysvol領域を同期させる方法を個別に設定しなければなりません。

方法はいくつかありますが、本手順では一番簡単なrsyncを用いた一方向の同期を行います。

k-addc01(同期元・FSMO)】→【k-addc02(同期先)】の構成になります。

そのため、GPOの編集など変更がかかるものは、【k-addc01(同期元・FSMO)】で行う必要があります。

Rsync based SysVol replication workaround - SambaWiki

That’s why for rsync-based SysVol replication, you have to choose one DC on which you do all modifications (GPO edits, logon script changes, etc.)

組み込みユーザID・グループIDマッピング

rsyncの設定を行う前に各ドメインコントローラーが持っているユーザーとグループのIDマッピングを合わせる必要があるため設定していきます。

Joining a Samba DC to an Existing Active Directory - SambaWiki

k-addc01】idmap.ldbのバックアップ

k-addc01】で「idmap.ldb」ファイルのバックアップを取得し、バックアップファイルを任意のディレクトリに移動し、root以外で読み込みが行えるようにします。

# tdbbackup -s .bak /var/lib/samba/private/idmap.ldb
# ls -lh idmap.ldb.bak
-rw------- 1 root root 80K Jul 14 12:36 idmap.ldb.bak
# mv idmap.ldb.bak /tmp/
# chown kadmin /tmp/idmap.ldb.bak

k-addc02】idmap.ldbの取得・置き換え

k-addc01】で取得した「idmap.ldb」バックアップファイルを【k-addc02】の「/var/lib/samba/private」に取得します。

# cd /var/lib/samba/private
# sftp kadmin@k-addc01:/tmp/idmap.ldb.bak
kadmin@k-addc01's password:
Connected to k-addc01.
Fetching /tmp/idmap.ldb.bak to idmap.ldb.bak
idmap.ldb.bak 100% 80KB 39.9MB/s 00:00

k-addc02】に元々あった「idmap.ldb」ファイルを削除し、【k-addc01】から取得したバックアップファイルを「idmap.ldb」にリネームします。

# rm -rf idmap.ldb
# mv idmap.ldb.bak idmap.ldb
# chown root idmap.ldb

「net cache flush」コマンドでキャッシュ情報を削除します。

# net cache flush

rsyscによるSysvolレプリケーション回避設定

rsync設定を行なっていきます。

Rsync based SysVol replication workaround - SambaWiki

k-addc01】rsync設定

rsyncをデーモンモードで動作させるために「rsyncd.conf」ファイルを作成します。

# vi /etc/rsyncd.conf

rsyncd.conf」の設定内容は下記になります。

[SysVol]
path = /var/lib/samba/sysvol
comment = Samba Sysvol Share
uid = root
gid = root
read only = yes
auth users = sysvol-replication
secrets file = /var/lib/samba/etc/rsync.secret
項目意味
[SysVol]モジュールヘッダー。

任意のわかりやすい名前をつける。

pathモジュールヘッダーで使用できるパス。

コピー元の場所になる。

uidrsyncを行うときのユーザーを指定。
gidrsyncを行うときのグループを指定。
read onlyrsyncで読み取りのみを許可。
auth usersrsyncを行うときの認証用ユーザーを指定。

OSに存在する必要はない。

secrets filersyncを行うときの認証用ユーザーのパスワードファイルを指定。

「rsync.secret」ファイルを作成します。

# mkdir /var/lib/samba/etc
# touch /var/lib/samba/etc/rsync.secret
# chmod 600 rsyncd.secret
# vi /var/lib/samba/etc/rsync.secret
「rsync.secret」ファイルは、オーナーとグループをrootで作成し、権限は600で作成してください。これ以外で作成するとrsyncの認証時にエラーになります。

「rsync.secret」ファイルの中身は下記になります。

sysvol-replication:<rsyncパスワード>
<auth usersで指定したユーザー名>:<rsyncパスワード>で記載してください。

rsyncサービスを自動起動を有効にし、起動した後にステータスを確認しておきます。

# systemctl enable rsync
# systemctl start rsync
# systemctl status rsync

k-addc02】rsync設定

k-addc02】でrsyncを実行し、[SysVol] の領域を取得できるようにします。

まず認証が行えるようにパスワードファイルを作成します。

# mkdir /var/lib/samba/etc
# touch /var/lib/samba/etc/rsync-sysvol.secret
# chmod 600 rsyncd.secret
# vi /var/lib/samba/etc/rsync-sysvol.secret
「rsync-sysvol.secret」ファイルは、オーナーとグループをrootで作成し、権限は600で作成してください。これ以外で作成するとrsyncの認証時にエラーになります。

「rsync-sysvol.secret」には「rsync.secret」に記載したパスワードのみを記載します。

<rsyncパスワード>
「rsync-sysvol.secret」はパスワードのみ記載します。「rsync.secret」のようにユーザー名も含めてしまうとrsync時にエラーになります。

rsyncを–dry-run(実際にコピーは行わない)で実行しエラーが表示されないことを確認します。

# rsync --dry-run -XAavz --delete-after --password-file=/var/lib/samba/etc/rsync-sysvol.secret rsync://sysvol-replication@k-addc01/SysVol/ /var/lib/samba/sysvol
receiving file list ... done
./
k.local.lab/
k.local.lab/Policies/
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/GPT.INI
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/GPT.INI
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/MACHINE/
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/USER/
k.local.lab/scripts/

sent 59 bytes received 1,364 bytes 2,846.00 bytes/sec
total size is 40 speedup is 0.03 (DRY RUN)

rsyncを–dry-runなしで実行しエラーが表示されないことを確認します。

# rsync -XAavz --delete-after --password-file=/var/lib/samba/etc/rsync-sysvol.secret rsync://sysvol-replication@k-addc01/SysVol/ /var/lib/samba/sysvol
receiving file list ... done
./
k.local.lab/
k.local.lab/Policies/
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/GPT.INI
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/
k.local.lab/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/USER/
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/GPT.INI
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/MACHINE/
k.local.lab/Policies/{6AC1786C-016F-11D2-945F-00C04FB984F9}/USER/
k.local.lab/scripts/

sent 115 bytes received 6,292 bytes 12,814.00 bytes/sec
total size is 40 speedup is 0.01

コピーしたsysvolの内容でACLのリセットを行います。

# samba-tool ntacl sysvolreset
sysvol領域をrsyncで同期する前に行うとエラーになります。

k-addc02】rsyncのcron設定

rsyncが定期的に実行されるようにcronに登録します。

任意の名前でcronファイルを作成します。

# vi /etc/cron.d/k-addc

作成したcronファイルに下記の内容を記載します。今回は5分おきにrsyncが実行されるようにしています。

 */5 * * * * root rsync -XAavz --delete-after --password-file=/var/lib/samba/etc/rsync-sysvol.secret rsync://sysvol-replication@k-addc01/SysVol/ /var/lib/samba/sysvol

cron登録後にrsyncが指定時間単位で繰り返し行われていることを確認します。

# journalctl -u cron | grep rsync
Jul 14 15:00:01 k-addc02 CRON[6713]: (root) CMD (rsync -XAavz --delete-after --password-file=/var/lib/samba/etc/rsync-sysvol.secret rsync://sysvol-replication@k-addc01/SysVol/ /var/lib/samba/sysvol)
Jul 14 15:05:01 k-addc02 CRON[6720]: (root) CMD (rsync -XAavz --delete-after --password-file=/var/lib/samba/etc/rsync-sysvol.secret rsync://sysvol-replication@k-addc01/SysVol/ /var/lib/samba/sysvol)
Jul 14 15:10:01 k-addc02 CRON[6730]: (root) CMD (rsync -XAavz --delete-after --password-file=/var/lib/samba/etc/rsync-sysvol.secret rsync://sysvol-replication@k-addc01/SysVol/ /var/lib/samba/sysvol)

k-addc02】Samba Active Directory起動

Ssamba Active Directoryを起動します。

# systemctl start samba-ad-dc

正常に起動していることを確認します。

# systemctl status samba-ad-dc

いくつからエラーっぽい表示がありました。調べた感じ問題なさそう(既知のバグ)だったのとその後発生していないため詳細の記録を忘れていました。

また見つけたら追記したいと思います。

追加設定

追加設定の項目は、SAMABのドキュメントに記載は明記されていませんでしたが、このままでは良くないなと思うところを修正しています。

DNSサーバー設定変更

k-addc01】DNSサーバー設定変更

「resolv.conf」ファイルにDNSサーバになっている【k-addc01】【k-addc02】の2台をnameserverとして追加します。

# cat /etc/resolv.conf
nameserver 192.168.10.201
nameserver 192.168.10.202

search k.local.lab

ネットワークインターフェースに設定されいているDNSエントリも修正します。

# cat /etc/netplan/99-netcfg-vmware.yaml
# Generated by VMWare customization engine.
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.10.201/24
      gateway4: 192.168.10.254
      nameservers:
        addresses: [192.168.10.201, 192.168.10.202]

修正後、インターフェースの変更を適用します。

# netplan apply

k-addc02】DNSサーバー設定変更

「resolv.conf」ファイルにDNSサーバになっている【k-addc01】【k-addc02】の2台をnameserverとして追加します。

# cat /etc/resolv.conf
nameserver 192.168.10.202
nameserver 192.168.10.201

search k.local.lab

ネットワークインターフェースに設定されいているDNSエントリも修正します。

# cat /etc/netplan/99-netcfg-vmware.yaml
# Generated by VMWare customization engine.
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.10.202/24
      gateway4: 192.168.10.254
      nameservers:
        addresses: [192.168.10.202, 192.168.10.201]

修正後、インターフェースの変更を適用します。

# netplan apply

k-addc02】時刻同期の構成

Kerberos認証が正常に使用できるように、クライアントからADサーバを使用した時刻同期(NT5DS プロトコル)できるように設定します。

構成はドキュメントにある推奨構成に則って設定していきます。

詳細は下記を参照ください。

Time Synchronisation - SambaWiki

本手順を行うことによりドメインに参加しているメンバーは、【k-addc01】【k-addc02】のどちらかから時刻同期を行うようになります。Windows ADの場合は、FSMOからのみ時刻同期を行い他のドメインコントローラもFSMOから同期を行う構成になるため少し動きが異なっています。

Samba ADの推奨構成ではありますが、この構成にも問題はあり別の構成としては全てのドメインコントローラーを外部NTPと同期する方法も示されています。

There is however a problem with this, Windows clients get their time from the PDC emulator DC and if this goes offline, they will not use the other DC’s and the other DC’s will be looking for the PDC emulator DC. As a workaround for this, set the same external time servers on all DC’s, then if the PDC emulator goes offline and cannot easily be restarted, transfer or seize the PDC emulator role to another DC.

今回はchronyを使っているので、chrony向けの設定を進めていきます。

ntp_signdディレクトリに_chronyグループからアクセスできるように読み取り権限を設定します。

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

chrony.confを設定します。

 # vi /etc/chrony/chrony.conf

下記の設定を追加します。allowは事前の設定で追加しているはずですが、まだしていなければ設定を行います。

# AddConfig-Allow NTP Client Access from local network
allow 192.168.10.0/24

# bind the chrony service to IP address of the Samba AD
bindcmdaddress 192.168.10.202

# specify the ntpsigndsocket directory for the Samba AD
ntpsigndsocket /var/lib/samba/ntp_signd
設定項目意味
allow時刻同期してくるクライアントのネットワーク許可範囲
bindcmdaddress時刻時に使用するIPアドレス。
ntpsigndsocketntp_signdソケットのディレクトリを指定

設定を反映するためchronydを再起動します。

# systemctl restart chronyd

chronydのステータスを確認し、ログに「MS-SNTP authentication enabled」が出力されていることを確認します。

# 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 Fri 2023-07-14 16:14:32 JST; 6s ago
       Docs: man:chronyd(8)
             man:chronyc(1)
             man:chrony.conf(5)
    Process: 7292 ExecStart=/usr/lib/systemd/scripts/chronyd-starter.sh $DAEMON_OPTS (code=exited, status=0/SUCCESS)
   Main PID: 7302 (chronyd)
      Tasks: 2 (limit: 9388)
     Memory: 1.2M
        CPU: 70ms
     CGroup: /system.slice/chrony.service
             ├─7302 /usr/sbin/chronyd -F 1
             └─7303 /usr/sbin/chronyd -F 1

Jul 14 16:14:32 k-addc02 systemd[1]: Starting chrony, an NTP client/server...
Jul 14 16:14:32 k-addc02 chronyd[7302]: chronyd version 4.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SI>
Jul 14 16:14:32 k-addc02 chronyd[7302]: Frequency -9.282 +/- 0.059 ppm read from /var/lib/chrony/chrony.drift
Jul 14 16:14:32 k-addc02 chronyd[7302]: Using right/UTC timezone to obtain leap second data
Jul 14 16:14:32 k-addc02 chronyd[7302]: MS-SNTP authentication enabled
Jul 14 16:14:32 k-addc02 chronyd[7302]: Loaded seccomp filter (level 1)
Jul 14 16:14:32 k-addc02 systemd[1]: Started chrony, an NTP client/server.
Jul 14 16:14:36 k-addc02 chronyd[7302]: Selected source 192.168.10.201
Jul 14 16:14:36 k-addc02 chronyd[7302]: System clock TAI offset set to 37 seconds

k-addc02】Samba Active Directory動作確認

Aレコード確認

ADサーバのAレコードの名前解決がローカルで行えることを確認します。

k-addc01】【k-addc02】の2台分が表示されます。

# host -t A k.local.lab localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

k.local.lab has address 192.168.10.201
k.local.lab has address 192.168.10.202

_kerberos・_ldapサービス レコード確認

kerberosとldapのSRVレコードの名前解決がローカルで行えることを確認します。

k-addc01】【k-addc02】の2台分が表示されます。

# host -t SRV _kerberos._udp.k.local.lab localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

_kerberos._udp.k.local.lab has SRV record 0 100 88 k-addc01.k.local.lab.
_kerberos._udp.k.local.lab has SRV record 0 100 88 k-addc02.k.local.lab.


# host -t SRV _ldap._tcp.k.local.lab localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:

_ldap._tcp.k.local.lab has SRV record 0 100 389 k-addc01.k.local.lab.
_ldap._tcp.k.local.lab has SRV record 0 100 389 k-addc02.k.local.lab.

レプリケーション確認

レプリケーションに問題がないことを確認します。

Verifying the Directory Replication Statuses - SambaWiki
# samba-tool drs showrepl
Default-First-Site-Name\K-ADDC02
DSA Options: 0x00000001
DSA object GUID: 15c5fb46-1ec9-4422-bd74-cedd0c6251ce
DSA invocationId: f8a84fad-c794-434a-8779-62e3d8e253f7

==== INBOUND NEIGHBORS ====

DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ Fri Jul 14 15:45:57 2023 JST was successful
                0 consecutive failure(s).
                Last success @ Fri Jul 14 15:45:57 2023 JST

DC=ForestDnsZones,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ Fri Jul 14 15:45:57 2023 JST was successful
                0 consecutive failure(s).
                Last success @ Fri Jul 14 15:45:57 2023 JST

CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ Fri Jul 14 15:45:57 2023 JST was successful
                0 consecutive failure(s).
                Last success @ Fri Jul 14 15:45:57 2023 JST

CN=Configuration,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ Fri Jul 14 15:45:57 2023 JST was successful
                0 consecutive failure(s).
                Last success @ Fri Jul 14 15:45:57 2023 JST

DC=DomainDnsZones,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ Fri Jul 14 15:45:57 2023 JST was successful
                0 consecutive failure(s).
                Last success @ Fri Jul 14 15:45:57 2023 JST

==== OUTBOUND NEIGHBORS ====

DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ NTTIME(0) was successful
                0 consecutive failure(s).
                Last success @ NTTIME(0)

DC=ForestDnsZones,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ NTTIME(0) was successful
                0 consecutive failure(s).
                Last success @ NTTIME(0)

CN=Schema,CN=Configuration,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ NTTIME(0) was successful
                0 consecutive failure(s).
                Last success @ NTTIME(0)

CN=Configuration,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ NTTIME(0) was successful
                0 consecutive failure(s).
                Last success @ NTTIME(0)

DC=DomainDnsZones,DC=k,DC=local,DC=lab
        Default-First-Site-Name\K-ADDC01 via RPC
                DSA object GUID: e467c23b-f335-4352-aaa3-47162ac4d334
                Last attempt @ NTTIME(0) was successful
                0 consecutive failure(s).
                Last success @ NTTIME(0)

==== KCC CONNECTION OBJECTS ====

Connection --
        Connection name: 6773f69e-3cba-42e1-840a-74684c19e12a
        Enabled        : TRUE
        Server DNS name : k-addc01.k.local.lab
        Server DN name  : CN=NTDS Settings,CN=K-ADDC01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=k,DC=loc
                TransportType: RPC
                options: 0x00000001
Warning: No NC replicated for Connection!

ディレクトリ比較

ディレクトリ内容を比較しエラーがないこと確認します。

Samba-tool ldapcmp - SambaWiki
# samba-tool ldapcmp ldap://k-addc01 ldap://k-addc02 -Uadministrator
Password for [K\administrator]:

* Comparing [DOMAIN] context...

* Objects to be compared: 271

* Result for [DOMAIN]: SUCCESS

* Comparing [CONFIGURATION] context...

* Objects to be compared: 1625

* Result for [CONFIGURATION]: SUCCESS

* Comparing [SCHEMA] context...

* Objects to be compared: 1739

* Result for [SCHEMA]: SUCCESS

* Comparing [DNSDOMAIN] context...

* Objects to be compared: 43

* Result for [DNSDOMAIN]: SUCCESS

* Comparing [DNSFOREST] context...

* Objects to be compared: 18

* Result for [DNSFOREST]: SUCCESS

Kerberos認証確認

# smbclient //localhost/netlogon -UAdministrator -c 'ls'
Password for [K\Administrator]:
  .                                   D        0  Thu Jul 13 12:48:22 2023
  ..                                  D        0  Thu Jul 13 12:48:26 2023

                49713728 blocks of size 1024. 39601812 blocks available

Kerbero認証で使用されるチケットをadministratorで取得します。

# kinit administrator
Password for administrator@K.LOCAL.LAB:
Warning: Your password will expire in 40 days on Thu 24 Aug 2023 12:48:27 PM JST

チケットのリストが表示できることを確認します。

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@K.LOCAL.LAB

Valid starting       Expires              Service principal
07/14/2023 16:21:52  07/15/2023 02:21:52  krbtgt/K.LOCAL.LAB@K.LOCAL.LAB
        renew until 07/15/2023 16:21:49

ADドメイン参加テスト

Windowsクライアントからドメインに参加できることを確認します。

ドメインユーザー作成

事前にドメインユーザー「ktest」を作成しました。RSATからGUIで手動で作成しています。

k-addc01】で作成したドメインユーザーが存在することを確認します。

# samba-tool user list | grep ktest
ktest

k-addc02】で作成したドメインユーザーが存在することを確認します。

# samba-tool user list | grep ktest
ktest

ドメイン参加

WindowsクライアントにIPアドレスとDNSを設定します。

いつも通りドメイン参加し、ドメインユーザーでログインできることを確認します。

コンピュータオブジェクトが登録されていることを確認します。

DNSレコード確認

k-addc01】【k-addc02】のDNSにレコードが登録されいていることを確認します。

原因不明ですが、自動でAレコードが登録されるときの登録されていない時がある事象を確認しています。何が原因なのか・・・・。
自動で登録されてない時はWindowsクライアントで「ipconfig /registerdns」コマンドを実行することで登録されました。

参考

公式

Joining a Samba DC to an Existing Active Directory - SambaWiki

ブログなど

Join an Additional Ubuntu DC to Samba4 AD DC for FailOver Replication - Part 5
This tutorial will show you how to add a second Samba4 domain controller, provisioned on Ubuntu 16.04 server, to the existing Samba AD DC forest in order to pro...
Installing and configuring a secondary Samba-AD on Debian — Samba-AD 4.20 documentation
Installing and configuring a secondary Samba-AD on Debian

まとめ

設定内容を全て把握できたわけではありませんが、一旦Samba ADを2台構成で動かすことができました。

うーん!すっごくめんどくさいですねぇ

スポンサーリンク
アドセンス1
アドセンス1
ブログランキング・にほんブログ村へ

シェアする

フォローする