使用 Kerberos 配置文件...
[realms] DOMAIN.COM = { kdc = dc1.domain.com admin_server = dc1.domain.com }
...Linux 可以与 Active Directory 通信以进行密码验证,而不必成为 AD 域成员:
$ kinit jdoe Password for [email protected]: $ klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: [email protected] Valid starting Expires Service principal 01/12/15 15:36:16 01/13/15 01:36:25 krbtgt/[email protected] renew until 01/19/15 15:36:16
此时,您可以使用 PAM 在 /etc/passwd 中定义本地 Linux 用户,但通过 Active Directory 验证他们的 TTY 会话。通过 krb5 进行的身份验证是作为每个登录上下文完成的:
auth sufficient pam_krb5.so use_first_pass
但是,如果 krb5 已经作为 PAM 全局默认值的一部分实现,为什么 Samba 不选择它呢?我看到 /etc/pam.d/samba 包含 Kerberized 密码身份验证文件,但在访问 SMB 卷时却没有任何效果。(调试日志指示获取 SID 失败的错误,这非常“您不是域的一部分”。)
我的基本问题是:是否可以在 Samba 下实现与 Shell 类似的 krb5 身份验证集中化,而无需增加域成员资格的所有额外开销/复杂性?我需要在一组 NIS 群集系统上实现 Samba 服务,但不希望每个系统上都有不同的 TDBSAM 后端,从而导致 SMB 密码混淆。使用 Kerberos 作为我的身份验证器会很棒。但是,我仍然希望通过本地 Linux 帐户定义授权/访问,而不是像域加入、winbind DC 仿真或成熟的 AD 服务器那样向所有域用户开放 Samba 访问权限。
或者:在 Linux 集群中,是否有更好的 Samba 集中式后端身份验证选项?我查看了 CTDB,但它似乎更适合调解共享存储,而不是具有不同卷的中央身份验证……
答案1
Samba 对不同的人来说有不同的含义。对某些人来说,它是一种无需向 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 书”说 Samba“完全忽略了 auth PAM 模块行”的原因。在这种情况下,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
指出我做了什么可能更有意义不是做:
- 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
但是,没有启用任何服务来将 Linux 主机变成带卡访问授权 PDC/BDC 或 ADS 替代品。我仅使用 Samba+Kerberos 进行本地用户验证,仅此而已。
答案2
您可以在 NIS 上运行 samba,在这种情况下,用户数据库将由它同步,并且无需加入域,您将拥有一堆独立的 samba 服务器。这也意味着您必须在每个服务器上手动添加域用户或至少他们的密码。这可能不是您想要的。
您还可以尝试使用 AD LDAP 作为 samba 用户的 ldap 后端,而无需加入域。
所以有很多选择,但说实话,我不明白你的意思。似乎你正在运行 AD,但出于某种原因你不想使用它。那么为什么要使用 samba 呢?