亚马逊AWS官方博客

Amazon EFS 新增功能 – IAM 身份验证和接入点

在构建或迁移应用程序时,我们经常需要跨多个计算节点共享数据。 许多应用程序都使用文件 API,并且借助 Amazon Elastic File System (EFS) 可以轻松在 AWS 上使用这些应用程序,提供您可以从其他 AWS 服务和本地资源访问的可扩展、完全托管的网络文件系统 (NFS)。

EFS 可按需从零扩展到 PB 级容量,全程无中断,并随着文件的添加和移除自动增长和缩减,无需您预置和管理容量。它为您提供良好的文件系统一致性,覆盖 3 个可用区EFS 的性能将根据存储的数据量扩展,并且提供了预置所需吞吐量的选项。

去年,EFS 团队的关注重点是优化成本,为此他们推出了 EFS 不频繁访问 (IA) 存储类存储价格相比 EFS 标准存储类最高降低了 92%。您 可以通过设置生命周期管理策略以将在一定天数内没有访问的文件移动到 EFS IA,从而快速降低成本。

今天我们将推出两个新的功能,以简化访问权限的管理、数据集的共享以及 EFS 文件系统的保护:

  • 适用于 NFS 客户端的 IAM 身份验证和授权,此功能用于识别客户端并使用 IAM 策略来管理客户端特定的权限。
  • EFS 接入点,此功能用于强制使用操作系统用户和组,此外还可选择限制对文件系统中某个目录的访问权限。

IAM 身份验证和授权的使用
EFS 控制台中,我可以在创建或更新 EFS 文件系统时设置文件系统策略。这是一个 IAM 资源策略,与 Amazon Simple Storage Service (S3) 存储桶策略类似,可以用于(例如)为所有客户端禁用根访问权限、强制执行只读访问权限或强制执行传输中加密。

基于身份的策略(例如 IAM 用户、组或角色使用的策略)可以覆盖这些默认的权限。这些新功能的底层是 EFS 目前使用安全组的基于网络的访问权限。

我选择了“默认禁用根访问权限”选项,单击设置策略,然后选择 JSON 选项卡。在此处我可以查看根据我的设置生成的策略,也可创建更高级的策略,例如向不同的 AWS 账户或特定的 IAM 角色授予权限。

在 IAM 策略中可以使用以下操作来管理 NFS 客户端的访问权限:

  • ClientMount,此操作将赋予挂载具有只读访问权限的文件系统的权限
  • ClientWrite,此操作将赋予向文件系统写入的权限
  • ClientRootAccess,此操作将以根用户身份访问文件

我检查了策略 JSON。我看到我可以挂载和读取 (ClientMount) 该文件系统,并且可以在该文件系统中写入 (ClientWrite),但由于我选择了禁用根访问权限的选项,我没有 ClientRootAccess 权限。

同样,我可以将策略附加到某个 IAM 用户或角色以赋予特定的权限。例如,我可以创建一个 IAM 角色,并使用如下策略赋予对此文件系统的完全访问权限(包括根访问权限):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite",
                "elasticfilesystem:ClientRootAccess"
            ],
            "Resource": "arn:aws:elasticfilesystem:us-east-2:123412341234:file-system/fs-d1188b58"
        }
    ]
}

我启动了一个 Amazon Elastic Compute Cloud (EC2) 实例,此实例与该 EFS 文件系统位于同一 Amazon Virtual Private Cloud 中,它使用 Amazon Linux 2 和一个可以连接到该文件系统的安全组。此 EC2 实例使用我刚刚创建的 IAM 角色。

需要使用开源 efs-utils 以连接到使用 IAM 身份验证、传输中加密或同时使用这两种机制的客户端。正常情况下,我会在 Amazon Linux 2 上使用 yum 安装efs-utils,但新版本仍在不断推出,因此我将按照说明利用来自此存储库的源构建软件包。我将在更新的软件包可用时更新本博文。

为了挂载该 EFS 文件系统,我使用了 mount 命令。为了利用传输中加密功能,我添加了 tls 选项。此处我没有使用 IAM 身份验证,因此我在文件系统策略中为“*”委托人指定的权限将适用于此连接。

$ sudo mkdir /mnt/shared
$ sudo mount -t efs -o tls fs-d1188b58 /mnt/shared

我的文件系统策略默认禁用根访问权限,因此我无法以根用户身份创建新文件。

$ sudo touch /mnt/shared/newfile
touch: cannot touch ‘/mnt/shared/newfile’: Permission denied

我现在将使用 IAM 身份验证,将 iam 选项添加到 mount 命令(需要使用 tls 才能让 IAM 身份验证正常工作)。

$ sudo mount -t efs -o iam,tls fs-d1188b58 /mnt/shared

当我使用此挂载选项时,将使用来自我的 EC2 实例配置文件的 IAM 角色以及附加到该角色的权限(包括根权限)进行连接:

$ sudo touch /mnt/shared/newfile
$ ls -la /mnt/shared/newfile
-rw-r--r-- 1 root root 0 Jan  8 09:52 /mnt/shared/newfile

此处我使用该 IAM 角色来获取根访问权限。其他常见的使用案例包括强制执行传输中加密(使用 aws:SecureTransport 条件键)或为需要写入或只读访问权限的客户端创建不同的角色。

EFS IAM 权限检查将通过 AWS CloudTrail 进行记录,以便审计客户端对您的文件系统的访问。例如,当某个客户端挂载一个文件系统时,将在我的 CloudTrail 控制台中显示一个 NewClientConnection 事件。

EFS 接入点的使用
借助 EFS 接入点,您可以轻松管理应用程序对 NFS 环境的访问,指定要在访问文件系统时使用的 POSIX 用户和组,以及限制对文件系统中某个目录的访问权限。

可能从 EFS 接入点功能受益的使用案例包括:

  • 基于容器的环境,其中开发人员构建和部署自己的容器(有关将 EFS 用于容器存储的相关信息也可参阅此博文)。
  • 需要生产数据只读访问权限的数据科学应用程序。
  • 与其他 AWS 账户共享您文件系统中的某个特定目录。

在 EFS 控制台中,我为我的文件系统创建了两个接入点,每个接入点都使用不同的 POSIX 用户和组。

  • /data – 我要分享一些必须通过多个客户端读取和更新的数据时使用此选项。
  • /config – 我要分享一些不能通过客户端使用 /data 接入点更新的配置文件时使用此选项。

这两个接入点都使用文件权限 755。这意味着我将向所有人赋予读取和执行权限,但仅向目录的拥有者赋予写入权限。 创建目录时将使用此处的权限。在目录内部,权限由用户完全控制。

我挂载了 /data 接入点,并将 accesspoint 选项添加到 mount 命令:

$ sudo mount -t efs -o tls,accesspoint=fsap-0204ce67a2208742e fs-d1188b58 /mnt/shared

我现在可以创建文件,因为我没有以根身份创建文件,但我会自动使用该接入点的用户和组 ID:

$ sudo touch /mnt/shared/datafile
$ ls -la /mnt/shared/datafile
-rw-r--r-- 1 1001 1001 0 Jan  8 09:58 /mnt/shared/datafile

我再次挂载文件系统,但没有指定接入点。我看到 datafile 已在 /data 目录中创建,根据接入点配置,这与预期相符。在使用该接入点时,我无法访问位于我的 EFS 文件系统的根目录或其他目录中的任何文件。

$ sudo mount -t efs -o tls /mnt/shared/
$ ls -la /mnt/shared/data/datafile 
-rw-r--r-- 1 1001 1001 0 Jan  8 09:58 /mnt/shared/data/datafile

为了将 IAM 身份验证用于接入点,我添加了 iam 选项:

$ sudo mount -t efs -o iam,tls,accesspoint=fsap-0204ce67a2208742e fs-d1188b58 /mnt/shared

我可以通过将 AccessPointArnCondition 添加到策略,限制某个 IAM 角色只能使用某个特定的接入点:

"Condition": {
    "StringEquals": {
        "elasticfilesystem:AccessPointArn" : "arn:aws:elasticfilesystem:us-east-2:123412341234:access-point/fsap-0204ce67a2208742e"
    }
}

将 IAM 身份验证和 EFS 接入点结合使用,可以轻松安全地共享基于容器的架构和多租户应用程序的数据,因为它可确保每个应用程序都自动获取分配的正确操作系统用户和组,此外还可以限制对特定目录的访问权限、强制执行传输中加密或赋予对文件系统的只读访问权限。

现已开放
使用 NFS 客户端和 EFS 接入点的 IAM 身份验证现已在所有提供 EFS 的区域开放,详见 AWS 区域表。使用这些功能不会产生额外费用。如需了解更多有关EFS 与 IAM 的结合使用以及接入点的信息,请参阅文档。

现在可以更轻松地创建共享数据和配置的可扩展架构。快告诉我您打算将这些新功能用在哪些方面吧!

Danilo