Lambda 函数 URL 的安全性和身份验证模型 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Lambda 函数 URL 的安全性和身份验证模型

您可以使用 AuthType 参数和附上特定函数的基于资源的策略来控制对 Lambda 函数 URL 的访问。这两个组件的配置决定了谁可以对函数 URL 调用或执行其他管理操作。

AuthType 参数确定了 Lambda 如何对函数 URL 的请求进行身份验证或授权。配置函数 URL 时,必须指定以下 AuthType 选项之一:

  • AWS_IAM – Lambda 根据 IAM 主体的身份策略和函数基于资源的策略使用 Amazon Identity and Access Management (IAM) 对请求进行身份验证和授权。如果只希望经过身份验证的 用户和角色通过函数 URL 调用函数,请选择此选项。

  • NONE – Lambda 在调用函数之前不会执行任何身份验证。但是,函数基于资源的策略始终有效,并且必须在函数 URL 接收请求之前授予公有访问权限。选择此选项可允许对函数 URL 进行未经身份验证的公有访问。

AuthType 之外,您还可以使用基于资源的策略向其他 Amazon Web Services 账户 授予调用您的函数的权限。有关更多信息,请参阅将基于资源的策略用于 Lambda

要了解更多关于安全性的洞察,可以使用 Amazon Identity and Access Management Access Analyzer 获取对函数 URL 的外部访问的全面分析。IAM Access Analyzer 还可以监控 Lambda 函数的新权限或更新权限,以帮助您识别授予公有和跨账户访问的权限。IAM Access Analyzer 可供任何 Amazon 客户免费使用。要开始使用 IAM Access Analyzer,请参阅使用 Amazon IAM Access Analyzer

本页包含两种身份验证类型的基于资源的策略的示例,以及如何使用 AddPermissionAPI 操作或 Lambda 控制台创建这些策略。有关设置权限后如何调用函数 URL 的信息,请参阅 调用 Lambda 函数 URL

使用 AWS_IAM 身份验证类型

如果选择 AWS_IAM 身份验证类型,则需要调用 Lambda 函数 URL 的用户必须具有 lambda:InvokeFunctionUrl 权限。根据发出调用请求的人员,您可能需要使用基于资源的策略授予此权限。

如果发出请求的主体与函数 URL 的 Amazon Web Services 账户 相同,则主体必须或者在其基于身份的策略中拥有 lambda:InvokeFunctionUrl 权限,或者在函数基于资源的策略中获授权限。换句话说,如果用户已经在其基于身份的策略中拥有 lambda:InvokeFunctionUrl 权限,则基于资源的策略为可选。策略评估遵循确定是允许还是拒绝账户内的请求中概述的规则。

如果发出请求的主体位于不同的账户中,则主体必须同时具有基于身份的策略(该策略为其提供 lambda:InvokeFunctionUrl 权限)基于资源的策略(基于其尝试调用的函数)中授予的权限。在这些跨账户情况下,策略评估遵循确定是否允许跨账户请求中概述的规则。

对于跨账户交互示例,以下基于资源的策略允许 Amazon Web Services 账户 444455556666 中的 example 角色调用与函数 my-function 关联的函数 URL:

例 函数 URL 跨账户调用策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/example" }, "Action": "lambda:InvokeFunctionUrl", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "AWS_IAM" } } } ] }

您可以按照以下步骤通过控制台创建此策略语句:

将 URL 调用权限授予另一个账户(控制台)
  1. 打开 Lamba 控制台的函数页面

  2. 选择要为其授予 URL 调用权限的函数的名称。

  3. 选择 Configuration(配置)选项卡,然后选择 Permissions(权限)。

  4. Resource-based policy(基于资源的策略)下,选择 Add permissions(添加权限)。

  5. 选择 Function URL(函数 URL)。

  6. 对于 Auth type(身份验证类型),选择 AWS_IAM

  7. (可选)在 Statement ID(语句 ID)中,为策略语句输入语句 ID。

  8. 对于主体,请输入要向其授予权限的用户或角色的 Amazon 资源名称(ARN)。例如:444455556666

  9. 选择保存

或者,也可以使用以下 add-permission Amazon Command Line Interface (Amazon CLI) 命令创建此策略语句:

aws lambda add-permission --function-name my-function \ --statement-id example0-cross-account-statement \ --action lambda:InvokeFunctionUrl \ --principal 444455556666 \ --function-url-auth-type AWS_IAM

在上一个示例中,lambda:FunctionUrlAuthType 条件键值为 AWS_IAM。此策略仅在函数 URL 的身份验证类型也为 AWS_IAM 时允许访问。

使用 NONE 身份验证类型

重要

当您的函数 URL 身份验证类型为 NONE 且您有基于资源的策略授予公有访问权限时,任何使用您函数 URL 的未经身份验证的用户都可以调用您的函数。

在某些情况下,您可能希望函数 URL 为公有。例如,您可能希望处理直接从 Web 浏览器发出的请求。要允许函数 URL 公有访问权限,请选择 NONE 身份验证类型。

如果选择 NONE 身份验证类型,Lambda 不会使用 IAM 对函数 URL 的请求进行身份验证。但是,用户仍必须拥有 lambda:InvokeFunctionUrl 权限才能成功调用函数 URL。您可以使用以下基于资源的策略授予 lambda:InvokeFunctionUrl 权限:

例 适用于所有未经身份验证的主体的函数 URL 调用策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "lambda:InvokeFunctionUrl", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "NONE" } } } ] }
注意

通过控制台或 Amazon Serverless Application Model (Amazon SAM) 创建具有身份验证类型 NONE 的函数 URL 时,Lambda 会自动创建前面的基于资源的策略语句。如果策略已经存在,或者创建应用程序的用户或角色没有相应的权限,Lambda 将不会为您创建该策略。如果直接使用 Amazon CLI、Amazon CloudFormation 或 Lambda API,则必须自己添加 lambda:InvokeFunctionUrl 权限。这会让您的函数变为公有。

此外,如果您删除身份验证类型为 NONE 的函数 URL,Lambda 不会自动删除关联的基于资源的策略。如果要删除此策略,您必须手动执行该操作。

在此语句中,lambda:FunctionUrlAuthType 条件键值为 NONE。此策略仅在函数 URL 的身份验证类型也为 NONE 时允许访问。

如果函数基于资源的策略未授予 lambda:invokeFunctionUrl 权限,则用户在尝试调用函数 URL 时,将收到 403 禁止的错误代码,即使函数 URL 使用 NONE 身份验证类型也是如此。

治理和访问控制

除了函数 URL 调用权限外,还可以控制对用于配置函数 URL 的操作的访问。Lambda 支持以下针对函数 URL 的 IAM policy 操作:

  • lambda:InvokeFunctionUrl – 使用函数 URL 调用 Lambda 函数。

  • lambda:CreateFunctionUrlConfig – 创建函数 URL 并设置其 AuthType

  • lambda:UpdateFunctionUrlConfig – 更新函数 URL 配置及其 AuthType

  • lambda:GetFunctionUrlConfig – 查看函数 URL 的详细信息。

  • lambda:ListFunctionUrlConfigs – 列出函数 URL 配置。

  • lambda:DeleteFunctionUrlConfig – 删除函数 URL。

注意

Lambda 控制台仅支持为 lambda:InvokeFunctionUrl 添加权限。对于所有其他操作,必须使用 Lambda API 或 Amazon CLI 添加权限。

要允许或拒绝对其他 Amazon 实体的函数 URL 访问,请在 IAM policy 中包含这些操作。例如,以下策略授予 Amazon Web Services 账户 444455556666 中的 example 角色在账户 123456789012 中更新函数 my-function 的函数 URL 的权限。

例 跨账户函数 URL 策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/example" }, "Action": "lambda:UpdateFunctionUrlConfig", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function" } ] }

条件键

要对函数 URL 进行精细访问控制,请使用条件键。Lambda 支持函数 URL 的一个附加条件键:FunctionUrlAuthTypeFunctionUrlAuthType 键定义了一个枚举值,描述函数 URL 使用的身份验证类型。该值可以是 AWS_IAMNONE

可以在与函数关联的策略中使用此条件键。例如,您可能希望限制谁可以对函数 URL 进行配置更改。要拒绝对 URL 身份验证类型 NONE 的任何函数的所有 UpdateFunctionUrlConfig 请求,可以定义以下策略:

例 带有显式拒绝的函数 URL 策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action":[ "lambda:UpdateFunctionUrlConfig" ], "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "NONE" } } } ] }

要授予 Amazon Web Services 账户 444455556666 中的 example 角色对 URL 身份验证类型 AWS_IAM 的函数进行 CreateFunctionUrlConfigUpdateFunctionUrlConfig 请求的权限,可以定义以下策略:

例 带有显式允许的函数 URL 策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/example" }, "Action":[ "lambda:CreateFunctionUrlConfig", "lambda:UpdateFunctionUrlConfig" ], "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "AWS_IAM" } } } ] }

您还可以在服务控制策略(SCP)中使用此条件键。使用 SCP 在 Amazon Organizations 中管理整个企业的权限。例如,要拒绝用户创建或更新使用除 AWS_IAM 身份验证类型以外的任何身份验证类型的函数 URL,请使用以下服务控制策略:

例 带有显式拒绝的函数 URL SCP
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action":[ "lambda:CreateFunctionUrlConfig", "lambda:UpdateFunctionUrlConfig" ], "Resource": "arn:aws:lambda:*:123456789012:function:*", "Condition": { "StringNotEquals": { "lambda:FunctionUrlAuthType": "AWS_IAM" } } } ] }