跳转至内容

NFS/Kerberos

来自 ArchWiki
< NFS

Kerberos 是 NFS 可用的少数安全机制之一。它提供强大的每个用户的身份验证、强大的数据加密,并且(对于 NFSv4)消除了客户端和服务器之间匹配 UID/GID 的要求。

推荐使用 NFSv4 配合 Kerberos。虽然可以在 NFSv3 中启用 Kerberos,但这不能提供 100% 的覆盖,因为辅助 NFSv3 协议(例如“mount”协议)仍然不安全,并且 NFSv3 中缺乏 idmapping 功能也大大降低了 Kerberos 的可用性。

前提条件

Kerberos 要求 KDC (Key Distribution Center) 服务在某个地方运行。MIT Kerberos (krb5) 附带的 krb5-kdc.service 是小型设置的一个不错的选择,这些设置不需要 Active Directory 或 FreeIPA 的复杂性。第二个选择是 Heimdal,它存在于某些 BSD 系统中,并且在 Arch 上可以通过 heimdalAUR 获取。

对于 Kerberos,NFSv4 的 idmapping 功能变得更加重要。服务器和客户端都应配置相同的 idmapping 域。

/etc/idmapd.conf
[General]
Domain = example.com

服务器配置

每个 NFS 服务器都需要在 KDC 上创建一个名为 nfs/server.fqdn 的 Kerberos principal,并将其密钥添加到服务器的 /etc/krb5.keytab 文件中。

本文章或章节需要扩充。

原因: 为什么?(请在 Talk:NFS/Kerberos 中讨论)

建议同时在此处添加标准的 host/ principal,以用于其他目的。

fileserv# kadmin -p frob/admin
Password for frob/admin@EXAMPLE.COM: *********
kadmin:  addprinc -nokey nfs/fs.example.com
kadmin:  ktadd nfs/fs.example.com

gssproxy.service 必须在服务器上 启用启动

提示 较早的系统使用了 rpc.svcgssd,但它已不再存在于现代 nfs-utils 中,并已被 gssproxy 完全取代。

gssproxy 预先配置了 NFS 服务器支持(/etc/gssproxy/24-nfs-server.conf 文件是标准包的一部分),无需任何调整,只需将 NFS 服务 keytab 放在标准位置即可。

您的 /etc/exports 文件应在 sec= 选项中提供 Kerberos 身份验证的协议。

/home    *(rw,sec=krb5p)
/usr     10.147.0.0/16(rw,sec=krb5p:krb5i:krb5:sys) *(rw,sec=krb5p)
注意 不要使用已废弃的 gss/krb5p(...) 语法。它仍然有效,但不应再使用。

可用的协议有

  • krb5p 提供“隐私”(基于 Kerberos 的加密)。它足够安全,可以在 Internet 上使用,但在局域网上的吞吐量可能不佳——可以考虑在 RPC-with-TLS 中使用 krb5
  • krb5i 提供“完整性”(基于 Kerberos 的 MAC),但不提供加密。它可能适用于提供静态数据,因为它仍然可以防止数据包篡改。
  • krb5 仅提供身份验证,不提供数据完整性或加密。如果您通过 xprtsec= 启用了 RPC-over-TLS,或者 Kerberos 在其他“安全”的局域网上运行(例如,通过 WireGuard 隧道),那么它是一个不错的选择,但绝对不能在明文环境下通过公共网络使用。
  • sys 是传统的基于 UID 的(非 Kerberos)NFS 安全模式。

客户端配置

除了用户之外,每个 NFS 客户端都应在 /etc/krb5.keytab 中拥有一个机器 Kerberos principal,用于在用户 Kerberos 票据尚不可用时的情况——特别是在启动时挂载文件系统,此时还没有任何用户登录(或者通过 autofs 进行挂载)。更广泛地说,“作为 root”执行的所有操作都将作为机器 principal 进行身份验证。

提示 对于 NFSv4.0 或 NFSv4.1,机器身份对于某些内部 NFS 操作也是强制性的,尽管在 NFSv4.2 中不再强制要求。

与服务器情况不同,客户端机器不需要特定的 nfs/ principal——拥有通用的 host/the.fqdn principal 就足够了。(请参阅 rpc.gssd 手册页了解其查找的内容。)

客户端必须激活 rpc-gssd.service(即 rpc.gssd 守护进程)。

挂载文件系统时使用的选项与 /etc/exports 中使用的选项非常相似;您可以使用 sec= 选项指定一个或多个协议。尽管客户端会自动使用最强的可用协议,但仍建议明确要求使用例如 sec=krb5p 来防止降级攻击。

文件系统挂载后,root 用户可能已经可以访问它(使用机器的 Kerberos 凭据),但每个非 root 用户都需要拥有自己的 Kerberos 票据。这意味着用户需要手动为自己运行 kinit,或者设置 pam-krb5 在登录时获取票据(这只适用于基于密码的登录),或者使用 gssproxyk5start(1)(来自 kstartAUR)从 keytab 文件中获取票据。

提示 您很可能需要设置 k5start 来续订票据,因为它们在获取后几小时就会过期。