Samba AD/DCでLinuxとWindowsのユーザ認証を行う。part1:Samba AD/DCの構築

LinuxWindows

はじめに

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」を削除後、同じ条件で再登録すると以下のエラーが表示されます。

Re: [Samba] The problem with setting up AD domain to Samba 4
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データベースの問題を検出して修正します。

Dbcheck - SambaWiki
Sambaの更新 - 雑廉堂Wiki

エラーがないか確認します。

sudo samba-tool dbcheck --cross-ncs --reset-well-known-acls --fix --yes

エラーを修正します。

sudo samba-tool dbcheck --cross-ncs --reset-well-known-acls --fix

Comments