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

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

如何系统打标签可以参见[如何打标签Tag](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/3.-shu-ju-bao-hu/shi-bie-ji-biao-shi-min-gan-shu-ju/ru-he-xi-tong-di-da-biao-qian-tag)的操作指引。

### 假设场景

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

先从分配Amazon Secrets Manager的权限开始。目前有两个正在开发的项目：**Pegasus** 和 **Unicorn。**&#x4F60;指定了要使用以下标签：

* `access-project = peg`，代表Pegasus项目；
* `access-project = uni`，代表Unicorn项目；
* `access-team = eng`，代表开发团队
* `access-team=qas`，代表测试团队

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

#### 前提条件

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

* 有一个Amazon的账号，并且是管理员权限可以登录进去。
* 你的12位账号ID要提前准备好，要使用亚马逊云科技管理控制台查找您的 Amazon 账户 ID 号，请选择右上角导航栏上的支持，然后选择支持中心。帐号 （ID） 将显示在左侧的导航窗格中。

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FMCytUAL9ajf4qVwPijTk%2FScreen%20Shot%202023-03-05%20at%2013.08.17.png?alt=media&#x26;token=62c421ae-f1d5-4988-9401-e874deafa694" alt=""><figcaption><p>Account ID</p></figcaption></figure>

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

#### Step 1:创建ABAC策略

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

策略名称可以为“SecretsManagerSameProjectSameTeam”，策略JSON内容如下：

<details>

<summary>SecretsManagerSameProjectSameTeam</summary>

```json
{
    "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": "*"
        }
    ]
}
```

</details>

* sid=AllActionsSecretsManagerSameProjectSameTeam的这段policy，允许对所有相关资源执行操作，前提条件是Principal的标签和resource的标签列出来的3个是一样的。 "Action": "secretsmanager:\*"，代表可以执行secrets manager中的任何操作。如果secrets manager新上线新的API操作，那么不需要将新的操作添加到policy里就可以使用。condition条件的含义[参见此处。](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/1.-iam-shen-fen-shi-bie-yu-fang-wen-kong-zhi/xin-shou-qi-bu/ru-he-xie-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。

<table><thead><tr><th>Job Funtion</th><th>Role tags</th><th>Role name</th><th>Role description</th></tr></thead><tbody><tr><td>Pegasus 项目开发</td><td>access-project = peg access-team = eng cost-center = 987654</td><td><pre><code>access-peg-engineering
</code></pre></td><td>允许开发管理Pegasus项目的secrets manager，可以执行相关资源的所有操作。</td></tr><tr><td>Pegasus 项目测试</td><td>access-project = peg access-team = qas cost-center = 987654</td><td><pre><code>access-peg-quality-assurance
</code></pre></td><td>可以执行GetRandomPassword以及ListSecrets操作。</td></tr><tr><td>Unicorn 项目开发</td><td>access-project = uni access-team = eng cost-center = 123456</td><td><pre><code>access-uni-engineering
</code></pre></td><td>允许开发管理Unicorn项目的secrets manager，可以执行相关资源的所有操作。</td></tr><tr><td>Unicorn 项目测试</td><td>access-project = uni access-team = qas cost-center = 123456</td><td><pre><code>access-uni-quality-assurance
</code></pre></td><td>可以执行GetRandomPassword以及ListSecrets操作。</td></tr></tbody></table>

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

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2Fv7hJPBykUbYylFzBoVzJ%2FScreen%20Shot%202023-03-05%20at%2020.54.36.png?alt=media&#x26;token=9858f63b-7a64-4b39-8214-1216df50b01f" alt=""><figcaption><p>Tags</p></figcaption></figure>

| Secrets name        | Secrets tag                                                              | Expected behavior                                                                                    |
| ------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| test-access-peg-eng | <p>access-project = peg<br>access-team = eng<br>cost-center = 987654</p> | <p>Pegasus 项目开发 -Allowed;<br>Pegasus 项目测试 - Deny;<br>Unicorn 项目开发 - Deny;<br>Unicorn 项目测试 - Deny</p> |
| test-access-uni-eng | <p>access-project = uni<br>access-team = eng<br>cost-center = 987654</p> | <p>Pegasus 项目开发 -Deny;<br>Pegasus 项目测试 - Deny;<br>Unicorn 项目开发 - Allowed;<br>Unicorn 项目测试 - Deny</p> |
| test-access-peg-qas | <p>access-project = peg<br>access-team = qas<br>cost-center = 987654</p> | <p>Pegasus 项目开发 -Deny;<br>Pegasus 项目测试 - Allowed;<br>Unicorn 项目开发 - Deny;<br>Unicorn 项目测试 - Deny</p> |
| test-access-uni-qas | <p>access-project = uni<br>access-team = qas<br>cost-center = 123456</p> | <p>Pegasus 项目开发 -Deny;<br>Pegasus 项目测试 - Deny;<br>Unicorn 项目开发 - Deny;<br>Unicorn 项目测试 - Allowed</p> |

#### Step 3: 测试效果

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

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FKkjBmdUIyDl5Q6LZTNZn%2FScreen%20Shot%202023-03-05%20at%2022.10.58.png?alt=media&#x26;token=d39dc0eb-7b06-4d42-aaf6-756c3689933f" alt=""><figcaption></figcaption></figure>
