AWS Transfer Family+Lambda实现账号密码登录sftp
本文参考链接:https://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/custom-lambda-idp.html
整体流程:
创建存储桶
创建IAM角色
配置Lambda函数
创建 Transfer Family服务器
创建Secrets Manager密钥
创建存储桶



创建IAM角色



配置Lambda函数
方案一:
使用AWS CloudFormation 堆栈直接创建,堆栈下载地址:https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-lambda.template.yml
这个 CloudFormation 模板创建了一个基于 AWS Lambda 的身份验证系统,用于 AWS Transfer Family 服务。该模板实现了一种通过 AWS Secrets Manager 存储和验证 SFTP/FTP/FTPS 用户凭证的方法。
模板概述(关于模板解读)
参数
CreateServer (布尔值,默认为 'true')
决定是否创建新的 Transfer Family 服务器
如果设置为 'true',模板会创建服务器并自动关联身份提供者
SecretsManagerRegion (字符串,默认为空)
可选参数,指定存储密钥的区域
如果未提供,将使用部署堆栈的区域
适用于在 Secrets Manager 不可用的区域部署此堆栈的情况
主要资源
1. Transfer Family 服务器 (TransferServer)
仅当
CreateServer为 'true' 时创建配置为公共端点 (
EndpointType: PUBLIC)使用 Lambda 函数作为身份提供者
配置 CloudWatch 日志记录
2. Lambda 函数 (GetUserConfigLambda)
作为身份提供者,处理用户认证请求
支持密码和 SSH 公钥认证
从 Secrets Manager 检索用户配置
3. IAM 角色
LambdaExecutionRole: 允许 Lambda 函数访问 Secrets Manager
CloudWatchLoggingRole: 允许 Transfer 服务记录日志到 CloudWatch
Lambda 函数逻辑
Lambda 函数实现了以下功能:
用户认证流程:
接收来自 Transfer Family 服务器的认证请求
提取用户名、服务器 ID 和认证凭据(密码或 SSH 密钥)
从 Secrets Manager 获取对应的用户配置(
aws/transfer/{serverId}/{username})
认证方法:
密码认证: 比较提供的密码与存储在 Secrets Manager 中的密码
SSH 公钥认证: 返回存储在 Secrets Manager 中的公钥
用户配置返回:
必需字段:
Role: 用户的 IAM 角色 ARN(如果在密钥中未指定,则返回空字符串)
可选字段:
Policy: 会话策略HomeDirectoryDetails: 虚拟文件夹映射(如果提供,则设置HomeDirectoryType为 "LOGICAL")HomeDirectory: 用户的主目录(如果未指定,默认为 "/")
Secrets Manager 配置要求
要使此模板正常工作,需要在 Secrets Manager 中创建以下格式的密钥:
aws/transfer/{serverId}/{username}密钥内容应为 JSON 格式,包含以下字段:
{
  "Password": "用户密码",  // 用于密码认证
  "PublicKey": "ssh-rsa AAAA...",  // 用于 SSH 公钥认证,多个密钥用逗号分隔
  "Role": "arn:aws:iam::account-id:role/user-role",  // 必需,用户的 IAM 角色
  "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[...]}",  // 可选,会话策略
  "HomeDirectoryDetails": "[{\"Entry\":\"/\",\"Target\":\"/bucket/home/username\"}]",  // 可选,虚拟文件夹映射
  "HomeDirectory": "/bucket/home/username"  // 可选,用户的主目录
}


CreateServer:这个选项,选false则不会创建sftp服务器

一路默认下一步,最后点击提交。
等待堆栈创建完成 
这个就是刚刚创建的lambda函数

创建 Transfer Family服务器



选择自定义身份提供商,lambda函数选择刚刚创建的,身份验证方法选择仅限密码,继续下一步



等待服务器在线


这个就是等会要连接的地址
创建Secrets Manager密钥


{
  "Password": "passtest1",  // 用于密码认证
  "PublicKey": "ssh-rsa AAAA...",  // 用于 SSH 公钥认证,多个密钥用逗号分隔
  "Role": "arn:aws:iam::account-id:role/user-role",  // 必需, 前面创建的IAM 角色
  "HomeDirectory": "/test-sftp12321312324"  // 用户的主目录,刚刚创建的存储桶名
}
aws/transfer/{serverId}/{username},serverId是sftp服务器的id

连接验证
