Samba Active Directory 域控制器(简称 Samba AD/DC)是运行 Samba 服务的服务器,能够为 Linux 或 Windows 域用户和计算机提供认证。它应专用于认证与授权,不应提供文件或打印服务;这些应由加入域的成员服务器承担。
本指南介绍如何初始化 Samba AD/DC,并验证其正常工作。
安装
安装用于初始化和测试服务的软件包:
sudo apt install samba-ad-dc krb5-user bind9-dnsutils
安装 krb5-user 时可能提问。此时可以直接按 Enter 接受默认值,包括 Kerberos realm 和服务器相关问题。
接着禁用常规 Samba 服务 smbd、nmbd 和 winbind:
sudo systemctl disable --now smbd nmbd winbind
sudo systemctl mask smbd nmbd winbind
启用 Samba AD/DC 服务,但暂不启动:
sudo systemctl unmask samba-ad-dc
sudo systemctl enable samba-ad-dc
初始化工具需要创建专用于 AD/DC 角色的 Samba 配置,但不会覆盖已有配置。因此继续之前,先移走原文件:
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
初始化域
软件包安装完成后,可以初始化服务。本指南采用:
- 域:
EXAMPLE - Realm:
EXAMPLE.INTERNAL - 管理员密码:
Passw0rd,实际使用时自行选择密码。
运行:
sudo samba-tool domain provision \
--domain EXAMPLE \
--realm=EXAMPLE.INTERNAL \
--adminpass=Passw0rd \
--server-role=dc \
--use-rfc2307 \
--dns-backend=SAMBA_INTERNAL
省略 --adminpass 时,工具会随机生成密码并输出,务必保存。
命令通常运行几秒,输出大量信息。结尾类似如下,长行已截短以便阅读:
(...)
INFO ... #498: Server Role: active directory domain controller
INFO ... #499: Hostname: ad
INFO ... #500: NetBIOS Domain: EXAMPLE
INFO ... #501: DNS Domain: example.internal
INFO ... #502: DOMAIN SID: S-1-5-21-2373640847-2123283686-338028823
未使用 --adminpass 时,管理员密码会出现在类似的输出行中:
INFO ... #497: Admin password: sbruR-Py>];k=KDn1H58PB#
安装后配置
AD/DC 还未运行。启动前需要完成若干配置。
首先,修改 /etc/samba/smb.conf 的 dns forwarder,让它指向 DNS 服务器,用于查询新建 Active Directory 域 EXAMPLE.INTERNAL 之外的名称。初始化脚本只是从 /etc/resolv.conf 复制服务器 IP;若保持不变,就会指回自身:
[global]
dns forwarder = 127.0.0.53
不确定时,最好使用系统当前的 DNS 服务器。运行 resolvectl status,找到 Current DNS Server 并记下 IP:
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2 (enp5s0)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 10.10.17.1
DNS Servers: 10.10.17.1
DNS Domain: lxd
本例 DNS 服务器为 10.10.17.1,因此修改为:
[global]
dns forwarder = 10.10.17.1
接下来让系统使用 Samba DNS 查询,修改 /etc/resolv.conf。该文件是符号链接,不能直接改写内容,应先删除链接:
sudo unlink /etc/resolv.conf
重新创建 /etc/resolv.conf,写入:
nameserver 127.0.0.1
search example.internal
解析器将直接使用 Samba DNS,因此停止并禁用 systemd-resolved:
sudo systemctl disable --now systemd-resolved
最后,以初始化脚本生成的内容更新 /etc/krb5.conf。本机专用于 Samba AD/DC,可以直接复制:
sudo cp -f /var/lib/samba/private/krb5.conf /etc/krb5.conf
如果涉及其他 Kerberos realm,应手动合并两个文件。
现在可以启动 Samba AD/DC:
sudo systemctl start samba-ad-dc
安装至此完成,接着进行基本检查。
验证
以下步骤用于确认初始化正确、服务就绪。
Kerberos 认证
用 kinit 为 Administrator 主体取得 Kerberos 票据。不需要 root;以当前用户获取其他主体、包括特权主体的票据是允许的:
kinit Administrator
输入此前初始化域时提供的管理员密码,或未设置 --adminpass 时生成的随机密码:
Password for Administrator@EXAMPLE.INTERNAL:
用 klist 验证取得的票据;输出类似:
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: Administrator@EXAMPLE.INTERNAL
Valid starting Expires Service principal
07/24/24 13:52:33 07/24/24 23:52:33 krbtgt/EXAMPLE.INTERNAL@EXAMPLE.INTERNAL
renew until 07/25/24 13:52:02
DNS 测试
利用刚取得的票据检查 Samba DNS。配置正确时,hostname 应能返回短主机名和完全限定主机名。
查看短主机名:
hostname
查看完全限定主机名:
hostname -f
例如 hostname -f 返回 ad.example.internal,而 hostname 只返回 ad。
服务器信息
确认这些信息后,进一步获取域控制器 DNS 服务信息;以下较长输出已截短:
samba-tool dns serverinfo $(hostname -f)
dwVersion : 0xece0205
fBootMethod : DNS_BOOT_METHOD_DIRECTORY
fAdminConfigured : FALSE
fAllowUpdate : TRUE
fDsAvailable : TRUE
pszServerName : AD.example.internal
pszDsContainer : CN=MicrosoftDNS,DC=DomainDnsZones,DC=example,DC=internal
(...)
虽然不明显,但 samba-tool dns serverinfo 使用了 Kerberos 认证。此时 klist 显示自动取得的另一张票据:
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: Administrator@EXAMPLE.INTERNAL
Valid starting Expires Service principal
07/24/24 14:29:55 07/25/24 00:29:55 krbtgt/EXAMPLE.INTERNAL@EXAMPLE.INTERNAL
renew until 07/25/24 14:29:53
07/24/24 14:29:59 07/25/24 00:29:55 host/ad.example.internal@EXAMPLE.INTERNAL
renew until 07/25/24 14:29:53
票据缓存中现在还包含 host/ad.example.internal@EXAMPLE.INTERNAL 主体。
DNS 记录
Samba AD 的 DNS 区域需要特定记录,以便发现服务。用这个脚本检查:
for srv in _ldap._tcp _kerberos._tcp _kerberos._udp _kpasswd._udp; do
echo -n "${srv}.example.internal: "
dig @localhost +short -t SRV ${srv}.example.internal
done
输出不应报错,并应包含每次查询对应的记录:
_ldap._tcp.example.internal: 0 100 389 ad.example.internal.
_kerberos._tcp.example.internal: 0 100 88 ad.example.internal.
_kerberos._udp.example.internal: 0 100 88 ad.example.internal.
_kpasswd._udp.example.internal: 0 100 464 ad.example.internal.
主机自身也必须出现在 DNS 中:
dig @localhost +short -t A $(hostname -f)
该命令应返回本机 IP 地址。
创建用户测试
samba-tool 可以创建用户、组和其他对象;既可远程管理 Samba AD,也可在本机管理。在本机以 root 运行时,无需进一步认证:
samba-tool user add noble
命令会询问 noble 的密码;满足复杂度要求后创建用户。与 Administrator 一样,可以用 kinit noble 验证认证。
默认密码策略较严格,要求复杂密码。查看当前域策略:
sudo samba-tool domain passwordsettings show
Password information for domain 'DC=example,DC=internal'
Password complexity: on
Store plaintext passwords: off
Password history length: 24
Minimum password length: 7
Minimum password age (days): 1
Maximum password age (days): 42
Account lockout duration (mins): 30
Account lockout threshold (attempts): 0
Reset account lockout after (mins): 30
这些设置都可以修改,包括复杂度。例如把最小密码长度设为12:
sudo samba-tool domain passwordsettings set --min-pwd-length=12
查看所有选项:
samba-tool domain passwordsettings set --help
下一步
Windows 和 Linux 系统可将该 Samba AD/DC 视为 Active Directory 服务器。通常接下来创建用户与组,把成员服务器和工作站加入域;工作站用户以域凭据登录,成员服务器提供文件与打印服务。
进一步阅读
- Active Directory Domain Services 概述
- samba-tool(8) 手册
- Active Directory 集成:选择集成方式;加入成员服务器;加入工作站(不运行 Samba 服务)。











暂无评论内容