与自定义身份提供者合作 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

与自定义身份提供者合作

要对用户进行身份验证,可以将现有的身份提供者与结合使用Amazon Transfer Family。您可以使用一个Amazon Lambda函数集成您的身份提供商,该函数对您的用户进行身份验证和授权,使其能够访问 Amazon S3 或 AmazAmazon Elastic File System (Amazon EFS)。有关详细信息,请参阅Amazon Lambda用于集成您的身份提供商。您还可以访问Amazon Transfer Family管理控制台中传输的文件数和字节数等指标的 CloudWatch 图表,从而使您可以使用集中式仪表板监控文件传输。

或者,您可以使用单个 Amazon API Gateway 方法提供 RESTful 接口。Transfer Family 调用此方法连接到您的身份提供商,该提供商对您的用户进行身份验证和授权,以访问 Amazon S3 或 Amazon EFS。如果您需要 RESTful API 来集成您的身份提供商,或者您想利用其功能Amazon WAF来执行地理封锁或速率限制请求,请使用此选项。有关详细信息,请参阅使用Amazon API Gateway 集成您的身份提供商

无论哪种情况,您都可以使用Amazon Transfer Family控制台CreateServerAPI 操作创建新服务器。

Amazon Lambda用于集成您的身份提供商

创建连接到您的自定义身份提供商的Amazon Lambda函数。您可以使用任何自定义身份提供商,例如 Okta、Secrets Manager 或包含授权和身份验证逻辑的自定义数据存储。 OneLogin

注意

在创建使用 Lambda 作为身份提供商的 Transfer Family 服务器之前,必须创建函数。有关示例 Lambda 函数,请参阅 默认 Lambda 函数。或者,您可以部署使用的 CloudFormation 堆栈Lambda 函数模板。此外,请确保您的 Lambda 函数使用信任 Transfer Family 的基于资源的策略。有关策略示例,请参阅 Lambda 基于资源的策略

  1. 打开 Amazon Transfer Family 控制台

  2. 选择 “创建服务器” 打开 “创建服务器” 页面。在 “选择身份提供商” 中,选择 “自定义身份提供商”,如以下屏幕截图所示。

  3. 确保选择默认值 “Amazon Lambda用于连接您的身份提供商”。

  4. 对于Amazon Lambda函数,选择 Lambda 函数的名称。

  5. 填写剩余的方框,然后选择 “创建服务器”。有关创建服务器的其余步骤的详细信息,请参阅创建服务器

Lambda 基于资源的策略

您必须拥有引用 Transfer Family 服务器和 Lambda ARN 的策略。例如,您可以将以下策略用于连接到您的身份提供商的 Lambda 函数。

{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "AllowTransferInvocation", "Effect": "Allow", "Principal": { "Service": "transfer.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "$lambda_arn", "Condition": { "ArnLike": { "AWS:SourceArn": "$server_arn" } } } ] }

事件消息结构

自定义 IDP 从 SFTP 服务器发送到授权方 Lambda 函数的事件消息结构如下所示。

{ 'username': 'value', 'password': 'value', 'protocol': 'SFTP', 'serverId': 's-abcd123456', 'sourceIp': '192.168.0.100' }

其中usernamepassword是发送到服务器的用户名和密码的值。

例如,输入以下命令进行连接:

sftp bobusa@server_hostname

然后系统会提示您输入密码:

Enter password: mysecretpassword

您可以通过在 Lambda 函数中打印传递的事件来从 Lambda 函数中检查这一点。它看上去类似于以下文本块。

{ 'username': 'bobusa', 'password': 'mysecretpassword', 'protocol': 'SFTP', 'serverId': 's-abcd123456', 'sourceIp': '192.168.0.100' }

FTP 和 FTPS 的事件结构类似:唯一的区别是这些值用于protocol参数,而不是 SFTP。

用于身份验证的 Lambda 函数

要实施不同的身份验证策略,请编辑 Lambda 函数。为了帮助您满足应用程序的需求,您可以部署堆 CloudFormation 栈。有关 Lambda 的更多信息,请参阅Amazon Lambda开发者指南使用 Node.js 构建 Lambda 函数

Lambda 函数模板

您可以部署使用 Lambda 函数进行身份验证的Amazon CloudFormation堆栈。我们提供多个模板,使用用户名和密码对您的用户进行身份验证和授权。您可以修改这些模板或Amazon Lambda代码以进一步自定义用户访问权限。

创建用于身份验证的Amazon CloudFormation堆栈
  1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

  2. 按照《Amazon CloudFormation用户指南》中的选择Amazon CloudFormation堆栈模板中的从现有模板部署堆栈模板中的从现有模板部署堆栈的说明进行操作

  3. 使用以下模板之一来创建用于在 Transfer Family 中进行身份验证的 Lambda 函数。

    重要

    我们建议您编辑默认的用户和密码凭证。

    • 经典(Cognito)堆栈模板

      用于在中创建用作Amazon Lambda自定义身份提供商的基本模板Amazon Transfer Family。它针对基于密码的身份验证通过 cognito 进行身份验证,如果使用基于公钥的身份验证,则会从 Amazon S3 存储桶返回公钥。部署后,您可以修改 Lambda 函数代码以执行其他操作。

    • Amazon Secrets Manager堆栈模板

      一种基本模板,与Amazon Transfer Family服务器Amazon Lambda一起使用,将 Secrets Manager 集成为身份提供商。它根据格式中的Amazon Secrets Manager条目进行身份验证SFTP/username。此外,密钥必须包含返回给 Transfer Family 的所有用户属性的键值对。部署后,您可以修改 Lambda 函数代码以执行其他操作。

    • Okta 堆栈模板:一种基本模板,与Amazon Transfer Family服务器Amazon Lambda一起使用,将 Okta 集成为自定义身份提供商。

    • Okta-MFA 堆栈模板:一种基本模板,与Amazon Transfer Family服务器Amazon Lambda一起使用,将 Okta 与 MultiFactor Authentication 集成,作为自定义身份提供商。

    • Azure Active Directory 模板:此堆栈的详细信息在博客文章使用 Azure Active Directory 进行身份验证中Amazon Transfer FamilyAmazon Lambda

    部署堆栈后,您可以在 CloudFormation 控制台的 Outputs 选项卡上查看有关堆栈的详细信息。

    部署其中一个堆栈是将自定义身份提供商集成到 Transfer Family 工作流程的最简单方法。默认情况下,Lambda 函数对使用密码为的单个用户进行身份验证MySuperSecretPasswordmyuser部署后,您可以编辑这些证书或更新 Lambda 函数代码以执行其他操作。

有效的 Lambda 值

下表介绍了 Transfer Family 为用于自定义身份提供商的 Lambda 函数接受的值的详细信息。

描述 必填

Role

指定控制用户对 Amazon S3 桶或 Amazon EFS 存储桶或 Amazon EFS 存储桶的访问权限的 IAM 角色的 IAM 资源名称 (ARN)。附加到此角色的策略确定在将文件传入和传出 Amazon S3 或 Amazon EFS 文件系统时要为用户提供的访问权限级别。IAM 角色还应包含一个信任关系,从而允许服务器在为用户的传输请求提供服务时访问您的资源。

必填

PosixProfile

完整的 POSIX 身份,包括用户 ID (Uid)、组 ID ()、组 ID ()、包括用户 ID (Gid)、组 ID ()、组 ID ()、包括用户 ID (SecondaryGids)、组 ID ()、包括用户 ID ()、组 ID ()、组 ID ()、包括用户 ID ()、组 POSIX 权限针对文件系统中的文件和目录设置,用于确定用户在将文件传入和传出 Amazon EFS 文件系统时获得的访问权限级别。

Amazon EFS 备份存储是必需的

PublicKeys

对该用户有效的 SSH 公钥值列表。空列表表示这不是有效的登录名。在密码身份验证期间不得返回。

可选

Policy

适用于您的用户的会话策略,可让您跨多个用户使用相同的 IAM 角色。此策略将用户的访问范围缩小至 Amazon S3 存储桶的一部分。

可选

HomeDirectoryType

您希望用户在登录服务器时,用户主目录的登录目录(文件夹)的类型。如果您将其设置为PATH,则用户将在其文件传输协议客户端中原样看到 Amazon S3 桶或 Amazon EFS 的绝对路径。如果您将其设置为LOGICAL,则必须在HomeDirectoryMappings参数中提供映射,说明您希望如何使 Amazon S3 或 Amazon EFS 路径对用户可见,在参数中提供映射。

可选

HomeDirectoryDetails

逻辑目录映射指定哪些 Amazon S3 或 Amazon EFS 路径和密钥应对您的用户可见,以及使其对用户可见的方式。您必须指定EntryTarget对,其中Entry显示如何使路径可见,是实际的 Amazon S3 或 Amazon EFS 路径。Target

如果值为HomeDirectoryType,则为必填项LOGICAL

HomeDirectory

用户使用客户端登录服务器时的登录目录。

可选

测试您的配置

创建自定义身份提供商后,应测试您的配置。

Console
使用Amazon Transfer Family控制台测试您的配置
  1. 打开 Amazon Transfer Family 控制台

  2. 在 “服务器” 页面上,选择您的新服务器,选择 “操作”,然后选择 “测试”。

  3. 输入您在部署Amazon CloudFormation堆栈时设置的用户名密码文本。如果您保留默认选项,则用户名为myuser,密码为MySuperSecretPassword

  4. 如果在部署Amazon CloudFormation堆栈时设置了源 IP 地址,请选择服务器协议并输入源 IP 的 IP 地址。

CLI
使用Amazon CLI 测试您的配置
  1. 运行 test-identity-provider 命令。按照后续步骤中的说明,user input placeholder使用您自己的信息替换每个信息。

    aws transfer test-identity-provider --server-id s-1234abcd5678efgh --user-name myuser --user-password MySuperSecretPassword --server-protocol FTP --source-ip 127.0.0.1
  2. 输入服务器 ID。

  3. 输入您在部署Amazon CloudFormation堆栈时设置的用户名和密码。如果您保留默认选项,则用户名为myuser,密码为MySuperSecretPassword

  4. 如果在部署Amazon CloudFormation堆栈时设置了服务器协议和源 IP 地址,请输入它们。

如果用户身份验证成功,则测试将返回StatusCode: 200 HTTP 响应和一个包含用户角色和权限详细信息的 JSON 对象,如以下示例所示。

{ "Response": "{\"Policy\": \"{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n{\n \"Sid\": \"ReadAndListAllBuckets\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:ListAllMybuckets\",\n \"s3:GetBucketLocation\",\n \"s3:ListBucket\",\n \"s3:GetObjectVersion\",\n \"s3:GetObjectVersion\"\n],\n \"Resource\":\"*\"\n}\n]\n}\",\"Role\": \"arn:aws:iam::000000000000:role/MyUserS3AccessRole\",\"HomeDirectory\": \"/\"}", "StatusCode": 200, "Message": "", "Url": "https://abcde1234.execute-api.us-east-2.amazonaws.com/prod/servers/s-123a4567bcd891e23/users/myuser/config" }
注意

仅当您使用 API Gateway 方法作为自定义身份提供商时,才会返回该"Url":行。

使用Amazon API Gateway 集成您的身份提供商

本节介绍如何使用Amazon Lambda函数支持 API Gateway 方法。如果您需要 RESTful API 来集成您的身份提供商,或者您想利用其功能Amazon WAF来执行地理封锁或速率限制请求,请使用此选项。

使用 API Gateway 集成身份提供商时的限制

  • 此配置不支持自定义域。

  • 此配置不支持私有 API Gateway URL。

如果您需要其中任何一个,则可以将 Lambda 用作身份提供商,而无需使用 API Gateway。有关详细信息,请参阅Amazon Lambda用于集成您的身份提供商

使用 API Gateway 方法进行身份验证

您可以创建 API Gateway 方法,用作 Transfer Family 的身份提供商。这种方法为您创建和提供 API 提供了一种高度安全的方式。使用 API Gateway,您可以创建 HTTPS 终端节点,以便以更高的安全性传输所有传入的 API 调用。有关 API Gateway 服务的更多详细信息,请参阅 API Gateway 开发者指南

API Gateway 提供名AWS_IAM为的身份验证方法,该方法基于Amazon Identity and Access Management (IAM) 为您提供与内部Amazon使用的相同身份验证。如果您启用身份验证AWS_IAM,则只有具有调用 API 的明确权限的调用者才能访问该 API 的 API Gateway 方法。

要使用您的 API Gateway 方法作为 Transfer Family 的自定义身份提供商,请为您的 API Gateway 方法启用 IAM。作为此流程的一部分,您需要为一个 IAM 角色提供 Transfer Family 使用您的网关的权限。

注意

为了提高安全性,您可以配置 Web 应用程序防火墙。 Amazon WAF是一个 Web 应用程序防火墙,可让您监视转发到Amazon API Gateway 的 HTTP 和 HTTPS 请求。有关详细信息,请参阅添加 Web 应用程序防火墙

使用你的 API Gateway 方法通过 Transfer Family 进行自定义身份验证
  1. 创建Amazon CloudFormation堆栈。要实现此目的,应按照以下步骤进行:

    1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

    2. 按照《Amazon CloudFormation用户指南》中的选择Amazon CloudFormation堆栈模板中的从现有模板部署堆栈模板中的从现有模板部署堆栈的说明进行操作

    3. 使用以下基本模板之一创建Amazon Lambda支持的 API Gateway 方法,用作 Transfer Family 中的自定义身份提供商。

    部署其中一个堆栈是将自定义身份提供商集成到 Transfer Family 工作流程的最简单方法。每个堆栈都使用 Lambda 函数来支持你基于 API Gateway 的 API 方法。然后,您可以在 Transfer Family 中使用您的 API 方法作为自定义身份提供商。默认情况下,Lambda 函数对使用密码为的单个用户进行身份验证MySuperSecretPasswordmyuser部署后,您可以编辑这些证书或更新 Lambda 函数代码以执行其他操作。

    重要

    我们建议您编辑默认的用户和密码凭证。

    部署堆栈后,您可以在 CloudFormation 控制台的 Outputs 选项卡上查看有关堆栈的详细信息。这些详细信息包括堆栈的亚马逊资源名称 (ARN)、堆栈创建的 IAM 角色的 ARN 以及您的新网关的 URL。

    注意

    如果您使用自定义身份提供商选项为用户启用基于密码的身份验证,并且启用了 API Gateway 提供的请求和响应日志,则 API Gateway 会将用户的密码记录到您的 Amazon L CloudWatch ogs 中。我们建议不要在生产环境中使用此日志。有关更多信息,请参阅《 CloudWatch API Gateway 开发人员指南》中的在 API Gateway 中设置 API 日志

  2. 检查服务器的 API Gateway 方法配置。要实现此目的,应按照以下步骤进行:

    1. 通过以下网址打开 API Gateway 控制台:https://console.aws.amazon.com/apigateway/

    2. 选择模板生成的转移自定义身份提供商基本Amazon CloudFormation模板 API

      以下屏幕截图显示了完整的 API 配置。在此示例中,该方法由 Lambda 函数支持,但也可以使用许多其他集成类型。

    3. 在 “资源” 窗格中,选择 GET,然后选择 “方法请求”。以下屏幕截图显示了正确的方法配置。

    此时,您的 API Gateway 已准备好部署。

  3. 对于操作,选择部署 API。对于部署阶段,选择 prod,然后选择 Dep loy

    成功部署 API Gateway 方法后,在舞台编辑器部分查看其性能,如以下屏幕截图所示。

    注意

    复制显示在屏幕顶部的调用 URL 地址。在下一步骤中,您需要用到它。

  4. 通过 https://console.aws.amazon.com/transfer/ 打开Amazon Transfer Family主机。

  5. 选择 “创建服务器” 打开 “创建服务器” 页面。在 “选择身份提供商” 中,选择 “自定义”,然后选择 “使用 Amazon API Gateway 连接到您的身份提供商”,如以下屏幕截图所示。

  6. 提供Amazon API Gateway URL 文本框中,粘贴您在本过程的步骤 3 中创建的 API Gateway 终端节点的调用 URL 地址。

  7. 对于角色,选择由Amazon CloudFormation模板创建的 IAM 角色。此角色允许 Transfer Family 调用您的 API 网关方法。

    调用角色包含您在步骤 1 中创建的堆栈的堆栈名称。Amazon CloudFormation它具有以下格式:CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI.

  8. 填写剩余的方框,然后选择 “创建服务器”。有关创建服务器的其余步骤的详细信息,请参阅创建服务器

实现 API Gateway 方法

要为 Transfer Family 创建自定义身份提供商,您的 API Gateway 方法必须实现资源路径为的单一方法/servers/serverId/users/username/configserverIdusername值来自 RESTful 资源路径。此外,在方法请求中添加sourceIpprotocol作为 URL 查询字符串参数,如下图所示。

注意

用户名最少必须为 3 个字符,最多为 100 个字符。在用户名中可以使用以下字符:a-9、句点 (-)、句点 (.)、句点 (.)、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、句点 ()、但是,用户名不能以连字符 (-)、@ 符号 (-)、句点 (-)、句点 (-)、句点 (-)、句点 (-)、句点 (-)、句点 (-)、句点 (

如果 Transfer Family 尝试对您的用户进行密码身份验证,则服务会提供Password:标题字段。在没有Password:标头的情况下,Transfer Family 会尝试使用公钥身份验证来对您的用户进行身份验证。

当您使用身份提供商对最终用户进行身份验证和授权时,除了验证其凭证外,您还可以根据最终用户使用的客户端 IP 地址允许或拒绝访问请求。您可以使用此功能确保存储在 S3 存储桶或 Amazon EFS 文件系统中的数据只能通过支持的协议从您指定为可信的 IP 地址进行访问。要启用此功能,必须在查询字符串sourceIp中包含。

如果您为服务器启用了多个协议,并希望使用相同的用户名通过多个协议提供访问权限,则只要在身份提供商中设置了每种协议的特定凭证,您就可以这样做。要启用此功能,必须在 RESTful 资源路径中包含该protocol值。

您的 API Gateway 方法应始终返回 HTTP 状态码200。任何其他 HTTP 状态代码都表示访问该 API 时出错。

Amazon S3 示例响应

示例响应正文是 Amazon S3 的以下格式的 JSON 文档。

{ "Role": "IAM role with configured S3 permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "Policy": "STS Assume role session policy", "HomeDirectory": "/bucketName/path/to/home/directory" }
注意

该策略以 JSON 形式转义为字符串。例如:

"Policy": "{ \"Version\": \"2012-10-17\", \"Statement\": [ {\"Condition\": {\"StringLike\": {\"s3:prefix\": [\"user/*\", \"user/\"]}}, \"Resource\": \"arn:aws:s3:::bucket\", \"Action\": \"s3:ListBucket\", \"Effect\": \"Allow\", \"Sid\": \"ListHomeDir\"}, {\"Resource\": \"arn:aws:s3:::*\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\", \"s3:DeleteObjectVersion\", \"s3:DeleteObject\", \"s3:GetObjectVersion\", \"s3:GetObjectACL\", \"s3:PutObjectACL\"], \"Effect\": \"Allow\", \"Sid\": \"HomeDirObjectAccess\"}] }"

以下示例响应显示用户具有逻辑主目录类型。

{ \"Role\": \"arn:aws:iam::123456789012:role/role-api-gateway-s3\", \"HomeDirectoryType\":\"LOGICAL\", \"HomeDirectoryDetails\":\"[{\\\"Entry\\\":\\\"/\\\",\\\"Target\\\":\\\"/my-home-bucket\\\"}]\", \"PublicKeys\":[\"\"] }
Amazon EFS 的示例

示例响应正文是 Amazon EFS 的以下格式的 JSON 文档。

{ "Role": "IAM role with configured EFS permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "PosixProfile": { "Uid": "POSIX user ID", "Gid": "POSIX group ID", "SecondaryGids": [Optional list of secondary Group IDs], }, "HomeDirectory": "/fs-id/path/to/home/directory" }

Role字段显示成功进行了身份验证。在进行密码身份验证(提供标Password:头时)时,无需提供 SSH 公钥。如果无法对用户进行身份验证,例如,如果密码不正确,则您的方法应返回未Role设置的响应。此类响应的一个示例是空的 JSON 对象。

以下示例响应显示了具有逻辑主目录类型的用户。

{ \"Role\": \"arn:aws:iam::123456789012:role/role-api-gateway-efs\", \"HomeDirectoryType\": \"LOGICAL\", \"HomeDirectoryDetails\":\"[{\\\"Entry\\\":\\\"/\\\",\\\"Target\\\":\\\"/faa1a123\\\"}]\", \"PublicKeys\":[\"\"], \"PosixProfile\":{\"Uid\":65534,\"Gid\":65534} }

您可以在 Lambda 函数中以 JSON 格式在 Lambda 函数中包含用户策略。有关在 Transfer Family 中配置用户策略的更多信息,请参阅管理访问控制

默认 Lambda 函数

要实施不同的身份验证策略,请编辑您的网关使用的 Lambda 函数。为了帮助您满足应用程序的需求,您可以在 Node.js 中使用以下示例 Lambda 函数。有关 Lambda 的更多信息,请参阅Amazon Lambda开发者指南使用 Node.js 构建 Lambda 函数

以下示例 Lambda 函数采用您的用户名、密码(如果您正在执行密码身份验证)、服务器 ID、协议和客户端 IP 地址。您可以组合使用这些输入来查找您的身份提供商并确定是否应接受登录。

注意

如果您为服务器启用了多个协议,并希望使用相同的用户名通过多个协议提供访问权限,则只要在身份提供商中设置了特定于该协议的凭据,就可以这样做。

对于文件传输协议 (FTP)、我们建议将凭证与 SSL (SSL) 的文件传输协议 (FTPS)、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、我们建议为 FTP 保留单独的凭据,因为与 SFTP 和 FTPS 不同,FTP 以明文传输凭据。通过将 FTP 凭据与 SFTP 或 FTPS 隔离,如果共享或泄露 FTP 凭据,则使用 SFTP 或 FTPS 的工作负载将保持安全。

此示例函数仅适用于 Amazon S3。此示例函数返回角色和逻辑主目录详细信息以及公钥(如果它执行公钥身份验证)。

HomeDirectoryType参数指定您希望用户在登录服务器时主目录的登录目录(文件夹)的类型。如果您将此参数设置为PATH,则用户将在其文件传输协议客户端中原样看到 Amazon S3 桶或 Amazon EFS 的绝对路径。如果您将此参数设置为LOGICAL,则必须在参数中提供映射,说明您希望如何使 Amazon S3 或 Amazon EFS 路径对用户可见,在HomeDirectoryMappings参数中提供映射。

PATH home directory

此功能适用于正在使用其功能PATH的用户HomeDirectoryType.

// GetUserConfig Lambda exports.handler = (event, context, callback) => { console.log("Username:", event.username, "ServerId: ", event.serverId); var response; // Check if the user name presented for authentication is correct. This doesn't check the value of the serverId, only that it is provided. // There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins. if (event.serverId !== "" && event.username == '${UserName}') { response = { Role: '${UserRoleArn}', // The user will be authenticated if and only if the Role field is not blank Policy: '', // Optional JSON blob to further restrict this user's permissions HomeDirectory: '${UserHomeDirectory}' // Not required, defaults to '/' }; // Check if password is provided if (event.password == "") { // If no password provided, return the user's SSH public key response['PublicKeys'] = [ "${UserPublicKey1}" ]; // Check if password is correct } else if (event.password !== '${UserPassword}') { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } } else { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } callback(null, response); };
LOGICAL home directory

以下 Lambda 函数为拥有逻辑主目录的用户提供详细信息。此函数中的用户、角色、POSIX 配置文件、密码和主目录详细信息均为示例,必须用您的实际值替换。

// GetUserConfig Lambda exports.handler = (event, context, callback) => { console.log("Username:", event.username, "ServerId: ", event.serverId); var response; // Check if the username presented for authentication is correct. This doesn't check the value of the serverId, only that it is provided. if (event.serverId !== "" && event.username == 'example-user') { response = { Role: 'arn:aws:iam::123456789012:role/role-api-gateway', // The user will be authenticated if and only if the Role field is not blank PosixProfile: {"Gid": 65534, "Uid": 65534}, HomeDirectoryDetails: "[{\"Entry\": \"/\", \"Target\": \"/fs-faa1a123\"}]", HomeDirectoryType: "LOGICAL", //HomeDirectory: '/fs-faa1a123' // Not required, defaults to '/' }; // Check if password is provided if (event.password == "") { // If no password provided, return the user's SSH public key response['PublicKeys'] = [ "" ]; // Check if password is correct } else if (event.password !== 'Password1234') { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } } else { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } callback(null, response); };

Lambda 函数可与一起使用Amazon Secrets Manager

要Amazon Secrets Manager用作您的身份提供商,您可以在示例Amazon CloudFormation模板中使用 Lambda 函数。Lambda 函数使用您的证书查询 Secrets Manager 服务,如果成功,则返回指定的密钥。有关 Secrets Manager 的更多信息,请参阅《Amazon Secrets Manager 用户指南》https://docs.amazonaws.cn/secretsmanager/latest/userguide/intro.html

要下载使用此 Lambda 函数的示例Amazon CloudFormation模板,请访问提供的 Amazon S3 存储桶Amazon Transfer Family