NFS/Kerberos
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 文件中。
建议同时在此处添加标准的 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 进行身份验证。
与服务器情况不同,客户端机器不需要特定的 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 在登录时获取票据(这只适用于基于密码的登录),或者使用 gssproxy 或 k5start(1)(来自 kstartAUR)从 keytab 文件中获取票据。