我有一个包含 NAS 的小型网络。我通过一些努力在其上配置了 Kerberos 服务器。Kerberos 服务器允许网络上的 Linux 主机创建安全的 NFS 挂载。在 KDC 上创建的服务密钥被分发到适当的主机,并且挂载配置了 Kerberos 安全性。NAS 上配置的策略会阻止不安全的挂载。
不方便的是,用户只有在主机上有来自 KDC 的有效票证时才能访问挂载上的文件。由于不便,此要求具有限制性,并且通过以常规用户权限运行的自动化任务限制对挂载的访问更是如此。
在 NFS 的早期,远程卷上的文件将显示为本地文件,从引导开始,并在整个系统会话中持续存在。安全性和身份管理是 NFS 中 Kerberos 的重要优势,但通常不需要向用户授予票证。由于密钥分发和对主机的受控访问可以防止对 NFS 挂载的不必要访问,因此我不需要用户票证。
理想情况下,我希望用户无需向 KDC 请求票证,甚至不需要在其上注册主体即可访问具有 Kerberos 安全性的挂载。任何用户都可以随时访问任何文件,前提是访问不受每个文件权限的限制。
通过现有工具,这个目标场景有多接近?
简短的回答是当前的 NFS Kerberos 身份验证机制 (RPCSEC_GSS) 不支持这一点。拨打电话的负责人是获得访问权限的人。因此,如果您不希望用户手动获取票证,那么您需要让主机自动为他们获取票证。
将来,较新的 RPCSEC_GSSv3 协议可能具有允许主机模拟任意用户的选项,但尚未完成或实施。
如果您想允许主机模拟任何 UID,那么您根本不需要 Kerberos – 切换回
sec=sys
“过去”使用的安全模式。在这种模式下,主机从字面上指定用户的符号标识符。(当然,仍然会进行权限检查。)最后,允许主机通过 Kerberos 模拟任何用户(使用主机的 /etc/krb5.keytab 进行身份验证)与允许主机通过基本 UID 声明模拟任何用户(使用主机的 IPsec 进行身份验证)在功能上没有区别或 WireGuard 私钥或)——后者将为您提供比 GSSAPI 所能达到的更高的性能。
在 Kerberos 中,当仅使用现有工具时(没有直接为 RPC 实现某种主机级身份验证),您拥有的最接近的事情是通过协议转换(S4U2Self + S4U2Proxy)进行约束委派,其中允许服务获取特定的票证用户名下的其他服务。它通常用于 Active Directory 环境,但也受到 MIT Kerberos KDC 的支持(可能还有 Heimdal KDC - 代码就在那里,感谢 Samba,但我不知道如何在 Heimdal 上启用它)。
要在 MIT Kerberos KDC 中启用此功能,您需要使用 LDAP 后端;基于文件的 HDB 后端不支持存储附加字段。
在客户端的主机主体上设置
ok_to_auth_as_delegate
主体标志(可以通过 kadmin 或通过0x200000
对krbTicketFlags
LDAP 属性进行 ORing 来完成)。将客户端主体的
krbAllowedToDelegateTo
LDAP 属性设置为它可能为其创建假票证的 NFS 服务主体列表。(每个价值一项服务。)以 root 身份测试 S4U 功能是否正常工作:
在客户端上安装gss-proxy,并编辑其包含
nfs-client.conf
以使用 S4U2Proxy 而不是单个客户端密钥表:此示例基于https://github.com/gssapi/gssproxy/blob/main/docs/NFS.md#user-impersonation-via-constrained-delegation。
通过添加到环境中,将客户端的rpc.gssd守护进程配置为使用 gss-proxy :
GSS_USE_PROXY=1
如果 Kerberos 专门用于 NFS,并且如果每个主机只需要一组有限的用户,那么主机可以为这些用户存储客户端密钥表(其中包含密码派生密钥)。这大致相当于存储用户的密码,因为 keytab 允许