通过标签保护函数
以下步骤演示了一种使用 ABAC 设置函数权限的方法。在此示例方案中,您将创建四个 IAM 权限策略。然后,您会将这些策略附加到新的 IAM 角色。最后,您将创建一个 IAM 用户并授予该用户担任新角色的权限。
主题
先决条件
确保您具有 Lambda 执行角色。当您授予 IAM 权限和创建 Lambda 函数时,您将使用此角色。
步骤 1:要求新函数具有标签
当将 ABAC 与 Lambda 配合使用时,最佳做法是要求所有函数都具有标签。这有助于确保您的 ABAC 权限策略按预期工作。
创建类似于以下示例的 IAM policy。此策略使用 aws:RequestTag/tag-key、aws:ResourceTag/tag-key 和 aws: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:测试权限
-
以
abac-test-user
身份登录到 AWS 控制台。有关更多信息,请参阅作为 IAM 用户登录。 -
切换到
abac-project-role
角色。有关更多信息,请参阅切换到角色(控制台)。 -
-
在 Permissions(权限)下,选择 Change default execution role(更改默认执行角色),然后对于 Execution role(执行角色),选择 Use an existing role(使用现有角色)。选择您在 步骤 4:授予 IAM 权限 中使用的相同执行角色。
-
在 Advanced settings(高级设置)下,选择 Enable tags(启用标签),然后选择 Add new tag(添加新标签)。对于键,输入
project
。不要输入 Value(值)。
-
-
测试函数。
-
创建第二个 Lambda 函数并添加其他标签,例如
environment
。此操作应会失败,因为您在 步骤 1:要求新函数具有标签 中创建的 ABAC 策略仅允许主体创建具有project
标签的函数。 -
创建第三个没有标签的函数。此操作应会失败,因为您在 步骤 1:要求新函数具有标签 中创建的 ABAC 策略不允许主体创建没有标签的函数。
此授权策略允许您控制访问权限,而无需为每个新用户创建新的策略。要向新用户授予访问权限,只需授予他们担任与其所分配项目相对应的角色的权限。
步骤 8:清理资源
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入
confirm
,然后选择 Delete(删除)。