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