可以通过 Kerberos 但没有域加入来验证 Samba 吗?

Dar*_*eek 8 linux active-directory kerberos samba

使用 Kerberos 配置文件...

[realms]
  DOMAIN.COM = {
    kdc = dc1.domain.com
    admin_server = dc1.domain.com
  }
Run Code Online (Sandbox Code Playgroud)

... Linux 可以与 Active Directory 对话以进行密码验证,而不必是 AD 域成员:

$ kinit jdoe
Password for jdoe@DOMAIN.COM:
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: jdoe@DOMAIN.COM

Valid starting     Expires            Service principal
01/12/15 15:36:16  01/13/15 01:36:25  krbtgt/DOMAIN.COM@DOMAIN.COM
        renew until 01/19/15 15:36:16
Run Code Online (Sandbox Code Playgroud)

此时,您可以使用 PAM 在 /etc/passwd 中定义本地 Linux 用户,但通过 Active Directory 对他们的 TTY 会话进行身份验证。通过 krb5 进行身份验证是作为每个登录上下文完成的:

auth        sufficient    pam_krb5.so use_first_pass
Run Code Online (Sandbox Code Playgroud)

但是,如果 krb5 已经作为 PAM 全局默认值的一部分实现了,为什么 Samba 不也选择它呢?我看到 /etc/pam.d/samba 包含了 Kerberized password-auth 文件,但在访问 SMB 卷时没有乐趣。(调试日志表明一个 failed-to-get-SID 错误,这是非常“你不是域的一部分”。)

我的基本问题是:是否可以在 Samba 下完成类似的 krb5 身份验证集中化,就像在 Shell 中一样,而没有域成员资格的所有额外开销/复杂性?我需要在一组 NIS 集群系统上实现 Samba 服务,但不希望每个系统上都有不同的 TDBSAM 后端导致 SMB 密码混淆。使用 Kerberos 作为我的身份验证器会很棒。但是,我仍然想通过本地 Linux 帐户定义授权/访问,而不是像域加入、winbind DC 仿真或成熟的 AD 服务器那样向所有域用户开放 Samba 访问。

或者:Linux 集群中的 Samba 是否有更好的集中式后端身份验证选项?我查看了 CTDB,但它似乎面向调解共享存储而不是具有不同卷的中央身份验证......

Dar*_*eek 7

桑巴对不同的人意味着不同的东西。对某些人来说,这是一种无需向 Microsoft 缴纳什一税即可实现 LanMan 式网络的方法,即使用 WinBind 提供伪域控制器服务,而无需实际运行 Windows Server。这也许就是为什么 'drookie' 发表评论的原因:“似乎你有 AD 运行,但由于某种原因你不想使用它。那为什么还要使用 samba 呢?”。为什么?因为我主要使用 Samba 来提供基本的 CIFS 支持。所有额外的 WinBind/ADS 主目录和缓存的 DC 数据都是我并不真正想要的。我一直在寻找 Linux 来定义授权和访问,而不是向所有域用户开放。但是对于允许的用户,请使用 Kerberos 身份验证。(Samba——尤其是 Samba4——正朝着 Windows AD 域中 Linux 节点的完整 Active Directory 模拟,一直到 SID/GUID、OU 成员资格等的继承。他们的目标是不需要创建 Linux 本地帐户,因为 Samba 将根据 AD 配置文件即时创建它们。满足我的需求。)

由于我主要将 Samba 用于 CIFS 功能,因此我希望 AD 只能用于通过 Kerberos 调用的身份验证部分(因为我已经为 SSH 实现了)。如果我不需要域加入来让 Kerberos 在 TTY/SSH 级别工作,我真的需要它用于 Samba+Kerberos 吗?不幸的是,答案是肯定的。但尽管如此,我仍然能够实现 AD/Kerberos 身份验证的目标,而无需将 Linux 主机变成 PDC/BDC 或将所有身份验证控制推迟到 ADS 模式。我有什么作品,这是我对原因的解释:

基本 Kerberos 在 PAM/TTY 级别工作,因为用户以交互方式输入密码,直接输入 krb5 库;在用户执行请求的上下文中运行时,不需要域加入。但是,在验证 CIFS 共享的情况下,Windows 客户端已经对用户键入的密码进行了加密,因此当 Samba 获得它时,它是 NTLMv2 哈希。这可能就是为什么 O'Reilly “Hornbill book” 说“auth PAM 模块行被 Samba 完全忽略”的原因。在这种情况下,Samba 必须安全地联系 AD 服务器以检索凭据详细信息,以确定用户/密码是否正确。因此,需要加入域。本质上,加入域的 Samba 充当 Kerberos 代理来联系 AD 并验证客户端凭据。

我发现即使需要加入域,也不需要运行本地 WinBind 守护程序或将 Linux 主机变成完整的 AD 服务器。这是我在 Samba4 配置文件中所做的:

security = ADS 
passdb backend = tdbsam

realm = DOMAIN.COM 
password server = * 
encrypt passwords = yes 
lanman auth = no 
ntlm auth = no                    # NTLMv2
kerberos method = system keytab 
username map = /etc/samba/smbusers 
guest account = nfsnobody 
map to guest = Bad User 
obey pam restrictions = yes
Run Code Online (Sandbox Code Playgroud)

它可能更显著指出什么我也不会做的事:

  • smb.conf 配置文件中省略了 winbind 指令
  • winbind 服务未启用/运行(将 AD 数据缓存为 DC)
  • winbind 未添加到 /etc/nsswitch.conf(使用域作为有效的本地用户源)
  • winbind 和 mkhomedir 未添加到 /etc/pam.d/system-auth(以允许域用户即时登录和创建帐户)

最低限度是需要域加入才能启用相对于本地用户访问的 Kerberos 查找:

# net ads join -U Administrator
# net ads keytab create
Run Code Online (Sandbox Code Playgroud)

但是,没有启用将 Linux 主机变成携带卡的访问授权 PDC/BDC 或 ADS 替代品的服务。我严格使用 Samba+Kerberos 进行本地用户验证,仅此而已。

  • 我能够使用 SSSD 并设置 security = USER 在 Samba 4.8 中继续使用此方法。我已经在 samba 邮件列表上发布了配置文件 https://lists.samba.org/archive/samba/2018-June/216623.html (3认同)

dro*_*kie 0

您可以在 NIS 之上运行 samba,在这种情况下,用户数据库将由它同步,并且无需加入域,您将拥有一堆独立的 samba 服务器。这也意味着您必须在每台服务器上手动添加域用户或至少添加他们的密码。这可能不是你想要的。

您还可以尝试使用 AD LDAP 作为 samba 用户的 ldap 后端,而无需加入域。

所以有很多选择,但说实话,我不明白你的意思。似乎您正在运行 AD,但由于某种原因您不想使用它。那为什么还要使用桑巴呢。