亚马逊AWS官方博客
使用 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数据共享给组织外的部分用户
组织内部的数据转移
三、操作步骤
- 在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:*:*:*"
]
}
]
}
- 在AWS控制台”迁移与传输”分类中打开”AWS Transfer for SFTP”,然后点击 “Create server”创建一个SFTP 服务器
- 在DNS配置选项中,我们可以选择自定义的域名,也可以使用AWS自带的域名。
在Identity provider选项中,可以选择API Gateway的认证和授权,也可以使用AWS Transfer for SFTP服务托管的授权方式,本次示例中我们使用Service managed方式。Logging role选择刚刚创建的角色,使SFTP有权限向CloudWatch Logs中上传日志.
- 创建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 用户授权的方式和原理,您可以参考下面的架构图:
- 创建完Server之后,在Servers界面点击一下Server ID,然后在Users界面可以添加SFTP用户。
- 在添加用户界面,Username处可以写一个3—32字符的用户名(仅支持小写字母和数字), Access界面选择刚刚创建的用户Role,Home Directory选择要访问的S3存储桶。在SSH public key界面,需要使用ssh-keygen产生一个密钥对,如果之前已有密钥对,使用现有的也可以.
备注: 创建密钥对方法: ssh-keygen -t rsa,在Enter passphrase处留空,直接回车即可.
密钥对创建完成之后,会在当前用户home目录的.ssh文件夹下产生两个文件,一个是 id_rsa,一个是 id_rsa.pub,其中id_rsa是private key,id_rsa.pub是public key. 将 id_rsa.pub文件内容拷贝到SSH Public key里面即可.
- 之后可以使用 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命令如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>
- 在配置过程中,如果遇到报错,或者要查看sftp服务器日志,可以在Servers的详情界面,点击右上角”View Logs”跳转到CloudWatch Logs中查看.
在日常较多的场景中,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.thinkwithwp.com/zh_cn/transfer/latest/userguide/what-is-aws-transfer-for-sftp.html