VPC内网访问SFTP

详细原理参考: https://aws.amazon.com/cn/blogs/storage/enable-password-authentication-for-aws-transfer-for-sftp-using-aws-secrets-manager/

img

流程:

  1. 用户登录时输入用户名+密码

  2. Transfer Family(SFTP)将其传入到API Gateway,API Gateway上有一个Lambda函数

  3. Lambda代码进行鉴权,在这个例子用secret manager作为鉴权中心

  4. 鉴权通过后,secret manager把用户访问S3的桶路径、IAM Role等信息返回到API Gateway

创建cloudformation

下载cloudformation代码:https://pingfan.s3.amazonaws.com/files/sftp-vpc.yml

在cloudformation里创建新的stack:

image-20220125193959026

将下载的yaml文件上传:

image-20220125194022237

输入stack名称后,如果要选择创建VPC类型的SFTP ,则需要指定VPCID和SubnetID,SubnetID用逗号隔开:

image-20220126160057225

最后在IAM相关选项打上钩,创建stack:

image-20220125194157800

大概3-5分钟创建完成,在创建期间可以进行下面两步的操作:

image-20220125194249015

创建完成后,可以从SFTP的页面中找到私网IP连接方式:

image-20220126161503498

创建IAM Role

这一步用于创建transfer服务的role,用于控制用户可以对S3有哪些操作权限。

image-20220114181207034

选择transfer服务并进入下一步

image-20220114181225178

附加对应的权限,用于控制后续transfer服务可以访问哪些桶(这里仅用于测试目的,使用了S3FullAccess, 如果想细粒度的控制权限,先提前创建一个policy用于这一步):

image-20220114181302552

为role命名,例如transfer-access-s3,并保存。

创建secret

进行secrets manager界面,点击Store a new secret:

image-20220125194541289

选择Other type of secret, 并使用json定义密码等参数:

image-20220125194823886

  • Password:用户的密码
  • Role:上一步创建Role的ARN,用于控制用户有哪些S3的操作权限,例如只能上传不能删除
  • HomeDirectory:用户访问S3的桶名称
{
  "Password": "sftp-pass",
  "Role": "arn:aws:iam::145197526627:role/transfer-access-s3",
  "HomeDirectory": "/broadcast-videos"
}

点击下一步,输入secret名称——必须以SFTP/username这种形式,例如下面代表ftp-test这个用户:

image-20220125195025771

一直点击下一步,直到创建完成。

这样我们就创建好了一个ftp用户:

  • 用户名是ftp-user,密码是sftp-pass
  • 所具有的权限是transfer-access-s3 role里声明的
  • 能访问broadcast-videos这个S3桶

测试

上面三步全部创建完成后,进入Transfer Family的页面,查看新创建的sftp服务器的IP:

image-20220126161642265

复制下来后,使用sftp连接:

image-20220126160816296

使用正确的用户名+密码可以连接上去,使用错误的密码会拒绝连接。