使用 SFTP 管理 S3 存储桶

阅读数:77 2019 年 10 月 12 日 10:41

使用 SFTP 管理 S3 存储桶

一、简介

越来越多的客户选择将自己的数据存放在 S3,借助于 S3 的无限容量和无与伦比的持久性,我们可以部署与存储相关的各类服务,如: 备份和恢复、数据存档、数据湖和大数据分析、混合云存储、灾难恢复等。以往我们需要通过使用 AWS CLI 或通过 AWS SDK 开发程序的方式和 S3 交互,对操作者有一定的命令行熟悉的过程或开发经验,同时还要考虑访问 S3 存储桶的 IAM 用户密钥保存与更新的问题,在跨公司跨部门同步数据的场景下并不是特别方便。现在,AWS 推出了 AWS Transfer for SFTP 服务,该服务使用标准的 SFTP 协议和 S3 交互实现上传 / 下载数据,您也可以创建 SFTP 用户来实现精确的权限控制。在各个不同行业之间或公司不同部门之间进行数据交换时, AWS Transfer for SFTP 大幅度提高了访问 S3 的易用性。

二、服务介绍

S3: Amazon S3 是一种对象存储,专为从 Internet 上的任意位置存储和检索任意数量的数据而构建,它旨在提供 99.999999999% 的持久性,并存储每个行业的市场领导者使用的数百万个应用程序的数据。

AWS Transfer for SFTP: AWS Transfer for SFTP(安全文件传输协议)是一种完全托管服务,可通过 SFTP 协议将数据传入或传出 S3 存储桶。我们也可以添加 SFTP 用户,并为其配置适当的访问级别。

AWS Transfer for SFTP 的主要用例如下:

从供应商或合作伙伴等第三方上传数据到 S3。

将 S3 数据共享给组织外的部分用户

组织内部的数据转移

三、操作步骤

1. 在 IAM 界面创建一个 IAM 策略和 IAM 角色,使 AWS Transfer for SFTP 有权限发送日志到 CloudWatch Logs 中。

IAM 角色的信任关系如下:

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
策略如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": [
"arn:aws:logs:*:*:*"
]
}
]
}

2. 在 AWS 控制台”迁移与传输”分类中打开”AWS Transfer for SFTP”,然后点击 “Create server”创建一个 SFTP 服务器

使用 SFTP 管理 S3 存储桶
3. 在 DNS 配置选项中,我们可以选择自定义的域名,也可以使用 AWS 自带的域名。
在 Identity provider 选项中,可以选择 API Gateway 的认证和授权,也可以使用 AWS Transfer for SFTP 服务托管的授权方式,本次示例中我们使用 Service managed 方式。Logging role 选择刚刚创建的角色,使 SFTP 有权限向 CloudWatch Logs 中上传日志.

使用 SFTP 管理 S3 存储桶

4. 创建 Server 之后,我们可以创建 SFTP 用户,在创建 SFTP 用户之前,先创建一个 IAM 角色,使该用户能访问指定的存储桶。打开 IAM 界面,创建一个 Role,Role 的信任关系如下:

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}

关联的策略如下 (请将下面标红的 BucketName 修改为自己的存储桶名字):

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:DeleteObjectTagging",
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObjectVersion",
"s3:GetObjectVersionTagging",
"s3:PutObjectVersionTagging",
"s3:GetObjectTagging",
"s3:PutObjectTagging",
"s3:DeleteObjectVersionTagging",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::BucketName/*",
"arn:aws:s3::: BucketName /"
]
}
]
}

上述 IAM 策略中指定了访问存储桶的权限,然后 IAM Role 和这个策略关联,该 Role 会分配给 SFTP 用户,当 SFTP 用户访问 SFTP 服务器的时候,SFTP 服务器会通过这个 IAM Role 的策略判断是否有权限访问 S3 存储桶. 有关 IAM Role 和策略与 sftp 用户授权的方式和原理,您可以参考下面的架构图:

使用 SFTP 管理 S3 存储桶

5. 创建完 Server 之后,在 Servers 界面点击一下 Server ID,然后在 Users 界面可以添加 SFTP 用户。
使用 SFTP 管理 S3 存储桶

6. 在添加用户界面,Username 处可以写一个 3—32 字符的用户名 (仅支持小写字母和数字), Access 界面选择刚刚创建的用户 Role,Home Directory 选择要访问的 S3 存储桶。在 SSH public key 界面,需要使用 ssh-keygen 产生一个密钥对,如果之前已有密钥对,使用现有的也可以.
使用 SFTP 管理 S3 存储桶

备注: 创建密钥对方法: ssh-keygen -t rsa,在 Enter passphrase 处留空,直接回车即可.

使用 SFTP 管理 S3 存储桶

密钥对创建完成之后,会在当前用户 home 目录的.ssh 文件夹下产生两个文件,一个是 id_rsa,一个是 id_rsa.pub,其中 id_rsa 是 private key,id_rsa.pub 是 public key. 将 id_rsa.pub 文件内容拷贝到 SSH Public key 里面即可.

7. 之后可以使用 sftp 命令或者 sftp 客户端 (如 WinSCP) 等工具连接到 SFTP 服务器上。在 Server 界面,找到 Endpoint,然后使用 sftp -i PrivateKey username@server 进行连接。如: sftp -i .ssh/id_rsa alex@s-xxxxxxxxxxxxx.server.transfer.us-east-1.amazonaws.com

使用 SFTP 管理 S3 存储桶
成功连接之后,可以使用 SFTP 命令如 put 进行上传,get 进行下载.

sftp> put hello.mp3

Uploading hello.mp3 to /xlaws/hello.mp3

hello.mp3 100% 153KB 30.0KB/s 00:05

sftp> get hi.mp3

Fetching /xlaws/hi.mp3 to hi.mp3

/xlaws/hi.mp3 100% 17KB 19.0KB/s 00:00

sftp>

9. 在配置过程中,如果遇到报错,或者要查看 sftp 服务器日志,可以在 Servers 的详情界面,点击右上角”View Logs”跳转到 CloudWatch Logs 中查看.

使用 SFTP 管理 S3 存储桶使用 SFTP 管理 S3 存储桶

在日常较多的场景中,AWS Transfer for SFTP 的 SFTP 用户需要管理多个存储桶,您需要对 SFTP 用户所关联的角色策略中指定多个存储桶,如下述策略允许 SFTP 用户访问存储桶 xlaws 和 xlawsweb:

复制代码
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::xlaws/*",
"arn:aws:s3:::xlaws/",
"arn:aws:s3:::xlawsweb/*",
"arn:aws:s3:::xlawsweb/"
]
}
]
}

然后使用 sftp 客户端连接到 sftp server 上:

复制代码
sftp -i .ssh/id_rsa alex@s-xxxxxxxxxxxx.server.transfer.us-east-1.amazonaws.com

使用 pwd 命令可以看到当前路径为 home directory(如下示例为 xlawsweb 存储桶)

复制代码
sftp> pwd
Remote working directory: /xlawsweb

然后上传一个文件:

复制代码
sftp> put hello.mp3
Uploading hello.mp3 to /xlawsweb/hello.mp3
hello.mp3

使用 cd /xlaws/ 命令可以切换存储桶到 xlaws:

复制代码
sftp> cd /xlaws/

再上传一个文件到 xlaws 存储桶以验证权限:

复制代码
sftp> put hello.mp3
Uploading hello.mp3 to /xlaws/hello.mp3
hello.mp3 100% 153KB 105.1KB/s 00:01
sftp>

相关文章: https://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/what-is-aws-transfer-for-sftp.html

作者介绍:

刘翔
亚马逊 AWS 解决方案架构师,负责基于 AWS 的云计算方案架构的咨询和设计。在加入架构师团队之前,在 AWS Support 团队有 2 年半的工作经验,对 AWS 底层服务有深入的理解和认识。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/use-sftp-manage-s3-bucket/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布