跳至内容

如何配置我的 AWS Transfer Family 服务器以使用其他 AWS 账户中的 Amazon S3 存储桶?

2 分钟阅读
0

我希望账户 A 中的 AWS Transfer Family 服务器能够访问其他账户(即账户 B)中的 Amazon Simple Storage Service (Amazon S3) 存储桶。我想为服务器设置跨账户访问存储桶的权限。

简短描述

按照以下步骤操作:

  1. 在账户 A 中创建一个可访问存储桶的 AWS Identity and Access Management (IAM) 角色。
  2. 更新存储桶策略,以授予账户 B 中 IAM 角色的跨账户访问权限。
  3. 在账户 A 中创建一个配置了 IAM 角色的 Transfer Family 服务器用户。
  4. 验证账户 A 中的 Transfer Family 服务器用户是否可以访问账户 B 中的 S3 存储桶。
  5. (可选)在账户 B 中,将“S3 对象所有权”设置为“存储桶拥有者优先”。

**注意:**AWS Transfer Family 控制台仅显示同一账户中的 Amazon S3 存储桶。要将您的 Transfer Family 服务器与其他账户中的存储桶一起使用,您必须使用 AWS 命令行界面 (AWS CLI) 或 AWS SDK。

解决方法

在账户 A 中创建一个可访问存储桶的 IAM 角色

为您的服务器用户创建 IAM 角色。对于角色的 IAM 策略,请使用以下内容:

**注意:**将 destination-DOC-EXAMPLE-BUCKET 替换为服务器要访问的 S3 存储桶名称。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingBucketReadandWriteandDelete",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
      ]
    }
  ]
}

**注意:**Transfer Family 需要具备 s3:PutObjectAcl 权限,才能进行跨账户的 S3 上传。

创建 IAM 角色后,通过运行类似于以下 get-role 的命令来获取角色 ID:

$ aws iam get-role --role-name "ROLE_NAME"

您需要角色 ID 才能进行下一步。

更新存储桶策略以授予账户 B 中 IAM 角色的跨账户访问权限

修改目标存储桶的策略,以授予您创建的 IAM 角色访问权限。您可以使用与以下内容类似的存储桶策略:

**注意:**将 arn:aws:iam::123456789012:root 替换为您服务器所属账户的 Amazon 资源名称 (ARN)。将 destination-DOC-EXAMPLE-BUCKET 替换为存储桶的名称。将 AROA1234567890 替换为您创建的 IAM 角色的角色 ID。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BucketPolicyForTransferFamily",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringLike": {
          "aws:userId": "AROA1234567890:*"
        }
      }
    }
  ]
}

此示例策略中的条件元素为可选项。添加条件元素,以仅向您指定的 IAM 角色授予存储桶访问权限。或移除该元素,以向服务器所属账户中的所有 IAM 角色和用户授予访问权限。

在账户 A 中创建一个配置了 IAM 角色的 Transfer Family 服务器用户

1.    为您的 Transfer Family 服务器生成 SSH 密钥

2.    获取您的服务器 ID

3.    使用 AWS CLI 运行 create-user 命令。对于 --server-id,输入您的服务器 ID。对于 --role,输入您创建的 IAM 角色的 ARN。对于 --ssh-public-key-body,输入您在创建 SSH 密钥时生成的 .pub 文件内容。

$ aws transfer create-user --user-name "MY_SERVER_USER_NAME" --server-id "MY_SERVER_ID"  --role "MY_IAM_ROLE_ARN" --home-directory "/destination-DOC-EXAMPLE-BUCKET/MY_SERVER_USER_NAME" --ssh-public-key-body "CONTENTS_OF_MY_SSH_.PUB_FILE"

**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

该命令将返回您创建的服务器 ID 和用户:

{
  "ServerId": "MY_SERVER_ID",
  "UserName": "MY_SERVER_USER_NAME"
}

**重要事项:**若要限制服务器用户仅能访问其主目录,请在 IAM 中创建范围缩小策略。然后,编辑服务器用户属性以应用所创建的范围缩小策略。

验证账户 A 中的 Transfer Family 服务器用户是否可以访问账户 B 中的存储桶

1.    以您所创建的用户身份连接到服务器。例如,使用以下 OpenSSH 命令连接到 SFTP 服务器:

$ sftp -i myserveruser MY_SERVER_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com

2.    作为测试,列出存储桶的主目录。如果您使用的是 OpenSSH,请运行以下命令:

$ ls

如果该命令返回主目录,则表明您的服务器用户具有跨账户访问存储桶的权限。

(可选)在账户 B 中,将“S3 对象所有权”设置为“存储桶拥有者优先”

默认情况下,Amazon S3 对象归上传该对象的 AWS 账户所有。这意味着上传到目标存储桶的对象,默认归源服务器账户所有。

若要激活目标账户,使其自动拥有跨账户上传的对象,请将目标存储桶的 S3 对象所有权设置为存储桶拥有者优先。完成此操作后,所有通过 AWS Transfer Family 服务器上传的新对象都将自动归目标存储桶的账户所有。


相关信息

CreateUser(AWS Transfer Family 用户指南)

添加用户(AWS Transfer Family 用户指南)

Amazon S3 如何授权请求

AWS 官方已更新 5 年前