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

上次更新日期:2021 年 11 月 1 日

我希望账户 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. (可选)将 S3 对象所有权设置为账户 B 中的首选存储桶拥有者。

注意:AWS Transfer Family 控制台只显示同一账户中的 Amazon S3 存储桶。要让您的 Transfer Family 服务器使用其他账户中的存储桶,您必须使用 AWS Command Line Interface (AWS CLI) 或 AWS 开发工具包。

解决方法

在账户 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:*"
        }
      }
    }
  ]
}

此示例策略中的 Condition 元素是可选的。包含 Condition 元素以将存储桶访问权限仅授予您指定的 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

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

(可选)将 S3 对象所有权设置为账户 B 中的首选存储桶拥有者

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

要使目标账户能够自动拥有跨账户上传的对象,请将目标存储桶的 S3 对象所有权设置为首选存储桶拥有者。执行此操作后,通过 AWS Transfer Family 服务器上传的所有新对象将自动归目标存储桶的账户所有。


创建用户(AWS Transfer Family 用户指南)

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

Amazon S3 如何对请求授权

这篇文章对您有帮助吗?


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