如何配置我的 AWS Transfer Family 服务器以使用其他 AWS 账户中的 Amazon S3 存储桶?
我希望账户 A 中的 AWS Transfer Family 服务器能够访问其他账户(即账户 B)中的 Amazon Simple Storage Service (Amazon S3) 存储桶。我想为服务器设置跨账户访问存储桶的权限。
简短描述
按照以下步骤操作:
- 在账户 A 中创建一个可访问存储桶的 AWS Identity and Access Management (IAM) 角色。
- 更新存储桶策略,以授予账户 B 中 IAM 角色的跨账户访问权限。
- 在账户 A 中创建一个配置了 IAM 角色的 Transfer Family 服务器用户。
- 验证账户 A 中的 Transfer Family 服务器用户是否可以访问账户 B 中的 S3 存储桶。
- (可选)在账户 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 用户指南)
- 语言
- 中文 (简体)
