本文参考链接:https://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/custom-lambda-idp.html

整体流程:

  1. 创建存储桶

  2. 创建IAM角色

  3. 配置Lambda函数

  4. 创建 Transfer Family服务器

  5. 创建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 用户凭证的方法。

模板概述(关于模板解读)

参数

  1. CreateServer (布尔值,默认为 'true')

    • 决定是否创建新的 Transfer Family 服务器

    • 如果设置为 'true',模板会创建服务器并自动关联身份提供者

  2. 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 函数实现了以下功能:

  1. 用户认证流程:

    • 接收来自 Transfer Family 服务器的认证请求

    • 提取用户名、服务器 ID 和认证凭据(密码或 SSH 密钥)

    • 从 Secrets Manager 获取对应的用户配置(aws/transfer/{serverId}/{username}

  2. 认证方法:

    • 密码认证: 比较提供的密码与存储在 Secrets Manager 中的密码

    • SSH 公钥认证: 返回存储在 Secrets Manager 中的公钥

  3. 用户配置返回:

    • 必需字段:

      • 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

连接验证