如何根据标签定义配置访问 Amazon 资源的权限

Attribute-based access control (ABAC)的授权方式

本教程介绍如何创建和测试允许具有tag的IAM role访问具有tag的资源。当principal向Amazon发起请求时,会根据tag是否匹配来授予权限。

如何系统打标签可以参见如何打标签Tag的操作指引。

假设场景

假设你在一个大企业领导一个开发团队,你作为IAM的管理员你很熟悉创建IAM users,roles和policies。你要确保开发团队和测试团队都能够访问到他们所需要的资源。你也希望策略可以随着企业规模的增长而自动增长不需要时刻维护。

先从分配Amazon Secrets Manager的权限开始。目前有两个正在开发的项目:PegasusUnicorn。你指定了要使用以下标签:

  • access-project = peg,代表Pegasus项目;

  • access-project = uni,代表Unicorn项目;

  • access-team = eng,代表开发团队

  • access-team=qas,代表测试团队

此外,你为了方便结算成本,还要求使用cost-center这个标签。

前提条件

开始配置权限之前,你要具备以下条件:

  • 有一个Amazon的账号,并且是管理员权限可以登录进去。

  • 你的12位账号ID要提前准备好,要使用亚马逊云科技管理控制台查找您的 Amazon 账户 ID 号,请选择右上角导航栏上的支持,然后选择支持中心。帐号 (ID) 将显示在左侧的导航窗格中。

Account ID
  • 具有创建IAM user,role和policy的经验。如果不会也可以查看分步指导。

Step 1:创建ABAC策略

ABAC 策略:只有Principal和Resource Tags匹配才能访问Secrets Manager资源。

策略名称可以为“SecretsManagerSameProjectSameTeam”,策略JSON内容如下:

SecretsManagerSameProjectSameTeam
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllActionsSecretsManagerSameProjectSameTeam",
            "Effect": "Allow",
            "Action": "secretsmanager:*",
            "Resource": "*",
            "Condition": {
                "StringEqualsIfExists": {
                    "aws:ResourceTag/access-project": "${aws:PrincipalTag/access-project}",
                    "aws:ResourceTag/access-team": "${aws:PrincipalTag/access-team}",
                    "aws:ResourceTag/cost-center": "${aws:PrincipalTag/cost-center}"
                },
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "access-project",
                        "access-team",
                        "cost-center"
                    ]
                }
            }
        },
        {
            "Sid": "AllResourcesSecretsManagerNoTags",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ReadSecretsManagerSameTeam",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:Describe*",
                "secretsmanager:List*",
                "secretsmanager:Get*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/access-team": "${aws:PrincipalTag/access-team}"
                }
            }
        },
        {
            "Sid": "DenyUntagSecretsManagerReservedTags",
            "Effect": "Deny",
            "Action": "secretsmanager:UntagResource",
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "aws:TagKeys": "access-*"
                }
            }
        },
        {
            "Sid": "DenyPermissionsManagement",
            "Effect": "Deny",
            "Action": "secretsmanager:*Policy",
            "Resource": "*"
        }
    ]
}

  • sid=AllActionsSecretsManagerSameProjectSameTeam的这段policy,允许对所有相关资源执行操作,前提条件是Principal的标签和resource的标签列出来的3个是一样的。 "Action": "secretsmanager:*",代表可以执行secrets manager中的任何操作。如果secrets manager新上线新的API操作,那么不需要将新的操作添加到policy里就可以使用。condition条件的含义参见此处。

  • AllResourcesSecretsManagerNoTags这段允许任何不带标签的资源可以执行GetRandomPassword以及ListSecrets操作。

  • ReadSecretsManagerSameTeam这段则是允许只读操作,只要principal请求者access-team的标签与resouce的匹配就行。

  • DenyUntagSecretsManagerReservedTags这段是如果请求中传递的TagKeys是"access-"开头的,则拒绝删除tags。

  • DenyPermissionsManagement则是拒绝create,edit 或者delete Secrets Manager resource-based policies。

Step 2: 创建role或者user group并为他们贴上标签,将刚才创建的policy关联到新的role

  1. 创建多个ABAC roles(类别选择Amazon Web Services account),这些role加刚才创建的policy。

Job Funtion
Role tags
Role name
Role description

Pegasus 项目开发

access-project = peg access-team = eng cost-center = 987654

access-peg-engineering

允许开发管理Pegasus项目的secrets manager,可以执行相关资源的所有操作。

Pegasus 项目测试

access-project = peg access-team = qas cost-center = 987654

access-peg-quality-assurance

可以执行GetRandomPassword以及ListSecrets操作。

Unicorn 项目开发

access-project = uni access-team = eng cost-center = 123456

access-uni-engineering

允许开发管理Unicorn项目的secrets manager,可以执行相关资源的所有操作。

Unicorn 项目测试

access-project = uni access-team = qas cost-center = 123456

access-uni-quality-assurance

可以执行GetRandomPassword以及ListSecrets操作。

  1. 用管理员权限创建多个secrets,为secrets添加tag。

Tags
Secrets name
Secrets tag
Expected behavior

test-access-peg-eng

access-project = peg access-team = eng cost-center = 987654

Pegasus 项目开发 -Allowed; Pegasus 项目测试 - Deny; Unicorn 项目开发 - Deny; Unicorn 项目测试 - Deny

test-access-uni-eng

access-project = uni access-team = eng cost-center = 987654

Pegasus 项目开发 -Deny; Pegasus 项目测试 - Deny; Unicorn 项目开发 - Allowed; Unicorn 项目测试 - Deny

test-access-peg-qas

access-project = peg access-team = qas cost-center = 987654

Pegasus 项目开发 -Deny; Pegasus 项目测试 - Allowed; Unicorn 项目开发 - Deny; Unicorn 项目测试 - Deny

test-access-uni-qas

access-project = uni access-team = qas cost-center = 123456

Pegasus 项目开发 -Deny; Pegasus 项目测试 - Deny; Unicorn 项目开发 - Deny; Unicorn 项目测试 - Allowed

Step 3: 测试效果

附加到每个角色的策略允许员工查看使用其团队名称标记的任何secrets,而不考虑其项目。通过切换角色,确认您的权限是否按预期工作。

最后更新于