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

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

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

简短描述

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

  1. 创建一个拥有该存储桶访问权限的 AWS Identity and Access Management (IAM) 角色。
  2. 更新存储桶策略以向该 IAM 角色授予跨账户访问权限。
  3. 创建一个配置了该 IAM 角色的 SFTP 服务器用户。
  4. 验证您的 SFTP 服务器用户可以访问该存储桶。

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

解决方法

创建一个拥有该存储桶访问权限的 IAM 角色

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

注意:请将 destination-DOC-EXAMPLE-BUCKET 替换为您希望您的 SFTP 服务器访问的 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 替换为您的 SFTP 服务器所属账户的 Amazon 资源名称 (ARN)。将 destination-DOC-EXAMPLE-BUCKET 替换为该存储桶的名称。将 AROA1234567890 替换为您创建的 IAM 角色的角色 ID。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BucketPolicyForSFTP",
      "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 角色。也可移除该元素,从而向您的 SFTP 服务器所属账户的所有 IAM 角色和用户授予访问权限。

创建一个配置了该 IAM 角色的 SFTP 服务器用户

1.    生成 SFTP 服务器的 SSH 密钥

2.    获取 SFTP 服务器的服务器 ID

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

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

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

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

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

重要提示:要限定 SFTP 服务器用户只能访问其主目录,请在 IAM 中创建一个范围缩小策略。然后编辑服务器用户的属性以应用您创建的范围缩小策略。

验证您的 SFTP 服务器用户可以访问该存储桶

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

$ sftp -i mysftpuser MY_SFTP_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com

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

$ ls 

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


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

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

Amazon S3 如何对请求授权

 

这篇文章对您有帮助吗?


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