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

上次更新时间:2021 年 1 月 15 日

我想让我的 AWS Transfer Family 服务器访问其他 AWS 账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。我该如何设置服务器才能跨账户访问该存储桶?

简短描述

请按照以下步骤执行操作:

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

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

解决方法

创建一个拥有该存储桶访问权限的 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"
      ]
    }
  ]
}

在创建该 IAM 角色之后,运行 get-role 命令以获取该角色的 ID,类似于如下内容:

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

下一步将需要使用该角色 ID。

更新存储桶策略以向该 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 角色和用户授予访问权限。

创建一个配置有该 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 "/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 中创建一个范围缩小策略。然后编辑服务器用户的属性以应用您创建的范围缩小策略。

验证您的 Transfer Family 服务器用户是否可以访问该存储桶

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

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

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

$ ls

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

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

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

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


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

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

Amazon S3 如何对请求授权

这篇文章对您有帮助吗?


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