NFS/Kerberos

出自 ArchWiki
< NFS

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

注意

此文章或章节需要扩充。

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

建议在那里拥有标准的 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 身份”完成的操作都将以机器主体身份进行身份验证。

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

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

客户端必须具有活动的 rpc-gssd.service(即 rpc.gssd 守护程序)。

挂载文件系统时使用的选项与 /etc/exports 中使用的选项非常相似; 您可以使用 sec= 选项指定一种或多种风格。 尽管客户端将自动使用提供的最强模式,但仍建议显式要求例如 sec=krb5p 以防止降级攻击。

一旦文件系统被挂载,root 可能已经可以访问它(使用机器的 Kerberos 凭据),但每个非 root 用户都需要他们自己的 Kerberos 票证才能存在。 这意味着要么让用户手动为自己运行 kinit,要么设置 pam-krb5 以在登录期间获取票证(仅适用于基于密码的登录),或者使用 gssproxyk5start(1)(来自 kstartAUR)从密钥表文件获取票证。

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