部署 Samba Active Directory 域控制器

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 服务器。通常接下来创建用户与组,把成员服务器和工作站加入域;工作站用户以域凭据登录,成员服务器提供文件与打印服务。

进一步阅读

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容