Ubuntu22.04.4LTS へ Samba AD をインストールする
Ubuntu で Samba を Active Directory のドメインコントローラとして構築する手順をメモしておきます。 現時点で Samba の最新バージョンは 4.19.6 ですが、今回は Ubuntu の標準リポジトリから 2:4.15.13
というバージョンを導入します。 「2:」部分の意味はわかりませんが、バージョン 4.15.13 だと解釈するとやや古いことになります。
尚、Samba 4.19.0 Available for Download には以下の記載があります。
An initial, partial implementation of Active Directory Functional Level 2012, 2012R2 and 2016 is available in this release.
今回の構築する環境 (バージョン) では AD の機能レベル 2012 〜 2016 は利用出来ず、結果として機能レベルは 2008 になります。
検証環境¶
対象 | バージョン |
---|---|
Ubuntu | 22.04.4LTS |
Samba | 2:4.15.13 |
今回は以下の環境を想定しています。
項目 | 値 |
---|---|
LAN 側のアドレス帯 | 10.0.0.0/8 |
Samba ホストのアドレス | 10.0.0.1 |
DNS フォワーダ | 1.1.1.1 と 1.0.0.1 |
NTP 同期先 | 216.239.35.12 と 216.239.35.8 |
Default Kerberos version 5 realm | SAMBA.EXAMPLE.COM |
Kerberos servers for your realm | sv1.samba.example.com |
Administrative server for your Kerberos realm | sv1.samba.example.com |
実行するコマンド一覧¶
このメモの中で実行しているコマンドの一覧です。 詳細は後述します。
hostnamectl set-hostname sv1.samba.example.com
sed -i -e '/ - update_etc_hosts/d' /etc/cloud/cloud.cfg
IP アドレスは読み替えます。
echo "10.0.0.1 sv1.samba.example.com sv1" >> /etc/hosts
systemctl stop systemd-resolved.service
systemctl disable systemd-resolved.service
unlink /etc/resolv.conf
cat << EOF > /etc/resolv.conf
nameserver 127.0.0.1
nameserver 1.1.1.1
nameserver 1.0.0.1
search samba.example.com
EOF
sed -i -e "s/^ addresses:/ addresses:\n - 127.0.0.1/g" /etc/netplan/50-cloud-init.yaml
netplan apply
パッケージインストール時は対話的にパラメータを入力する必要があります。
apt -y install \
acl \
attr \
dnsutils \
krb5-config \
krb5-user \
libnss-winbind \
libpam-winbind \
net-tools \
python3-setproctitle \
samba \
smbclient \
winbind
systemctl stop smbd nmbd winbind
systemctl disable smbd nmbd winbind
mv /etc/samba/smb.conf /etc/samba/smb.conf.org
samba-tool
実行時、パラメータは対話的に入力します。 DNS フォワーダには 1.1.1.1,1.0.0.1
を指定しました。
samba-tool domain provision --use-rfc2307 --interactive
mv /etc/krb5.conf /etc/krb5.conf.org
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
apt -y install chrony
allow
するアドレス範囲は自身の環境に合わせて修正します。 また、bindcmdaddress
は Samba AD 自身のインターフェイスアドレスへ書き換えます。
cat << EOF > /etc/chrony/chrony.conf
confdir /etc/chrony/conf.d
server 216.239.35.12 iburst
server 216.239.35.8 iburst
sourcedir /run/chrony-dhcp
sourcedir /etc/chrony/sources.d
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
maxupdateskew 100.0
rtcsync
makestep 1 3
leapsectz right/UTC
allow 10.0.0.0/8
bindcmdaddress 10.0.0.1
ntpsigndsocket /var/lib/samba/ntp_signd
EOF
systemctl restart chrony.service
systemctl unmask samba-ad-dc
systemctl start samba-ad-dc
systemctl enable samba-ad-dc
正常に Samba AD が構築されていれば、以下のファイルから外部 DNS 設定を削除します。
/etc/hosts
/etc/netplan/50-cloud-init.yaml
前提条件の確認¶
File System Support に記載されていますが、ファイルシステムで 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
作業前のポート Listen 状態¶
Samba AD のインストール作業を行う前、ポート Listen 状態は以下でした。
1 2 3 |
|
ホスト名の修正¶
予めホスト名を適切に修正しておきます (後の手順で、このホスト名を /etc/hosts
に登録します)。 hostnamectl set-hostname [HOSTNAME]
でホスト名を設定します。
hostnamectl set-hostname sv1.samba.example.com
設定されたホスト名は hostnamectl
で確認出来ます。
# hostnamectl
Static hostname: sv1.samba.example.com
Icon name: computer-vm
Chassis: vm
Machine ID: f8bf9021b5344be299331358a71128ca
Boot ID: 0020a29693ab4e14aadb527b2d66d175
Virtualization: kvm
Operating System: Ubuntu 22.04.4 LTS
Kernel: Linux 5.15.0-105-generic
Architecture: x86-64
Hardware Vendor: QEMU
Hardware Model: Standard PC _i440FX + PIIX, 1996_
/etc/hosts の自動修正を無効化する¶
自身のホスト名を名前解決出来るよう、/etc/hosts
を編集します。 但し、cloud-init で起動している環境であり、且つ /etc/cloud/cloud.cfg
に以下のような update_etc_hosts
の定義があると再起動するごとに /etc/hosts
が書き換わってしまい、手動で加えた反映が破棄されてしまいます。
cloud_init_modules:
- migrator
- seed_random
- bootcmd
- write_files
- growpart
- resizefs
- disk_setup
- mounts
- set_hostname
- update_hostname
- update_etc_hosts
この場合は update_etc_hosts
行を削除し、/etc/hosts
が cloud-init で管理されないようにします。 これをワンライナーで処理するには以下を実行します。
sed -i -e '/ - update_etc_hosts/d' /etc/cloud/cloud.cfg
/etc/hosts へエントリーの追加¶
/etc/hosts
に以下のようなエントリーを追記しておきます。
10.0.0.1 sv1.samba.example.com sv1
ワンライナーで設定したい場合は以下を実行します。
echo "10.0.0.1 sv1.samba.example.com sv1" >> /etc/hosts
名前解決の設定¶
名前解決関連の設定を行います。
Step.1¶
Ubuntu は起動時に systemd-resolved
サービスが /etc/resolv.conf
を上書きし、設定します。 その為、手動で /etc/resolv.conf
を修正しても再起動すると変更が失われます。 今回は Ubuntu 自身を DNS リゾルバーとして (systemd-resolved
を使わずに) 静的に登録したいので、systemd-resolved
は停止します。
systemctl stop systemd-resolved.service
systemctl disable systemd-resolved.service
Step.2¶
/etc/resolv.conf
は /run/systemd/resolve/stub-resolv.conf
へのシンボリックリンクになっています。
# ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Mar 16 02:35 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
unlink
を実行してこのシンボリックリンクを解除します
unlink /etc/resolv.conf
Step.3¶
/etc/resolv.conf
を以下の内容で新規作成します。 nameserver
で DNS サーバを設定しますが、一番上を「自身のアドレス」にします。
nameserver 127.0.0.1
nameserver 1.1.1.1
nameserver 1.0.0.1
search samba.example.com
以下を実行することでもファイルを新規作成することが出来ます。
cat << EOF > /etc/resolv.conf
nameserver 127.0.0.1
nameserver 1.1.1.1
nameserver 1.0.0.1
search samba.example.com
EOF
Step.4¶
インターフェイス設定の DNS サーバ指定部分も同様に修正しておきます。 /etc/netplan/
配下の設定ファイルを修正します。 私の環境では /etc/netplan/50-cloud-init.yaml
でした。 以下のように nameservers
部分を修正、「一番上が自分自身を示す 127.0.0.1
」になるよう、修正します。
/etc/netplan/50-cloud-init.yaml | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
修正した設定を反映しておきます。
netplan apply
環境によっては以下のエラーになるようです。
Permissions for /etc/netplan/50-cloud-init.yaml are too open. Netplan configuration should NOT be accessible by others.
この場合、OS ごと再起動して修正を反映します。
Samba のインストール¶
Samba をインストールします。 詳細は後述しますが、Samba のパッケージインストール時、以下のパラメータを指定します。
項目 | 値 |
---|---|
Default Kerberos version 5 realm | SAMBA.EXAMPLE.COM |
Kerberos servers for your realm | samba1.example.com |
Administrative server for your Kerberos realm | samba1.example.com |
Step.1¶
apt install
で標準リポジトリからインストールします。 依存関係の都合上、Samba AD だけをインストールすることは出来ず、関連のサービスもインストールされてしまう為、不要なものは後の手順で無効化します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Step.2¶
Kerberos レルムを大文字で入力します。 今回は SAMBA.EXAMPLE.COM
としました。
Step.3¶
Kerberos サーバのホスト名を小文字で入力します。 今回は samba1.example.com
としました。
Step.3¶
Kerberos 認証のパスワード変更を管理するサーバのホスト名を小文字で入力します。 今回は samba1.example.com
としました。
Step.4¶
Samba AD としては必要の無いサービスを停止しておきます。
systemctl stop smbd nmbd winbind
systemctl disable smbd nmbd winbind
Samba AD の設定¶
Samba AD の設定を行います。
Step.1¶
設定には samba-tool
を使います。 設定ファイルは /etc/samba/smb.conf
です。 しかし、このファイルが存在する状態で samba-tool
を実行すると以下のようなエラーになってしまいます。
# samba-tool domain provision --use-rfc2307 --interactive
Realm [EXAMPLE.COM]:
Domain [EXAMPLE]:
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) [127.0.0.1]: 1.1.1.1
Administrator password:
Retype password:
ERROR(<class 'samba.provision.ProvisioningError'>): Provision failed - ProvisioningError: guess_names: 'realm =' was not specified in supplied /etc/samba/smb.conf. Please remove the smb.conf file and let provision generate it
File "/usr/lib/python3/dist-packages/samba/netcmd/domain.py", line 493, in run
result = provision(self.logger,
File "/usr/lib/python3/dist-packages/samba/provision/__init__.py", line 2231, in provision
names = guess_names(lp=lp, hostname=hostname, domain=domain,
File "/usr/lib/python3/dist-packages/samba/provision/__init__.py", line 625, in guess_names
raise ProvisioningError("guess_names: 'realm =' was not specified in supplied %s. Please remove the smb.conf file and let provision generate it" % lp.configfile)
その為、デフォルトで存在している設定ファイルは移動しておきます。
mv /etc/samba/smb.conf /etc/samba/smb.conf.org
Step.2¶
samba-tool domain provision --use-rfc2307 --interactive
を実行して対話的に設定します。 DNS フォワーダは「,
」(カンマ) で区切ることで複数指定出来ます。
# samba-tool domain provision --use-rfc2307 --interactive
Realm [EXAMPLE.COM]:
Domain [EXAMPLE]:
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) [127.0.0.1]: 1.1.1.1,1.0.0.1
Administrator password:
Retype password:
(snip)
自動生成された設定ファイルの中身は以下でした。
/etc/samba/smb.conf | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Step.3¶
続いて Kerberos の設定を行います。 Kerberos の設定ファイルも自動生成されている為、適切な位置へ移動させるだけです。
mv /etc/krb5.conf /etc/krb5.conf.org
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
NTP サーバの設定¶
Step.1¶
Ubuntu ではデフォルトで systemd-timesyncd
サービスが起動しており、NTP クライアントとして動作しています。 しかし、NTP サーバとしては機能していません。 そこで chrony をインストールして NTP クライアント&サーバ両方として機能させます。 chrony をインストールします。 chrony をインストールすると systemd-timesyncd
は自動的に停止されます。 chrony をインストールすると起動&自動起動設定がされていました。
apt -y install chrony
Step.2¶
chrony は Google Public NTP を参照させます。 /etc/chrony/chrony.conf
を以下のように書き換えます。
/etc/chrony/chrony.conf | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Step.3¶
設定が完了したら chrony を再起動して設定変更を反映します。
systemctl restart chrony.service
再起動後は念の為、systemctl status chrony.service
を実行して chrony が起動していることを確認しておきます。 ログ上、MS-SNTP authentication enabled
が表示されていることを確認しておきます (下記の出力例では 21 行目)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Step.4¶
NTP サーバとの同期状態は chronyc sources
で確認出来ます。
# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- time4.google.com 1 6 37 2 -424us[ -424us] +/- 20ms
^* time3.google.com 1 6 37 2 -92us[+1845us] +/- 20ms
Samba の起動¶
Samba AD はデフォルトで masked 状態のようで、起動することが出来ません。
# systemctl status samba-ad-dc.service
○ samba-ad-dc.service
Loaded: masked (Reason: Unit samba-ad-dc.service is masked.)
Active: inactive (dead)
unmask した上で起動&自動起動設定しておきます。
systemctl unmask samba-ad-dc
systemctl start samba-ad-dc
systemctl enable samba-ad-dc
正常に起動していることを systemctl status 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 Sun 2024-04-28 07:08:28 JST; 7s ago
Docs: man:samba(8)
man:samba(7)
man:smb.conf(5)
Main PID: 2979 (samba)
Status: "samba: ready to serve connections..."
Samba AD の動作確認¶
Samba AD が正常に動作していることを確認します。
Listen しているポートの確認¶
ss -nat --ipv4
で Listen しているポートを確認したところ、以下になっていました (表示量が多くなってしまう為、IPv6 ポートは省略しています)。
# ss -nat --ipv4
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 10 0.0.0.0:3269 0.0.0.0:*
LISTEN 0 10 0.0.0.0:3268 0.0.0.0:*
LISTEN 0 50 0.0.0.0:445 0.0.0.0:*
LISTEN 0 10 0.0.0.0:389 0.0.0.0:*
LISTEN 0 10 0.0.0.0:464 0.0.0.0:*
LISTEN 0 10 0.0.0.0:53 0.0.0.0:*
LISTEN 0 10 0.0.0.0:49154 0.0.0.0:*
LISTEN 0 10 0.0.0.0:49153 0.0.0.0:*
LISTEN 0 10 0.0.0.0:49152 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 10 0.0.0.0:88 0.0.0.0:*
LISTEN 0 10 0.0.0.0:135 0.0.0.0:*
LISTEN 0 50 0.0.0.0:139 0.0.0.0:*
LISTEN 0 10 0.0.0.0:636 0.0.0.0:*
SRV レコードの確認¶
Kerberos の SRV レコードを解決出来ることを確認しておきます。
# host -t SRV _kerberos._udp.samba.example.com
_kerberos._udp.samba.example.com has SRV record 0 100 88 sv1.samba.example.com.
LDAP の SRV レコードを解決出来ることを確認しておきます。
# host -t SRV _ldap._tcp.samba.example.com
_ldap._tcp.samba.example.com has SRV record 0 100 389 sv1.samba.example.com.
共有リソースの確認¶
共有リソースを確認しておきます。
# smbclient -N -L samba.example.com
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 認証で administrator
のチケットを取得出来ることを確認します。
# kinit administrator
Password for administrator@SAMBA.EXAMPLE.COM:
Warning: Your password will expire in 41 days on Sun Jun 9 11:17:47 2024
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@SAMBA.EXAMPLE.COM
Valid starting Expires Service principal
04/28/24 11:59:08 04/28/24 21:59:08 krbtgt/SAMBA.EXAMPLE.COM@SAMBA.EXAMPLE.COM
renew until 04/29/24 11:59:06
機能レベルの確認¶
機能レベルが表示されることを確認します。 冒頭に記載した通り、機能レベルは 2008 になります。
# samba-tool domain level show
Domain and forest function level for domain 'DC=samba,DC=example,DC=com'
Forest function level: (Windows) 2008 R2
Domain function level: (Windows) 2008 R2
Lowest function level of a DC: (Windows) 2008 R2
名前解決設定の修正¶
ここまでの設定で Samba AD の DNS フォワーダ設定により、名前解決出来るようになっています。 その為、/etc/resolv.conf
とインターフェイス設定からインターネット上の名前解決を実施させている DNS サーバ設定を削除します。
/etc/resolv.conf¶
以下の例であれば 2 〜 3 行目を削除します。
/etc/resolv.conf | |
---|---|
1 2 3 4 |
|
/etc/netplan/50-cloud-init.yaml¶
今回の検証環境ではインターフェイス設定は /etc/netplan/50-cloud-init.yaml
で実施されていますので、このファイルの 14 〜 15 行目を削除します。
/etc/netplan/50-cloud-init.yaml | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
設定変更が完了したら netplan apply
を実行して修正を反映します。
netplan apply
参考¶
/etc/chrony/chrony.conf | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
|