如何使用 IAM 和 EFS 接入点授予对特定 EC2 实例的目录访问权限?

上次更新时间:2020 年 9 月 2 日

我想授予对特定 Amazon Elastic Compute Cloud Amazon (Amazon EC2) 实例的目录访问权限。如何使用 AWS Identity and Access Management (IAM) 角色和策略,以及 Amazon Elastic File System (Amazon EFS) 接入点来完成此操作?

简短描述

Amazon EFS 接入点允许您对不同实例使用相同文件系统的同时,仅授予对所需目录的访问权限。要使用接入点和 IAM 控制对目录的访问,您必须:

  1. 为您的文件系统创建 Amazon EFS 接入点。
  2. 为授予 ClientMountClientWrite 权限的每个实例创建 IAM 策略,然后为这些策略创建角色。
  3. 为您的文件系统创建 EFS 策略。
  4. 测试您的配置。

要求

1.    您必须在用于您文件系统的同一 VPC 中有两个 EC2 实例(或确保它们可以访问您的文件系统)。考虑使用最新的 Amazon Linux 2 AMI。连接到实例的安全组必须允许在端口 2049 上对 EFS 进行出站访问。

2.    使用以下挂载命令验证您的设置是否已正确配置。此命令可将您的文件系统挂载到两个 EC2 实例中。将示例文件系统替换为您的文件系统:

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-8ce001b4. efs.ap-southeast-2.amazonaws.com:/ /efs

3.    在您的文件系统和所有实例上运行 umount 命令,否则,如果您以后在应用 EFS 策略时出现失误,可能会出现 I/O 错误:

sudo umount /efs

4.    在 Amazon EFS 上使用接入点和 IAM 策略需要 amazon-efs-utils 工具。运行以下命令以安装 amazon-efs-utils。

sudo yum install -y amazon-efs-utils

如果您运行的是 Amazon Linux 2 以外的其他发行版,并且需要关于 amazon-efs-utils 的安装说明,请参阅在其他 Linux 发行版上安装 amazon-efs-utils 软件包。 

解决方法

请记住以下几点:

  • 以下解决方案假设您已经创建了没有接入点或任何 IAM 策略的 Amazon EFS。确保附加到您的文件系统的安全组允许在端口 2049 上对正在使用的实例进行入站访问。
  • 以下解决方案提供了一些步骤的示例。示例名称为 APP_team 和 DB_team。将这些示例名称替换为您的资源名称。

创建 Amazon EFS 接入点

1.    打开 Amazon EFS 控制台

2.    依次选择文件系统、要为其管理访问权限的文件系统和查看详细信息

3.    选择接入点,然后选择创建接入点

4.    通过输入名称根目录路径来创建第一个接入点。

示例

名称:App_team_AP
根目录路径:/App_team

5.    选择创建接入点

6.    重复第 2 到 4 步以创建第二个接入点:

示例

名称:DB_team_AP
根目录路径:/DB_team

7.    选择创建接入点。记下接入点 ID。接入点 ID 类似于以下示例:

fsap-0093c87d798ae5ccb

注意:您还可以使用接入点对通过接入点发出的所有文件系统请求强制实施 POSIX 用户标识(用户 ID 和组 ID)。要启用此功能,请在创建接入点时指定用户和组 ID。有关详细信息,请参阅使用接入点强制实施用户标识

为您的实例创建 IAM 策略和角色

1.    打开 IAM 控制台

2.    为每个实例创建 IAM 策略。以下策略将授予 ClientMountClientWrite 权限。您可以使用这些策略作为参考。将这些示例中的资源中显示的值替换为资源的 ARN,并将文件系统 ID 和接入点 ID 替换为正确的值。

示例:App_team_policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:file-system/fs-8ce001b4",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "elasticfilesystem:AccessPointArn": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:access-point/fsap-0093c87d798ae5ccb"
                }
            }
        }
    ]
}

示例:DB_team_policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:file-system/fs-8ce001b4",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "elasticfilesystem:AccessPointArn": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:access-point/fsap-054969ebbe52a6121"
                }
            }
        }
    ]
}

3.    选择角色,然后选择创建角色

4.    选择 EC2 作为使用案例,然后选择下一步: 权限

5.    选择刚刚创建的策略之一,然后选择下一步: 标记

6.    选择下一步: 审核

7.    输入角色名称,然后选择创建角色

示例

角色名称:App_team_role
策略:App_team_policy

8.    对第二个策略重复第 3-7 步。

示例

角色名称:DB_team_role
策略:DB_team_policy

创建 EFS 策略

1.    打开 Amazon EFS 控制台

2.    选择文件系统,选择您的文件系统,然后选择查看详细信息

3.    选择文件系统策略,然后在策略部分中选择编辑

4.    添加以下策略以允许您创建的接入点具有 ClientMountClientWrite 权限。确保使用您的资源的 ARN 更新资源,并将文件系统 ID 和接入点 ID 替换为正确的值。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:file-system/fs-8ce001b4",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::123456789012:instance-profile/DBA_team_role",
                    "elasticfilesystem:AccessPointArn": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:access-point/fsap-054969ebbe52a6121"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:file-system/fs-8ce001b4",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::123456789012:instance-profile/App_team_role",
                    "elasticfilesystem:AccessPointArn": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:access-point/fsap-0093c87d798ae5ccb"
                }
            }
        }
    ]
}

5.    选择保存。您的文件系统已准备就绪,可以使用。

测试您的配置

1.    访问您的实例(在此示例中为 DB_team 实例),不将任何 IAM 角色附加到实例。

2.    尝试挂载您的文件系统。您将收到与以下内容类似的错误消息:

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-8ce001b4.efs.ap-southeast-2.amazonaws.com:/ /efs

mount.nfs4: access denied by server while mounting fs-8ce001b4.efs.ap-southeast-2.amazonaws.com:/

3.    使用 Amazon EC2 控制台将您为此实例创建的角色(本示例中为 DB_team_role)分配给 DB_team 实例。有关说明,请参阅如何将现有 IAM 角色分配给 EC2 实例?

4.    使用您创建的第一个接入点(在此示例中为 App_team_AP)挂载您的文件系统:

sudo mount -t efs -o tls,accesspoint=fsap-0093c87d798ae5ccb,iam fs-8ce001b4:/ /efs

mount.nfs4: access denied by server while mounting 127.0.0.1:/

5.    运行 umount 命令以卸载文件系统:

sudo umount /efs

6.    运行 mount 命令以使用您创建的第二个接入点(本示例中为DB_team_AP)挂载您的文件系统。文件系统已成功挂载,因为您的实例角色正在授予您以下权限:

sudo mount -t efs -o tls,accesspoint=fsap-054969ebbe52a6121,iam fs-8ce001b4:/ /efs

7.    SSH 到 App_team 实例并执行上述步骤。在使用 App_team_role 时,您无法使用 DB_team_AP 挂载文件系统。

现在,仅当涉及的 EC2 实例使用所需的 IAM 角色时,您的文件系统才允许挂载。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?