はじめに
SambaでActive DirectoryとDomain Controllerを作り、LinuxとWindowsでユーザ認証を行うことにしました。
初めに1台目のSamba AD/DCを作ります。
環境
- Debian bookworm - Samba 4.17.12-Debian - Client - Debian bookworm - Windows Server 2025 Standard - Windows10 Pro
構成
Domain: ND
Realm: ND.LOCAL
DC1(FSMO)
192.168.1.1
DC2
192.168.1.2
固定IPアドレスに変更
DHCPに関連するパッケージを削除します。
sudo apt purge isc-dhcp-common isc-dhcp-client
/etc/network/interfacesを編集します。
「8.8.8.8」はGoogle Public DNSです。
source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eno1 auto eno1 iface eno1 inet static address 192.168.1.1 netmask 255.255.255.0 gateway 192.168.1.xx dns-domain xxx.xxx.xxx dns-nameservers 127.0.0.1 8.8.8.8
/etc/resolv.confを編集します。
自身のSmabaの内部DNSで解決するように設定します。
nameserver 192.168.1.1
パッケージのインストール
winbindは内部的に使うため、インストールします。
sudo apt install samba krb5-user winbind smbclient ldb-tools samba-common-bin realmd
/etc/hosts
127.0.0.1 localhost 127.0.0.1 dc1.nd.local dc1 192.168.1.1 dc1.nd.local dc1 192.168.1.1 dc1.xxx.xxx.xxx dc1
時刻の設定
/etc/systemd/timesyncd.confを編集します。
NTP=time.google.com
確認します。
systemctl restart systemd-timesyncd timedatectl timesync-status
サービスを無効化する
不要なサービスを無効化します。
winbindは内部的に使うためにインストールしましたが、サービスとしては使いません。
sudo systemctl stop smbd nmbd winbind sudo systemctl disable smbd nmbd winbind sudo systemctl daemon-reload
新規にDomain Controllerを設定する
cd /etc/samba mv smb.conf smb.conf-old samba-tool domain provision --use-rfc2307 --interactive
入力します。
Realm [ND.domain]: ND.LOCAL Domain [ND]: ND 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]: Administrator password: Retype password:
/etc/krb5.conf
生成されたkrb5.confをコピーします。
sudo cp /var/lib/samba/private/krb5.conf /etc/
krb5.confの内容は以下の通りです。
DC1は1台目、DC2は2台目のDCの名前です。
[libdefaults] default_realm = ND.LOCAL dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] ND.LOCAL = { default_domain = nd.local kdc = 192.168.1.1 kdc = 192.168.1.2 admin_server = 192.168.1.1 admin_server = 192.168.1.2 } [domain_realm] .nd.nips = ND.LOCAL nd.nips = ND.LOCAL DC1 = ND.LOCAL
/etc/samba/smb.conf
[global] dns forwarder = 8.8.8.8 netbios name = DC1 realm = ND.LOCAL server role = active directory domain controller workgroup = ND idmap_ldb:use rfc2307 = yes [sysvol] path = /var/lib/samba/sysvol read only = No [netlogon] path = /var/lib/samba/sysvol/nd.local/scripts read only = No
samba-ad-dcの設定
samba-ad-dcを設定します。
sudo systemctl unmask samba-ad-dc sudo systemctl enable samba-ad-dc sudo systemctl start samba-ad-dc sudo systemctl status samba-ad-dc sudo systemctl daemon-reload
Kerberosチケットの取得確認
Kerberosチケットの取得ができるか確認します。
Domain Controllerを作成した際に入力したAdministratorのパスワードを入力します。
sudo kinit administrator
作成したKerberos証明書を表示します。
sudo klist
動作確認
Realmを確認します。
samba-tool testparm --suppress-prompt | grep realm
Active Directory特有の値を引いてみます。
host -t SRV _ldap._tcp.ND.LOCAL
smbclientのテストを行います。
sudo smbclient //localhost/netlogon -UAdministrator -c 'ls'
サービスの確認を行います。
smbclient -L localhost -U% または smbclient -L localhost -N
ドメインレベルの確認を行います。
sudo samba-tool domain level show
guidの確認を行います。
sudo ldbsearch -H /var/lib/samba/private/sam.ldb '(invocationid=*)' --cross-ncs objectguid
FSMOの確認を行います。
sudo samba-tool fsmo show
ユーザとグループの追加
今後追加するユーザとグループが属するOUを登録します。
sudo samba-tool ou create 'OU=user,DC=nd,DC=local' sudo samba-tool ou create 'OU=group,DC=nd,DC=local'
ユーザ「username」を追加します。
Samba ADを使ってクライアントLinuxでユーザ認証を行うため、uidNumberとgidNumberなどを指定します。
sudo samba-tool user add username "password" --uid-number=1001 --gid-number=1001 --unix-home="/home/username" --userou='OU=user' --nis-domain=ND.LOCAL --login-shell=/bin/bash
登録したユーザのgidNumberに名称を付けます。
Linuxではデフォルトでユーザ名とグループ名が同一の名称になります。
しかし、Samba ADでは同一のユーザ名とグループ名が許可されていないので、usernameに「_group」を追加した名称とします。
samba-tool group add username_group --gid-number=1001 --nis-domain=ND.LOCAL
グループポリシー設定
Samba ADのパスワードの最小使用期間などの現在値を表示します。
samba-tool domain passwordsettings show
最小使用期間を無効にします。
samba-tool domain passwordsettings set --min-pwd-age=0
パスワードの長さを最低10文字に設定します。
samba-tool domain passwordsettings set --min-pwd-length=10
usernameのパスワードを無期限に設定します。
samba-tool user setexpiry username --noexpiry
パスワードの最大使用期間を無制限にします。
samba-tool domain passwordsettings set --max-pwd-age=0
パスワードの変更履歴を無効にします。
何回でも同じパスワードを使用できるようにします。
samba-tool domain passwordsettings set --history-length=0
グループポリシーの反映(Windowsクライアント)
グループポリシーを変更したら、Windowsクライアント側でポリシーを更新するコマンドを「管理者権限」で実行します。
gpupdate /force klist purge
グループポリシーの反映(Linuxクライアント)
グループポリシーを変更したら、コマンドを実行します。
・Linux クライアントが Kerberos 認証を使用してドメインに参加している場合、Kerberos チケットのキャッシュをクリアします。
・キャッシュをクリアした後、チケットを再取得します。
・Sambaドメインに参加しているLinuxクライアントではSSSDを使っているので、SSSDを再起動します。
kdestroy kinit Administrator sudo systemctl restart sssd
chageコマンドを使ってパスワードのポリシーが反映されていることを確認します。
または、パスワードコマンドで確認します。
chage -l ユーザー名 passwd
その他のコマンド
usernameのパスワードを強制的にxxxxxに変更します。
samba-tool user setpassword username --newpassword="xxxxx"
usernameをグループ「groupname」に追加します。
また、username1,username2,username3を一度に登録できます。
sudo samba-tool group addmembers groupname username sudo samba-tool group addmembers groupname username1,username2,username3
usernameをグループ「groupname」から削除します。
また、username1,username2,username3を一度に削除できます。
sudo samba-tool group removemembers kkitajo_group username sudo samba-tool group removemembers kkitajo_group username1,username2,username3
グループの一覧を表示します。
wbinfo -g samba-tool group list
ユーザの情報を確認します。
sudo samba-tool user show username
グループに所属するユーザの一覧を表示します。
samba-tool group listmembers "Domain Users"
usernameのSIDを表示します。
wbinfo -n kkitajo
接続中のユーザを表示します。
net status sessions
グループ「groupname」の情報を表示します。
samba-tool group show groupname
ユーザusernameがパスワードを変更した記録を参照します。
pwdLastSetはWindows NT時間(1601年1月1日からの100ナノ秒単位の経過時間)です。
sudo ldbsearch --url=/var/lib/samba/private/sam.ldb '(&(objectClass=user)(sAMAccountName=username))' pwdLastSet
ユーザを削除後、再度同じユーザ名で登録する場合
不要になったユーザ「testuser」を削除後、同じ条件で再登録すると以下のエラーが表示されます。
samba-tool user delete testuser sudo samba-tool user create testuser password --userou='OU=user' --uid-number=1001 --gid-number=1001 --unix-home=/home/testuser --nis-domain=ND.somedomain --login-shell=/bin/bash
以下がエラー内容です。
samldb: samAccountName 'testuser' already in use!
これはsam.ldbに情報が残っているのが原因なので、以下のコマンドで探します。
sam.ldbファイルの場所は、Debianの場合は/var/lib/samba/private/sam.ldbとなります。
sudo ldbsearch --url=/var/lib/samba/private/sam.ldb | grep testuser
該当エントリがあると、以下のように表示されます。
確かにsAMAccountNameが残っています。
# record 4 dn: CN=testuser,OU=group,DC=nd,DC=somedomain cn: testuser name: testuser sAMAccountName: testuser msSFU30Name: testuser distinguishedName: CN=testuser,OU=group,DC=nd,DC=somedomain
以下のコマンドでsam.ldbにある該当レコードの全て、今回は「# record 4」を削除して保存します。
私の環境ではldbeditから内部でviコマンドが起動されて編集できました。
あらかじめデフォルトのエディタを設定すると良いです。
sudo update-alternatives --config editor sudo ldbedit --url=/var/lib/samba/private/sam.ldb
編集後、testuserユーザの登録を行うことが可能です、
データベースのエラー検出と修正
データベース周りで問題が起こった場合は、Samba Active Directoryデータベースの問題を検出して修正します。
エラーがないか確認します。
sudo samba-tool dbcheck --cross-ncs --reset-well-known-acls --fix --yes
エラーを修正します。
sudo samba-tool dbcheck --cross-ncs --reset-well-known-acls --fix
Comments