Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.7. 保护 NFS

NFS 适合透明地共享具有大量已知主机的整个文件系统。但是,由于易于使用,存在各种潜在安全问题。为最大程度地降低 NFS 安全风险并保护服务器上的数据,在服务器上导出 NFS 文件系统或将其挂载到客户端上时,请考虑以下部分:

8.7.1. 具有 AUTH_SYS 和导出控制的 NFS 安全性

传统上,为了控制对导出文件的访问, NFS 提供了两个选项。
首先,服务器限制允许哪些主机通过 IP 地址或主机名挂载哪些文件系统。
其次,服务器对 NFS 客户端上的用户强制执行文件系统权限的方式与对本地用户执行的方式相同。传统上,它使用 AUTH_SYS (也称为 AUTH_UNIX)执行此操作,它依赖于客户端来声明用户的 UID 和 GID。请注意,这意味着恶意或配置错误的客户端可能会很容易地出现这个错误,并允许用户访问他不应该访问的文件。
为限制潜在的风险,管理员通常允许只读访问权限,或将用户权限压缩为公共的用户和组 ID 。不幸的是,这些解决方案阻止了以最初预期的方式使用 NFS 共享。
另外,如果攻击者获得了导出 NFS 文件系统的系统所使用的 DNS 服务器的控制,则与特定主机名或完全限定域名关联的系统可以会指向未经授权的机器。此时,未经授权的机器 允许挂载 NFS 共享的系统,因为没有交换用户名或密码信息来为 NFS 挂载提供额外的安全。
在通过 NFS 导出目录时应谨慎使用通配符,因为通配符的范围可能包含比预期更多的系统。
也可以使用 TCP 包装程序限制对 rpcbind[1] 服务的访问。使用 iptables 创建规则也可以限制对 rpcbindrpc.mountdrpc.nfsd 使用的端口的访问。
有关保护 NFS 和 rpcbind 的更多信息,请参阅 man iptables

8.7.2. 带有 AUTH_GSS的 NFS 安全性

NFSv4 通过规定 RPCSEC_GSS 和 Kerberos 版本 5 GSS-API 机制的实施来促进 NFS 安全性。但是,RPCSEC_GSS 和 Kerberos 机制也可用于所有版本的 NFS。在 FIPS 模式中,只能使用 FIPS 批准的算法。
与 AUTH_SYS 不同,使用 RPCSEC_GSS Kerberos 机制,服务器不依赖于客户端就可以正确地表示哪个用户正在访问文件。相反,加密用于向服务器验证用户的身份,这可防止恶意客户端在没有用户的 Kerberos 凭据的情况下模拟用户。使用 RPCSEC_GSS Kerberos 机制是保护挂载的最直接方法,因为配置了 Kerberos 后不需要额外的设置。

配置 Kerberos

在配置 NFSv4 Kerberos 感知服务器前,您需要安装和配置 Kerberos 密钥分发中心(KDC)。Kerberos 是一种网络身份验证系统,其允许客户端和服务器使用对称加密和信任的第三方 KDC 来互相进行身份验证。红帽建议使用身份管理(IdM)来设置 Kerberos。

过程 8.3. 为 IdM 配置 NFS 服务器和客户端以使用 RPCSEC_GSS

    • 在 NFS 服务器端创建 nfs/hostname.domain@REALM 主体。
    • 在服务器和客户端端创建 host/hostname.domain@REALM 主体。
      注意
      主机名 必须与 NFS 服务器主机名相同。
    • 将对应的密钥添加到客户端和服务器的 keytab 中。
    具体步骤请查看 Red Hat Enterprise Linux 7 Linux Domain Identity, Authentication, and Policy Guide 中的 Adding and Editing Service Entries and Keytabs and setting an Kerberos-aware NFS Server 部分。
  1. 在服务器端,使用 sec= 选项启用所需的安全类型。启用所有安全类型和非加密挂载:
    /export *(sec=sys:krb5:krb5i:krb5p)
    
    sec= 选项一起使用的有效安全类型为:
    • sys: 没有加密保护,默认
    • krb5: authentication only
    • krb5i: 完整性保护
    • krb5p: 隐私保护
  2. 在客户端,将 sec=krb5 (或 sec=krb5i, 或 sec=krb5p,具体取决于设置)添加到挂载选项:
    # mount -o sec=krb5 server:/export /mnt
    
    有关如何配置 NFS 客户端的详情,请参考 Red Hat Enterprise Linux 7 Linux 域身份、身份验证和策略指南中的 设置 Kerberos 感知 NFS 客户端 部分

其它资源

8.7.2.1. 使用 NFSv4 的 NFS 安全性

NFSv4 包括基于 Microsoft Windows NT 模型的 ACL 支持,而不是 POSIX 模型,因为 Microsoft Windows NT 模型的功能和广泛的部署。
NFSv4 的另一个重要安全功能是删除使用 MOUNT 协议来挂载文件系统。MOUNT 协议存在安全风险,因为协议处理文件句柄的方式。

8.7.3. 文件权限

远程主机一旦将 NFS 文件系统挂载为读取或读写,则保护每个共享文件的唯一方法就是其权限。如果共享同一用户 ID 值的两个用户挂载同一个 NFS 文件系统,则他们可以修改彼此的文件。此外,在客户端系统上以 root 身份登录的任何人都可以使用 su - 命令访问 NFS 共享的任何文件。
默认情况下,Red Hat Enterprise Linux 的 NFS 支持访问控制列表(ACL)。红帽建议保持启用此功能。
默认情况下,NFS 在导出文件系统时使用 root 压缩。这会将本地机器上以 root 用户身份访问 NFS 共享的用户 ID 设置为 nobody。root squashing 由默认选项 root_squash 控制 ; 有关这个选项的详情请参考 第 8.6.1 节 “/etc/exports 配置文件”。如果可能的话,切勿禁用 root 压缩。
将 NFS 共享导出为只读时,请考虑使用 all_squash 选项。这个选项使访问导出的文件系统的每个用户都使用 nfsnobody 用户的用户 ID。