どうも、Tです。
ActiveDirectory(以下AD)が欲しいけどライセンスがないので、Samba ActiveDirectoryを作ってみました。
結構手順が面倒だったので備忘録です。
目次
環境
バージョン
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コマンドで取得できるもののみ使用しています。(ソースコンパイルなどは行っていません)
主なパラメーター
項目 | 値 | 備考 |
ADドメイン名 | k.local.lab | |
ホスト名 | k-addc01 | |
IPアドレス | 192.168.10.201 / 255.255.255.0 | |
Sambaバージョン | 4.15.13 | 2023年7月のaptでインストール可能な最新バージョン |
本手順では、1台のADサーバを構築しています。
2台目のADサーバ追加については後日記事にしたいと思います。
2023年7月17日追記
本手順でSamba ADを1台構成で作成した後、2台目のSamba ADを追加する手順を作成しました。
やりたいこと
ADドメインコントローラが欲しい
検証環境のAD環境で、Microsoftの期限付き評価版などを都度作っていたのですが、作り直すのが面倒になり、継続的に利用できるAD環境が欲しかったのでSambaを使って、Samba Active Directory作ることにしました。
Samba4以降でAD DCがつかれるようになっています。機能レベルは2008R2ですが、個人的な検証レベルには十分と判断しました。
Starting from version 4.0 (released in 2012,) Samba is able to serve as an Active Directory (AD) domain controller (DC). Samba can operates at a forest functional level of Windows Server 2008 R2 which is more that sufficient to manage sophisticated enterprises that use Windows 10/11 with strict compliance requirements (including NIST 800-171.)
ただ、すべての機能がサポートされているわけではありません。詳細についてはFAQにまとめられています。
なんでUbuntu?
当初RHELを使用する予定でしたが、RHEL(CentOSも含め)の標準リポジトリで提供しているsambaパッケージは、AD DCがつけるビルドオプションをつけてないらくしくソースからsambaをビルド必要がありました。
Ubuntuは、標準リポジトリで提供しているsambaパッケージでAD DCを構築できるものが配布されています。
このため、ネット上の情報もUbuntuをベースに説明されているものが多かったので、Ubuntuを採用しました。
備忘録として、調べた内容を記載しておきます。
RHEL8までですが、AD DCとして使えないことが明記されています。(2023年7月時点)
Red Hat社のRHEL9のマニュアルでは、明記されていないもののADへ参加する方法は記載があるものの、AD DCとしてつかるような記載は見つかりませんでした。
ファイルシステムのサポート確認
カーネルで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の場合を記載しています。他のファイルシステムの場合に必要なカーネルオプションは下記に記載されています。
ホスト名設定
ホスト名の設定
ホスト名「k-addc01」が設定されいていることを確認します。
# hostnamectl Static hostname: k-addc01 Icon name: computer-vm Chassis: vm Machine ID: 14a4181f84f33df105d4e50664ace4a8 Boot ID: cbe1a31601d44e61834c0149feed4604 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のエントリにADサーバ自身の「192.168.10.201 k-addc01.k.local.lab k-addc01」を追加します。
# 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.201 k-addc01.k.local.lab k-addc01
FQNDでpingが実行できることを確認します。
# ping k-addc01.k.local.lab PING k-addc01.k.local.lab (192.168.10.201) 56(84) bytes of data. 64 bytes from k-addc01.k.local.lab (192.168.10.201): icmp_seq=1 ttl=64 time=0.017 ms 64 bytes from k-addc01.k.local.lab (192.168.10.201): icmp_seq=2 ttl=64 time=0.023 ms 64 bytes from k-addc01.k.local.lab (192.168.10.201): icmp_seq=3 ttl=64 time=0.026 ms 64 bytes from k-addc01.k.local.lab (192.168.10.201): icmp_seq=4 ttl=64 time=0.028 ms ^C --- k-addc01.k.local.lab ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3068ms rtt min/avg/max/mdev = 0.017/0.023/0.028/0.004 ms
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は、ADサーバにしておきます。
後ほどsambaを導入するために名前解決が必要なため、二番目には名前解決が行えるようグローバルDNSを設定しておきます。
# cat /etc/resolv.conf nameserver 192.168.10.201 nameserver 8.8.8.8 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.201/24 gateway4: 192.168.10.254 nameservers: addresses: - [192.168.10.201, 8.8.8.8]
修正後、インターフェースの変更を適用します。
# netplan apply ** (generate:2681): WARNING **: 12:38:07.820: `gateway4` has been deprecated, use default routes instead. See the 'Default routes' section of the documentation for more details.
WARNINGが出力されているのは、デフォルトゲートウェイの設定が現在非推奨の記載方法になっているためです。面倒なのでそのまましていますが、気になる方は修正してください。
NTP設定
外部のNTPを時刻同期できていることを確認します。また、今回は、k-addc01にchronyを導入しNTPサーバとしても利用します。
設定方法は、下記の記事を参照してください。
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に必要なパッケージは下記を参照ください。
Kerberosレルム名があっていることを確認し「OK」を選択します。
自動入力されているはずですが、手動で入力する場合は大文字で入力します。
ADの場合、ADドメイン名とKerberosレルムは同じになりますが、Kerberosレルムは大文字を指定する必要があります。
レルム内のKerberosサーバーのホスト名(ADサーバのホスト名)をFQDN形式で小文字で入力し「OK」を選択します。
Kerberos管理サーバーのホスト名(ADサーバのホスト名)をFQDN形式で小文字で入力し「OK」を選択します。
不要サービス停止
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
Samba Active Directoryプロビジョニング
Samba Active Directoryを設定していきます。設定は、「samba-tool」コマンドを使用します。
「samba-tool」の実行により、smb.confが置き換えられるため元の「smb.conf 」を名前を変えて退避しておきます。
# mv /etc/samba/smb.conf /etc/samba/smb.conf.origin
「samba-tool」を実行して設定を開始します。
# samba-tool domain provision --use-rfc2307 --interactive Realm [K.LOCAL.LAB]: ←そのままEnter Domain [K]: ←そのまま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.10.201]: 8.8.8.8 Administrator password: ←パスワード入力 Retype password: ←パスワード確認入力
パスワードの入力が終わると下記のように設定が実施されます。
いくつかわかりにくい部分があるので補足しておきます。
samba-toolのオプションの意味
オプション | 説明 |
domain provision | AD DCへのプロモート(昇格のイメージ?) これは厳密にはオプションではなくコマンドになります。 |
–use-rfc2307 | NIS拡張の指定。詳細は下記参照。 |
–interactive | 対話モードの指定 |
DNS backendについて
Samba Active Directoryで使用するDNSの設定です。DNSには内部DNS(SAMBA_INTERNAL)かBINDを使用できますが、本手順では内部DNSをするためデフォルト値としています。
内部DNSの詳細は下記に記載されています。ゾーン転送をサポートしていないため、おいおいBINDに切り替えたいところ・・・・。
Limitations
The internal DNS does not support:
- acting as a caching resolver
- recursive queries
- shared-key transaction signature (TSIG)
- stub zones
- zone transfers
- Round Robin load balancing among DC’s
DNS forwarder IP addressについて
内部DNSを使用する場合のDNSフォワーダーの指定です。詳細は下記を参照ください。
smb.confは下記のように生成されます。
# cat /etc/samba/smb.conf # Global parameters [global] dns forwarder = 8.8.8.8 netbios name = K-ADDC01 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
Kerberos設定
Kerberos設定ファイルも自動的に作成されるため置き換えます。
元のkrb5.confを退避し、自動生成されたkrb5.confをコピーします。
# mv /etc/krb5.conf /etc/krb5.conf.origin # cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
krb5.confはコピーする必要があります。シンボリックリンクを設定してはいけません。
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 theroot
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 theBIND_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-addc01 = K.LOCAL.LAB
Samba Active Directory起動
Ssamba Active Directoryを起動します。
# 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 Thu 2023-07-13 12:53:17 JST; 4s ago Docs: man:samba(8) man:samba(7) man:smb.conf(5) Main PID: 5036 (samba) Status: "samba: ready to serve connections..." Tasks: 59 (limit: 9388) Memory: 198.4M CPU: 3.289s CGroup: /system.slice/samba-ad-dc.service tq5036 "samba: root process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5037 "samba: tfork waiter process(5038)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5038 "samba: task[s3fs] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5039 "samba: tfork waiter process(5041)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5040 "samba: tfork waiter process(5042)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5041 "samba: task[rpc] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5042 /usr/sbin/smbd -D "--option=server role check:inhibit=yes" --foreground "" tq5043 "samba: tfork waiter process(5045)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5044 "samba: tfork waiter process(5047)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5045 "samba: task[nbt] pre-fork master" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5046 "samba: tfork waiter process(5050)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" tq5047 "samba: task[rpc] pre-forked worker(0)" "" "" "" "" "" "" "" "" "" ""
時刻同期の構成
Kerberos認証が正常に使用できるように、クライアントからADサーバを使用した時刻同期(NT5DS プロトコル)できるように設定します。
詳細は下記を参照ください。
今回は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.201 # specify the ntpsigndsocket directory for the Samba AD ntpsigndsocket /var/lib/samba/ntp_signd
設定項目 | 意味 |
allow | 時刻同期してくるクライアントのネットワーク許可範囲 |
bindcmdaddress | 時刻時に使用するIPアドレス |
ntpsigndsocket | ntp_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 Thu 2023-07-13 13:05:56 JST; 5s ago Docs: man:chronyd(8) man:chronyc(1) man:chrony.conf(5) Process: 5130 ExecStart=/usr/lib/systemd/scripts/chronyd-starter.sh $DAEMON_OPTS (code=exited, status=0/SUCCESS) Main PID: 5140 (chronyd) Tasks: 2 (limit: 9388) Memory: 1.3M CPU: 70ms CGroup: /system.slice/chrony.service tq5140 /usr/sbin/chronyd -F 1 mq5141 /usr/sbin/chronyd -F 1 Jul 13 13:05:56 k-addc01 systemd[1]: Starting chrony, an NTP client/server... Jul 13 13:05:56 k-addc01 chronyd[5140]: chronyd version 4.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 -DEBUG) Jul 13 13:05:56 k-addc01 chronyd[5140]: Frequency -9.348 +/- 0.015 ppm read from /var/lib/chrony/chrony.drift Jul 13 13:05:56 k-addc01 chronyd[5140]: Using right/UTC timezone to obtain leap second data Jul 13 13:05:56 k-addc01 chronyd[5140]: MS-SNTP authentication enabled Jul 13 13:05:56 k-addc01 chronyd[5140]: Loaded seccomp filter (level 1) Jul 13 13:05:56 k-addc01 systemd[1]: Started chrony, an NTP client/server. Jul 13 13:06:01 k-addc01 chronyd[5140]: Selected source 133.243.238.164 (ntp.nict.jp) Jul 13 13:06:01 k-addc01 chronyd[5140]: System clock TAI offset set to 37 seconds
Samba Active Directory動作確認
LISTENポート確認
LISTENポートを確認するとsambaが正常にLIASTENしていることが確認できます。
# netstat -antp | egrep "sambad|samba" tcp 0 0 0.0.0.0:3268 0.0.0.0:* LISTEN 957/samba: task[lda tcp 0 0 0.0.0.0:3269 0.0.0.0:* LISTEN 957/samba: task[lda tcp 0 0 0.0.0.0:464 0.0.0.0:* LISTEN 974/samba: task[kdc tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 957/samba: task[lda tcp 0 0 0.0.0.0:88 0.0.0.0:* LISTEN 974/samba: task[kdc tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 1007/samba: task[dn tcp 0 0 0.0.0.0:49154 0.0.0.0:* LISTEN 967/samba: task[rpc tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 946/samba: task[rpc tcp 0 0 0.0.0.0:49153 0.0.0.0:* LISTEN 967/samba: task[rpc tcp 0 0 0.0.0.0:135 0.0.0.0:* LISTEN 967/samba: task[rpc tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN 957/samba: task[lda tcp6 0 0 :::3268 :::* LISTEN 957/samba: task[lda tcp6 0 0 :::3269 :::* LISTEN 957/samba: task[lda tcp6 0 0 :::464 :::* LISTEN 974/samba: task[kdc tcp6 0 0 :::389 :::* LISTEN 957/samba: task[lda tcp6 0 0 :::88 :::* LISTEN 974/samba: task[kdc tcp6 0 0 :::53 :::* LISTEN 1007/samba: task[dn tcp6 0 0 :::49154 :::* LISTEN 967/samba: task[rpc tcp6 0 0 :::49152 :::* LISTEN 946/samba: task[rpc tcp6 0 0 :::49153 :::* LISTEN 967/samba: task[rpc tcp6 0 0 :::135 :::* LISTEN 967/samba: task[rpc tcp6 0 0 :::636 :::* LISTEN 957/samba: task[lda
Aレコード確認
ADサーバのAレコードの名前解決が行えることを確認します。
# host -t A k.local.lab k.local.lab has address 192.168.10.201 # host -t A k-addc01.k.local.lab k-addc01.k.local.lab has address 192.168.10.201
_kerberos・_ldapサービス レコード確認
kerberosとldapのSRVレコードの名前解決が行えることを確認します。
# host -t SRV _kerberos._udp.k.local.lab _kerberos._udp.k.local.lab has SRV record 0 100 88 k-addc01.k.local.lab. # host -t SRV _ldap._tcp.k.local.lab _ldap._tcp.k.local.lab has SRV record 0 100 389 k-addc01.k.local.lab.
デフォルトリソース確認
Samba Active Directoryで提供されている共有リソースが表示されることを核にします。
# smbclient -L k.local.lab -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認証確認
# 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. 39851864 blocks available
Kerbero認証で使用されるチケットをadministratorで取得します。
# 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 Ticket cache: FILE:/tmp/krb5cc_0 Default principal: administrator@K.LOCAL.LAB Valid starting Expires Service principal 07/13/2023 13:21:49 07/13/2023 23:21:49 krbtgt/K.LOCAL.LAB@K.LOCAL.LAB renew until 07/14/2023 13:21:45
機能レベル確認
機能レベルが表示されることを確認します。
# samba-tool domain level show Domain and forest function level for domain 'DC=k,DC=local,DC=lab' Forest function level: (Windows) 2008 R2 Domain function level: (Windows) 2008 R2 Lowest function level of a DC: (Windows) 2008 R2
後処理
名前解決は内部DNSかDNSフォワードで行えるため、不要な設定を削除しておきます。
resolv.confからグローバルDNSを削除します。
# cat /etc/resolv.conf 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.201/24 gateway4: 192.168.10.254 nameservers: addresses: - 192.168.10.201
修正後、インターフェースの変更を適用します。
# netplan apply
参考
公式
ブログなど
Youtube
Samba Active Directoryの管理方法
Samba Active Directoryの管理は、MicrosoftのRSAT(リモートサーバー管理ツール)をクライアントPCに導入することで管理が行えます。
詳細は下記をご参照ください。
Samba Active Directoryではないですが、Windows ServerとWindows ClientでRSATを使った記事をかいていたいので載せておきます。
まとめ
Windows ADがどれほど簡単にできるか思い知らされました。
あとやりたいことは・・・・
- 内部DNSをBINDに置き換える
- 2台目のSamba ActiveDirecotryを導入して冗長構成にする
検証進めようかと思います・・・・。