通过标签保护函数 - AWS Lambda

通过标签保护函数

以下步骤演示了一种使用 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 角色上使用标签以控制可以传递该角色的用户的访问权限。有关将角色传递给服务所需权限的更多信息,请参阅授予用户将角色传递给 AWS 服务的权限

例 – 授予传递执行角色的权限
{ "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:选择可信实体中:选择 AWS 账户,然后选择此账户

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

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

步骤 6:创建 IAM 用户

创建名为 abac-test-user 的 IAM 用户。在 Set permissions(设置权限)部分中,选择 Attach existing policies directly(直接附加现有策略),然后选择 Create policy(创建策略)。输入以下策略定义。将 111122223333 替换为您的 AWS 账户 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 身份登录到 AWS 控制台。有关更多信息,请参阅作为 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(删除)。