如何自动将 Linux 容器加入 Samba 域?

如何自动将 Linux 容器加入 Samba 域?

我有一个 Samba 域控制器(也在容器中运行),我想启动一个新容器并让它成为域的成员。此操作的正常过程是进入容器并运行

net ads join -U administrator

然后输入管理员密码。我已完成所有这些步骤,但现在我想自动输入密码。我真的不想将未加密的管理员密码存储在磁盘上;我希望只有人类知道。所以,请不要使用仅将密码回显到命令中的解决方案。

我对这两个容器(在 docker 中运行)都有 root 访问权限,我确信我可以在 DC 上运行一些命令来导出票据,然后在新客户端上导入该票据。我只是对 Kerberos 了解不够多,不知道该怎么做。

服务器和客户端都是 Debian bookworm 上的 Samba 4.17.12-Debian,大部分配置都采用默认配置。

我已经研究过网络细节,以使这些容器看起来像网络上的虚拟机,因此您可以假设这与我询问具有每个容器的 root ssh 访问权限的真实 Linux 主机相同。


更新:

我了解到,要将 samba 加入域,它必须将实际的机器密码保存在 /var/lib/samba/private/secrets.tdb 中,并且初始化它的唯一方法几乎是通过tdbtool将文字密码写入密钥中SECRETS/MACHINE_PASSWORD/$DOMAIN,其中是工作组名称(而不是 AD 领域)。然后,您可以使用(存储新密码哈希,但不在任何地方存储该密码)$DOMAIN在域控制器上设置机器密码samba-tool user setpassword --newpassword=XXXXXX MACHINE$

这可能是模拟连接发生的许多步骤中的第一步。

答案1

我会将密码或机密存储在 Azure Key Vault 中,然后“链接/引用”脚本中存储密码的机密

以下是如何从 Azure Key Vault 获取机密的示例 https://gist.github.com/shtratos/6c03ba89b302ff9ca6084d9ade627b79

如果您要从域控制器导出内容,则可能会过期,使用密钥保管库,您可以更新密钥保管库中的密码,然后它继续工作,而不必每次过期时都导入内容(您可能会忘记这一点)

答案2

我仍然对如何将机器添加为成员的底层细节感兴趣,但更实际的解决方案是这样的:

  1. 在域管理员组中创建一个临时用户并分配一个临时随机密码。
  2. 使用临时管理员凭据创建容器并将其加入域。
  3. 删除临时管理员帐户。(或者只是删除密码)

所有这些都可以通过脚本samba-toolnet命令来编写,而无需知道实际的管理员密码。

临时管理员甚至可以是容器本身的机器帐户。只需将机器帐户临时添加到管理员,然后在成为域成员后将其从管理员中删除。

解释我的脚本(由于我制作的自定义库而变得复杂)它看起来像:

# In the domain controller container:
samba-tool computer list -d1   # find out if machine account exists
# if it doesn't...
   samba-tool computer create $machine -d1
   samba-tool group addmembers "Domain Admins" $machine -d1
samba-tool user setpassword --newpassword=$random_pw $machine -d1

# In the file server container:
echo $random_pw | net ads join -U $machine

# Back in the domain controller container:
samba-tool group removemembers "Domain Admins" $machine -d1

(-d1 可防止破坏输出处理的无用警告消息)

相关内容