亚马逊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数据共享给组织外的部分用户

组织内部的数据转移

 

三、操作步骤

  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:*:*:*"

            ]

        }

    ]

}

 

 

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

  1. 在DNS配置选项中,我们可以选择自定义的域名,也可以使用AWS自带的域名。

在Identity provider选项中,可以选择API Gateway的认证和授权,也可以使用AWS Transfer for SFTP服务托管的授权方式,本次示例中我们使用Service managed方式。Logging role选择刚刚创建的角色,使SFTP有权限向CloudWatch Logs中上传日志.

 

  1. 创建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 用户授权的方式和原理,您可以参考下面的架构图:

  1. 创建完Server之后,在Servers界面点击一下Server ID,然后在Users界面可以添加SFTP用户。

  1. 在添加用户界面,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里面即可.

 

  1. 之后可以使用 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

  1. 成功连接之后,可以使用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>

 

 

  1. 在配置过程中,如果遇到报错,或者要查看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

 

本篇作者

刘翔

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