本記事はClaudeと共に作業をした際に結構引っかかったので、設定完了後にClaudeにBlogとしてまとめてもらったものです。
本手順は開発・学習目的を想定しています。WSL2 固有の回避策を含むため、本番環境には Hyper-V や VMware 上の専用 VM での構築を推奨します。
概要
Windows 11 の WSL2 上で動作する Ubuntu 22.04 に、オープンソースの Active Directory 実装である Samba 4 を構築した手順の記録です。
既存の BIND9 DNS サーバが稼働中であったため、Samba の内蔵 DNS(SAMBA_INTERNAL)は使用せず、BIND9 DLZ バックエンドで共存させる構成を採用しました。
環境
| 項目 | 値 |
|---|---|
| OS | Ubuntu 22.04 LTS on WSL2 |
| カーネル | 6.6.87.2-microsoft-standard-WSL2 |
| Samba | 4.15.13-Ubuntu |
| BIND | 9.18.39-Ubuntu |
| ドメイン | TEST.LOCAL |
| DC ホスト名 | dc1.test.local |
| DNS バックエンド | BIND9_DLZ |
構成のポイント
既存構成: BIND9(port 53)が稼働中
採用構成: Samba → BIND9 DLZ バックエンドを使用
(Samba 内蔵 DNS を使わないため port 53 の競合なし)
手順
1. systemd の有効化
WSL2 はデフォルトで systemd が無効なため、/etc/wsl.conf に以下を記述します。
[boot]
systemd=true
[network]
generateResolvConf=false
PowerShell で WSL を再起動します。
wsl --shutdown
wsl
2. ホスト名と /etc/hosts の設定
sudo hostnamectl set-hostname dc1.test.local
/etc/hosts に追記します。
127.0.0.1 localhost
172.27.29.241 dc1.test.local dc1
3. 必要パッケージのインストール
sudo apt install -y samba krb5-config krb5-user winbind smbclient bind9 bind9utils dnsutils
Kerberos の設定プロンプトでは以下を入力します。
| 項目 | 値 |
|---|---|
| Default realm |
TEST.LOCAL(大文字) |
| Kerberos servers | dc1.test.local |
| Administrative server | dc1.test.local |
4. 既存設定のクリア
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo mv /etc/krb5.conf /etc/krb5.conf.bak
5. BIND9_DLZ バックエンドでプロビジョニング
--dns-backend=BIND9_DLZ を指定することが最重要ポイントです。これにより Samba 内蔵 DNS の代わりに BIND9 が DNS を管理します。
sudo samba-tool domain provision \
--use-rfc2307 \
--realm=TEST.LOCAL \
--domain=TEST \
--server-role=dc \
--dns-backend=BIND9_DLZ \
--adminpass='YourStrongPassword123!'
6. Kerberos 設定をコピー
sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
7. 競合サービスを無効化
samba-ad-dc が smbd / nmbd / winbind を内部で管理するため、systemd からの独立起動を無効にします。
sudo systemctl disable smbd nmbd winbind
sudo systemctl stop smbd nmbd winbind
8. BIND9 DLZ 統合設定
named.conf.local
独自の DLZ ブロックを書かず、Samba が自動生成したファイルを include するだけにします。
これにより BIND バージョンに合った .so ファイルが自動的に使われます。
sudo tee /etc/bind/named.conf.local << 'EOF'
//
// Do any local configuration here
//
include "/var/lib/samba/bind-dns/named.conf";
EOF
Samba プロビジョニング時に /var/lib/samba/bind-dns/named.conf が自動生成されます。BIND 9.18.x 向けに dlz_bind9_18.so が指定されているため、手動で .so パスを書く必要はありません。
named.conf.options
options {
directory "/var/cache/bind";
tkey-gssapi-keytab "/var/lib/samba/bind-dns/dns.keytab";
minimal-responses yes;
forwarders {
xxx.xxx.xxx.xxx; # 社内ネットワークから出れるように社内DNSをフォワーダーとして指定
xxx.xxx.xxx.xxx; # 社内ネットワークから出れるように社内DNSをフォワーダーとして指定
};
forward only;
dnssec-validation no;
auth-nxdomain no;
listen-on { any; };
listen-on-v6 { any; };
interface-interval 0;
};
tkey-gssapi-keytab のパスは /var/lib/samba/private/dns.keytab ではなく /var/lib/samba/bind-dns/dns.keytab です。混同しやすいので注意してください。
BIND を root で実行する設定(WSL2 固有)
WSL2 環境固有の問題として、bind ユーザーでは TDB ファイルのセキュリティ記述子を通過できないため、root 実行とします。
/etc/default/named を編集します。
RESOLVCONF=no
OPTIONS="" # -u bind を削除
bind-dns ディレクトリの権限設定
sudo chgrp -R bind /var/lib/samba/bind-dns/
sudo chmod -R 750 /var/lib/samba/bind-dns/
9. サービス起動順序の設定と起動
sudo mkdir -p /etc/systemd/system/samba-ad-dc.service.d
sudo tee /etc/systemd/system/samba-ad-dc.service.d/override.conf << 'EOF'
[Unit]
After=named.service
Wants=named.service
EOF
sudo systemctl daemon-reload
# BIND9 を先に起動
sudo systemctl start named
# Samba を起動
sudo systemctl start samba-ad-dc
10. resolv.conf の設定
sudo tee /etc/resolv.conf << 'EOF'
nameserver 127.0.0.1
search test.local
EOF
動作確認
# DNS(SOA レコード)
dig @127.0.0.1 test.local SOA
# DNS(SRV レコード)
dig @127.0.0.1 _ldap._tcp.test.local SRV
dig @127.0.0.1 _kerberos._tcp.test.local SRV
# ドメイン情報
sudo samba-tool domain info 172.27.29.241
# Kerberos 認証
kinit administrator@TEST.LOCAL
klist
# ユーザー一覧
sudo samba-tool user list
正常に動作している場合の出力例:
Forest : test.local
Domain : test.local
Netbios domain : TEST
DC name : dc1.test.local
DC netbios name : DC1
Server site : Default-First-Site-Name
Client site : Default-First-Site-Name
Using default cache: /tmp/krb5cc_1000
Using principal: administrator@TEST.LOCAL
Authenticated to Kerberos v5
トラブルシューティング
構築中に発生した問題と解決策を記録します。
問題1: ポート 389(LDAP)競合
エラー
ldapsrv failed to bind to :::389 - NT_STATUS_ADDRESS_ALREADY_ASSOCIATED
原因
WSL2 上の別プロセスがポート 389 を先に確保していた。
解決
--dns-backend=BIND9_DLZ で再プロビジョニング。Samba 内蔵 DNS を使わない構成にすることで競合を根本から回避。
問題2: ポート 53(DNS)競合
エラー
Failed to bind to :::53 TCP - NT_STATUS_ADDRESS_ALREADY_ASSOCIATED
原因
systemd-resolved がポート 53 を使用していた。
解決
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo unlink /etc/resolv.conf
問題3: 各種ディレクトリ・ファイルのパーミッション不正
エラー
invalid permissions on directory '/var/lib/samba/private/msg.sock': has 0755 should be 0700
invalid permissions on file '/var/lib/samba/private/tls/key.pem': has 0755 should be 0600
invalid permissions on directory '/var/lib/samba/ntp_signd': has 0755 should be 0750
invalid permissions on directory '/var/lib/samba/winbindd_privileged': has 0755 should be 0750
原因
chmod -R 755 を実行したことで本来より広い権限が付与されてしまった。
解決
エラーメッセージの should be XXXX に従い個別修正します。
sudo chmod 700 /var/lib/samba/private/msg.sock
sudo chmod 600 /var/lib/samba/private/tls/key.pem
sudo chmod 644 /var/lib/samba/private/tls/cert.pem
sudo chmod 750 /var/lib/samba/ntp_signd
sudo chmod 750 /var/lib/samba/winbindd_privileged
問題4: smbd と samba-ad-dc の競合
エラー
server role = 'active directory domain controller' not compatible with running smbd standalone.
You should start 'samba' instead
原因
Ubuntu のパッケージ構成では smbd が systemd サービスとして独立起動しており、AD DC モードの samba プロセスと競合していた。
解決
sudo systemctl disable smbd nmbd winbind
sudo systemctl stop smbd nmbd winbind
問題5: DLZ ゾーン設定失敗(.so バージョン不一致)
エラー
samba_dlz: Failed to configure zone 'test.local'
原因
手動で dlz_bind9_12.so を指定していたが、インストールされた BIND は 9.18.x のため不一致。また test.local の静的ゾーン定義も残っており DLZ と競合していた。
解決
named.conf.local を Samba 生成ファイルの include 1行に置き換え。
include "/var/lib/samba/bind-dns/named.conf";
問題6: bind ユーザーでの TDB アクセス Permission denied(WSL2 固有)
エラー
Unable to open tdb '/var/lib/samba/bind-dns/dns/sam.ldb': Permission denied: Operations error
原因
ファイルシステム上のパーミッションは正しいにも関わらず、WSL2 環境では TDB ファイル内部のセキュリティ記述子が bind ユーザーのアクセスをブロックしていた。
解決
/etc/default/named から -u bind を削除し、root で実行する。
OPTIONS=""
BIND を root で動かすことはセキュリティ上非推奨です。WSL2 開発環境に限定した回避策として使用し、本番環境では使用しないでください。
まとめ
WSL2 + Ubuntu 22.04 で Samba AD DC と BIND9 を共存させるための重要ポイントです。
| ポイント | 対応 |
|---|---|
| DNS バックエンド |
BIND9_DLZ を使用(内蔵 DNS は使わない) |
| named.conf の DLZ 設定 | Samba 生成の named.conf を include するだけ |
| tkey-keytab のパス |
/var/lib/samba/bind-dns/dns.keytab(private ではない) |
| BIND の実行ユーザー | WSL2 では -u bind を外して root 実行 |
| smbd/nmbd/winbind | systemd から無効化(samba が管理) |
| ファイル権限 | Samba のエラーメッセージ should be XXXX に従い設定 |