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

4 分钟阅读
0

我想使用 AWS Identity and Access Management(IAM)和 Amazon Elastic File System(Amazon EFS)授予对特定 Amazon Elastic Compute Cloud(Amazon EC2)实例的目录访问权限。

简短描述

对不同的实例使用相同的文件系统,并通过 Amazon EFS 接入点授予对特定目录的访问权限。要使用接入点和 IAM 控制对目录的访问,请执行以下操作:

1.    为您的文件系统创建 Amazon EFS 接入点。

2.    授予 ClientMountClientWrite 权限,为每个实例创建 IAM 策略。然后,为策略创建角色。

3.    为您的文件系统创建 Amazon EFS 策略。

4.    测试您的配置。

解决方法

要求

1.    您必须在用于您文件系统的同一 VPC 中有两个 Amazon EC2 实例,或者,您必需确保这些实例可以访问您的文件系统。最佳做法是使用最新的 Amazon Linux 2 AMI。连接到实例的安全组必须允许在端口 2049 上对 Amazon EFS 进行出站访问。

2.    在挂载文件系统之前,向挂载目标安全组添加一条规则,允许从 Amazon EC2 安全组进行入站 NFS 访问。有关更多信息,请参阅将 VPC 安全组用于 Amazon EC2 实例和挂载目标
**注意:**最佳做法是使用文件系统的 DNS 名称作为挂载选项。文件系统 DNS 名称会自动解析为连接 EC2 实例的可用区中挂载目标的 IP 地址。从控制台获取文件系统 DNS 名称。或者,如果您有文件系统 ID,则使用以下示例构造文件系统 DNS 名称:

file-system-id.efs.aws-region.amazonaws.com

3.    要从挂载到 EFS FQDN 或短名称的客户端系统测试连接,必须执行以下其中一项操作:

  • 执行 telnet

2049。

  • 在不需要 amazon-efs-utils 的情况下,使用 EFS FQDN 将 EFS 作为 NFS 类型挂载。

以下命令可将您的文件系统挂载到两个 EC2 实例中:

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

**注意:**将示例文件系统替换为您的文件系统。

如果您通过挂载进行测试,则在挂载完成后,在您的文件系统和所有 EC2 实例上运行 umount 命令。如果未运行 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 的安装说明,请参阅使用 amazon-efs-utils 工具。另外,验证来自第三方(例如 GitHub)的源代码。

创建 Amazon EFS 接入点

**重要提示:**该解决方案假设您已创建没有接入点或任何 IAM policy 的 Amazon EFS。确保附加到您的文件系统的安全组允许在端口 2049 上对正在使用的 EC2 实例进行入站访问。

**注意:**用您的资源名称替换示例名称(APP_team 和 DB_team)。

1.    打开 Amazon EFS 控制台

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

3.    选择 Access points(接入点),然后选择 Create access point(创建接入点)。

4.    通过输入 Name(名称)和 Root directory path(根目录路径)创建第一个接入点。例如:

**名称:**App_team_AP

根目录路径:/App_team

**注意:**Amazon EFS 只有在为该目录指定了 OwnUid、OwnGID 和权限时才会创建接入点根目录。如果您不提供此信息,Amazon EFS 不会创建根目录。如果根目录不存在,则尝试使用接入点进行挂载将失败,并显示一条错误消息,例如“b'mount.nfs4: access denied by server while mounting 127.0.0.1:/(b'mount.nfs4:挂载 127.0.0.1:/ 时服务器拒绝访问)”。

如果您不指定接入点根目录的所有权和权限,Amazon EFS 将不会创建根目录。所有挂载接入点的尝试都将失败,错误为“access denied(访问被拒绝)”。有关更多信息,请参阅在 EFS 中强制使用根目录接入点

5.    选择 Create access point(创建接入点)。

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

**名称:**DB_team_AP

根目录路径:/DB_team

7.    选择 Create access point(创建接入点)。

8.    记下接入点 ID。接入点 ID 类似于以下示例:

**接入点 ID:**fsap-0093c87d798ae5ccb

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

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

1.    打开 IAM 控制台

2.    为每个实例创建 IAM 策略。以下策略将授予 ClientMountClientWrite 权限。您可以使用这些策略作为参考。首先,将这些示例中 Resource(资源)内显示的值替换为您的资源的 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.    选择 Roles(角色),然后选择 Create role(创建角色)。

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

5.    选择刚刚创建的策略之一,然后选择 Next: Tags(下一步:标签)。

6.    选择 Next: Review(下一步:检查)。

7.    输入 Role name(角色名称),然后选择 Create role(创建角色)。例如:

**角色名称:**App_team_role

**策略:**App_team_policy

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

**角色名称:**DB_team_role

**策略:**DB_team_policy

创建 EFS 策略

1.    打开 Amazon EFS 控制台

2.    依次选择 File systems(文件系统)、您的文件系统、View Details(查看详细信息)。

3.    选择 File system policy(文件系统策略),然后在 Policy(策略)部分中选择 Edit(编辑)。

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:role/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:role/App_team_role",
          "elasticfilesystem:AccessPointArn": "arn:aws:elasticfilesystem:ap-southeast-2:123456789012:access-point/fsap-0093c87d798ae5ccb"
        }
      }
    }
  ]
}

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

测试您的配置

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

2.    尝试使用挂载命令挂载您的文件系统作为 NFS 类型。如果您有文件系统级别的基于资源的访问策略,则会收到一条与以下内容类似的错误消息:

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 控制台将您为此 Amazon EC2 实例创建的角色(本示例中为 DB_team_role)分配给 DB_team Amazon EC2 实例。有关更多信息,请参阅如何将现有 IAM 角色分配给 EC2 实例? 如果您无法将角色作为配置文件角色分配给 Amazon EC2 实例,则可以使用命名的配置文件挂载 IAM,作为挂载选项和接入点。例如:

sudo mount -t efs -o tls,iam,awsprofile=namedprofile,accesspoint=fsap- file-system-id efs-mount-point/

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

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

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

sudo umount /efs

6.    使用您从 DB_team_role 被分配到的同一个 Amazon EC2 实例创建的第一个接入点(例如 App_team_AP),挂载您的文件系统。正如预期的那样,由于 EFS 访问策略和 IAM 角色调用,挂载操作被拒绝:

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:/

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

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

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

AWS 官方
AWS 官方已更新 1 年前