本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
与自定义身份提供者合作
要对用户进行身份验证,可以将现有的身份提供者与结合使用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控制台
Amazon Lambda用于集成您的身份提供商
创建连接到您的自定义身份提供商的Amazon Lambda函数。您可以使用任何自定义身份提供商,例如 Okta、Secrets Manager 或包含授权和身份验证逻辑的自定义数据存储。 OneLogin
在创建使用 Lambda 作为身份提供商的 Transfer Family 服务器之前,必须创建函数。有关示例 Lambda 函数,请参阅 默认 Lambda 函数。或者,您可以部署使用的 CloudFormation 堆栈Lambda 函数模板。此外,请确保您的 Lambda 函数使用信任 Transfer Family 的基于资源的策略。有关策略示例,请参阅 Lambda 基于资源的策略。
-
选择 “创建服务器” 打开 “创建服务器” 页面。在 “选择身份提供商” 中,选择 “自定义身份提供商”,如以下屏幕截图所示。
-
确保选择默认值 “Amazon Lambda用于连接您的身份提供商”。
-
对于Amazon Lambda函数,选择 Lambda 函数的名称。
-
填写剩余的方框,然后选择 “创建服务器”。有关创建服务器的其余步骤的详细信息,请参阅创建服务器。
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' }
其中username
和password
是发送到服务器的用户名和密码的值。
例如,输入以下命令进行连接:
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堆栈
-
打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation
。 -
按照《Amazon CloudFormation用户指南》中的选择Amazon CloudFormation堆栈模板中的从现有模板部署堆栈模板中的从现有模板部署堆栈的说明进行操作
-
使用以下模板之一来创建用于在 Transfer Family 中进行身份验证的 Lambda 函数。
重要 我们建议您编辑默认的用户和密码凭证。
-
用于在中创建用作Amazon Lambda自定义身份提供商的基本模板Amazon Transfer Family。它针对基于密码的身份验证通过 cognito 进行身份验证,如果使用基于公钥的身份验证,则会从 Amazon S3 存储桶返回公钥。部署后,您可以修改 Lambda 函数代码以执行其他操作。
-
一种基本模板,与Amazon Transfer Family服务器Amazon Lambda一起使用,将 Secrets Manager 集成为身份提供商。它根据格式中的Amazon Secrets Manager条目进行身份验证
SFTP/
。此外,密钥必须包含返回给 Transfer Family 的所有用户属性的键值对。部署后,您可以修改 Lambda 函数代码以执行其他操作。username
-
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 函数对使用密码为的单个用户进行身份验证
MySuperSecretPassword
。myuser
部署后,您可以编辑这些证书或更新 Lambda 函数代码以执行其他操作。 -
有效的 Lambda 值
下表介绍了 Transfer Family 为用于自定义身份提供商的 Lambda 函数接受的值的详细信息。
值 | 描述 | 必填 |
---|---|---|
|
指定控制用户对 Amazon S3 桶或 Amazon EFS 存储桶或 Amazon EFS 存储桶的访问权限的 IAM 角色的 IAM 资源名称 (ARN)。附加到此角色的策略确定在将文件传入和传出 Amazon S3 或 Amazon EFS 文件系统时要为用户提供的访问权限级别。IAM 角色还应包含一个信任关系,从而允许服务器在为用户的传输请求提供服务时访问您的资源。 |
必填 |
|
完整的 POSIX 身份,包括用户 ID ( |
Amazon EFS 备份存储是必需的 |
|
对该用户有效的 SSH 公钥值列表。空列表表示这不是有效的登录名。在密码身份验证期间不得返回。 |
可选 |
|
适用于您的用户的会话策略,可让您跨多个用户使用相同的 IAM 角色。此策略将用户的访问范围缩小至 Amazon S3 存储桶的一部分。 |
可选 |
|
您希望用户在登录服务器时,用户主目录的登录目录(文件夹)的类型。如果您将其设置为 |
可选 |
|
逻辑目录映射指定哪些 Amazon S3 或 Amazon EFS 路径和密钥应对您的用户可见,以及使其对用户可见的方式。您必须指定 |
如果值为 |
|
用户使用客户端登录服务器时的登录目录。 |
可选 |
测试您的配置
创建自定义身份提供商后,应测试您的配置。
如果用户身份验证成功,则测试将返回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 进行自定义身份验证
-
创建Amazon CloudFormation堆栈。要实现此目的,应按照以下步骤进行:
-
打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation
。 -
按照《Amazon CloudFormation用户指南》中的选择Amazon CloudFormation堆栈模板中的从现有模板部署堆栈模板中的从现有模板部署堆栈的说明进行操作
-
使用以下基本模板之一创建Amazon Lambda支持的 API Gateway 方法,用作 Transfer Family 中的自定义身份提供商。
-
默认情况下,您的 API Gateway 方法用作自定义身份提供商,使用硬编码 SSH(Secure Shell)密钥或密码对单个服务器中的单个用户进行身份验证。部署后,您可以修改 Lambda 函数代码以执行其他操作。
-
默认情况下,您的 API Gateway 方法会根据Secrets Manager 中格式的条目进行身份验证
SFTP/
。此外,密钥必须包含返回给 Transfer Family 的所有用户属性的键值对。部署后,您可以修改 Lambda 函数代码以执行其他操作。有关更多信息,请参阅启用密码身份验证以供Amazon Transfer Family使用Amazon Secrets Managerusername
。 -
你的 API Gateway 方法与 Okta 集成,作为 Transfer Family 中的自定义身份提供商。有关更多信息,请参阅使用 Okta 作为身份提供商Amazon Transfer Family
。
-
部署其中一个堆栈是将自定义身份提供商集成到 Transfer Family 工作流程的最简单方法。每个堆栈都使用 Lambda 函数来支持你基于 API Gateway 的 API 方法。然后,您可以在 Transfer Family 中使用您的 API 方法作为自定义身份提供商。默认情况下,Lambda 函数对使用密码为的单个用户进行身份验证
MySuperSecretPassword
。myuser
部署后,您可以编辑这些证书或更新 Lambda 函数代码以执行其他操作。重要 我们建议您编辑默认的用户和密码凭证。
部署堆栈后,您可以在 CloudFormation 控制台的 Outputs 选项卡上查看有关堆栈的详细信息。这些详细信息包括堆栈的亚马逊资源名称 (ARN)、堆栈创建的 IAM 角色的 ARN 以及您的新网关的 URL。
注意 如果您使用自定义身份提供商选项为用户启用基于密码的身份验证,并且启用了 API Gateway 提供的请求和响应日志,则 API Gateway 会将用户的密码记录到您的 Amazon L CloudWatch ogs 中。我们建议不要在生产环境中使用此日志。有关更多信息,请参阅《 CloudWatch API Gateway 开发人员指南》中的在 API Gateway 中设置 API 日志。
-
-
检查服务器的 API Gateway 方法配置。要实现此目的,应按照以下步骤进行:
-
通过以下网址打开 API Gateway 控制台:https://console.aws.amazon.com/apigateway/
。 -
选择模板生成的转移自定义身份提供商基本Amazon CloudFormation模板 API。
以下屏幕截图显示了完整的 API 配置。在此示例中,该方法由 Lambda 函数支持,但也可以使用许多其他集成类型。
-
在 “资源” 窗格中,选择 GET,然后选择 “方法请求”。以下屏幕截图显示了正确的方法配置。
此时,您的 API Gateway 已准备好部署。
-
-
对于操作,选择部署 API。对于部署阶段,选择 prod,然后选择 Dep loy。
成功部署 API Gateway 方法后,在舞台编辑器部分查看其性能,如以下屏幕截图所示。
注意 复制显示在屏幕顶部的调用 URL 地址。在下一步骤中,您需要用到它。
-
通过 https://console.aws.amazon.com/transfer/
打开Amazon Transfer Family主机。 -
选择 “创建服务器” 打开 “创建服务器” 页面。在 “选择身份提供商” 中,选择 “自定义”,然后选择 “使用 Amazon API Gateway 连接到您的身份提供商”,如以下屏幕截图所示。
-
在提供Amazon API Gateway URL 文本框中,粘贴您在本过程的步骤 3 中创建的 API Gateway 终端节点的调用 URL 地址。
-
对于角色,选择由Amazon CloudFormation模板创建的 IAM 角色。此角色允许 Transfer Family 调用您的 API 网关方法。
调用角色包含您在步骤 1 中创建的堆栈的堆栈名称。Amazon CloudFormation它具有以下格式:
.CloudFormation-stack-name
-TransferIdentityProviderRole-ABC123DEF456GHI
-
填写剩余的方框,然后选择 “创建服务器”。有关创建服务器的其余步骤的详细信息,请参阅创建服务器。
实现 API Gateway 方法
要为 Transfer Family 创建自定义身份提供商,您的 API Gateway 方法必须实现资源路径为的单一方法/servers/
。serverId
/users/username
/config
和serverId
值来自 RESTful 资源路径。此外,在方法请求中添加username
sourceIp
和protocol
作为 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-rsapublic-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-rsapublic-key1
", "ssh-rsapublic-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参数中提供映射。
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