通过标签保护函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

通过标签保护函数

以下步骤演示了一种使用 ABAC 设置函数权限的方法。在此示例方案中,您将创建四个 IAM 权限策略。然后,您会将这些策略附加到新的 IAM 角色。最后,您将创建一个 IAM 用户并授予该用户担任新角色的权限。

先决条件

确保您具有 Lambda 执行角色。当您授予 IAM 权限和创建 Lambda 函数时,您将使用此角色。

步骤 1:要求新函数具有标签

当将 ABAC 与 Lambda 配合使用时,最佳做法是要求所有函数都具有标签。这有助于确保您的 ABAC 权限策略按预期工作。

创建类似于以下示例的 IAM policy。此策略使用 aws:RequestTag/tag-keyaws:ResourceTag/tag-keyaws:TagKeys 条件键来要求新函数和创建函数的 IAM 主体都具有 project 标签。ForAllValues 修饰符确保 project 是唯一允许的标签。如果您未包括 ForAllValues 修饰符,则用户可以将其他标签添加到函数中,只要它们也传递 project

例 – 要求新函数具有标签
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "lambda:CreateFunction", "lambda:TagResource" ], "Resource": "arn:aws:lambda:*:*:function:*", "Condition": { "StringEquals": { "aws:RequestTag/project": "${aws:PrincipalTag/project}", "aws:ResourceTag/project": "${aws:PrincipalTag/project}" }, "ForAllValues:StringEquals": { "aws:TagKeys": "project" } } } }

步骤 2:允许基于附加到 Lambda 函数和 IAM 主体的标签执行操作

使用 aws:ResourceTag/tag-key 条件键创建第二个 IAM policy,以要求主体的标签与附加到函数的标签匹配。以下示例策略允许具有 project 标签的委托人调用具有 project 标签的函数。如果函数具有任何其他标签,则该操作将被拒绝。

例 – 要求函数和 IAM 主体的标签匹配
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:GetFunction" ], "Resource": "arn:aws:lambda:*:*:function:*", "Condition": { "StringEquals": { "aws:ResourceTag/project": "${aws:PrincipalTag/project}" } } } ] }

步骤 3:授予列表权限

创建允许主体列出 Lambda 函数和 IAM 角色的策略。这样,主体就可以在控制台上以及调用 API 操作时查看所有 Lambda 函数和 IAM 角色。

例 – 授予 Lambda 和 IAM 列表权限
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllResourcesLambdaNoTags", "Effect": "Allow", "Action": [ "lambda:GetAccountSettings", "lambda:ListFunctions", "iam:ListRoles" ], "Resource": "*" } ] }

步骤 4:授予 IAM 权限

创建允许 iam:PassRole 的策略。当您将执行角色分配给函数时,需要此权限。在以下示例策略中,将示例 ARN 替换为 Lambda 执行角色的 ARN。

注意

不要在策略中将 ResourceTag 条件键与 iam:PassRole 操作一起使用。您无法在 IAM 角色上使用标签以控制可以传递该角色的用户的访问权限。有关将角色传递给服务所需权限的更多信息,请参阅授予用户将角色传递给 Amazon 服务的权限

例 – 授予传递执行角色的权限
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::111122223333:role/lambda-ex" } ] }

步骤 5:创建 IAM 角色

使用角色委托权限是最佳实践。创建名为 abac-project-role 的 IAM 角色

  • 步骤 1:选择可信实体中:选择 Amazon 账户,然后选择此账户

  • 步骤 2:添加权限上:附加您在前面的步骤中创建的四个 IAM policy。

  • 步骤 3:命名、查看和创建上:选择 Add tag(添加标签)。对于,输入 project。不要输入 Value(值)。

步骤 6:创建 IAM 用户

创建名为 abac-test-user 的 IAM 用户。在 Set permissions(设置权限)部分中,选择 Attach existing policies directly(直接附加现有策略),然后选择 Create policy(创建策略)。输入以下策略定义。将 111122223333 替换为您的 Amazon 账户 ID。此策略允许 abac-test-user 担任 abac-project-role

例 – 允许 IAM 用户担任 ABAC 角色
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::111122223333:role/abac-project-role" } }

步骤 7:测试权限

  1. abac-test-user 身份登录到 Amazon 控制台。有关更多信息,请参阅作为 IAM 用户登录

  2. 切换到 abac-project-role 角色。有关更多信息,请参阅切换到角色(控制台)

  3. 创建 Lambda 函数

    • Permissions(权限)下,选择 Change default execution role(更改默认执行角色),然后对于 Execution role(执行角色),选择 Use an existing role(使用现有角色)。选择您在 步骤 4:授予 IAM 权限 中使用的相同执行角色。

    • Advanced settings(高级设置)下,选择 Enable tags(启用标签),然后选择 Add new tag(添加新标签)。对于,输入 project。不要输入 Value(值)。

  4. 测试函数

  5. 创建第二个 Lambda 函数并添加其他标签,例如 environment。此操作应会失败,因为您在 步骤 1:要求新函数具有标签 中创建的 ABAC 策略仅允许主体创建具有 project 标签的函数。

  6. 创建第三个没有标签的函数。此操作应会失败,因为您在 步骤 1:要求新函数具有标签 中创建的 ABAC 策略不允许主体创建没有标签的函数。

此授权策略允许您控制访问权限,而无需为每个新用户创建新的策略。要向新用户授予访问权限,只需授予他们担任与其所分配项目相对应的角色的权限。

步骤 8:清理资源

要删除 IAM 角色
  1. 打开 IAM 控制台的角色页面

  2. 选择您在步骤 5 中创建的角色。

  3. 选择删除

  4. 要确认删除,在文本输入字段中输入角色名称。

  5. 选择删除

删除 IAM 用户
  1. 打开 IAM 控制台的用户页面

  2. 选择您在步骤 6 中创建的 IAM 用户。

  3. 选择删除

  4. 要确认删除,在文本输入字段中输入用户名。

  5. 选择删除用户

删除 Lambda 函数
  1. 打开 Lamba 控制台的 Functions(函数)页面

  2. 选择您创建的函数。

  3. 依次选择操作删除

  4. 在文本输入字段中键入 confirm,然后选择 Delete(删除)。