NFS/Kerberos
Kerberos 是 NFS 可用的少数安全机制之一。它提供强大的用户身份验证、强大的数据加密,并且(对于 NFSv4)消除了客户端和服务器之间 UID/GID 匹配的要求。
推荐将 NFSv4 用于 Kerberos。虽然可以在 NFSv3 中启用 Kerberos,但它不会提供 100% 的覆盖率,因为辅助 NFSv3 协议(例如“mount”协议)仍然不安全,并且 NFSv3 中缺少 idmapping 也严重降低了 Kerberos 的可用性。
先决条件
Kerberos 需要 KDC(密钥分发中心)服务在某处运行。 MIT Kerberos (krb5) 自带的 krb5-kdc.service
对于小型设置来说是一个不错的选择,这些小型设置不需要 Active Directory 或 FreeIPA 的复杂性。 第二个选择是 Heimdal,在一些 BSD 上可以找到,在 Arch 上可以作为 heimdalAUR 找到。
NFSv4 idmapping 对于 Kerberos 来说变得更加重要。 服务器和客户端都应配置相同的 idmapping 域
/etc/idmapd.conf
[General] Domain = example.com
服务器配置
每个 NFS 服务器都需要在 KDC 上为 nfs/server.fqdn
创建 Kerberos 主体,并将其密钥添加到服务器的 /etc/krb5.keytab
。
建议也在那里拥有标准的 host/
主体,用于其他目的。
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 服务密钥表放置在标准位置之外,不需要任何调整。
您的 /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 上使用,但可能在 LAN 上提供较差的吞吐量 – 考虑在 RPC-with-TLS 内部使用krb5
。krb5i
提供“完整性”(基于 Kerberos 的 MAC),但不加密。 它可能对服务静态数据很有用,因为它仍然可以防止数据包篡改。krb5
仅提供身份验证,没有数据完整性或加密。 如果您通过xprtsec=
启用了 RPC-over-TLS 或者 Kerberos 在“安全” LAN(例如通过 WireGuard 隧道)上运行,则这是一个不错的选择,但当然不能在公共网络上以明文形式运行。sys
是传统的基于 UID 的(非 Kerberos)NFS 安全模式。
客户端配置
除了用户之外,每个 NFS 客户端都应在 /etc/krb5.keytab
中拥有一个机器 Kerberos 主体,这将在用户 Kerberos 票证尚不可用时使用 – 特别是,在任何用户登录之前(或者如果通过 autofs 完成挂载),实际挂载启动时的文件系统将需要它。 更一般而言,所有“以 root 身份”完成的操作都将以机器主体身份进行身份验证。
与服务器情况不同,客户端机器不需要特定的 nfs/
主体 – 拥有通用的 host/the.fqdn
主体就足够了。(有关它查找的内容,请参阅 rpc.gssd 手册页。)
客户端必须具有活动的 rpc-gssd.service
(即 rpc.gssd
守护程序)。
挂载文件系统时使用的选项与 /etc/exports
中使用的选项非常相似; 您可以使用 sec=
选项指定一种或多种风格。 尽管客户端将自动使用提供的最强模式,但仍建议显式要求例如 sec=krb5p
以防止降级攻击。
一旦文件系统被挂载,root 可能已经可以访问它(使用机器的 Kerberos 凭据),但每个非 root 用户都需要他们自己的 Kerberos 票证才能存在。 这意味着要么让用户手动为自己运行 kinit
,要么设置 pam-krb5 以在登录期间获取票证(仅适用于基于密码的登录),或者使用 gssproxy
或 k5start(1)(来自 kstartAUR)从密钥表文件获取票证。