# 如何使用SAML session tags实现SSO的ABAC权限管理

如果您的公司使用基于SAML的身份提供商（IdP）来管理企业的用户身份，那么可以使用SAML属性在AWS进行精细的访问控制。属性包括成本中心标识，用户email地址，部门分类，项目分配。当你将这些属性用session tags传递时，你可以基于这些session tags控制访问Amazon的权限。

## 前提条件

要使用SAML的session tags你必须已经拥有以下内容：

* 有基于SAML的IdP，在这个IdP你可以创建测试用户，带有指定的属性；
* 作为管理员登录的权限；
* 有在AWS创建user，role，group，policy等的经验；
* 拥有配置基于SAML的IdP到IAM的经验；

## Step 1: 创建一个用于SAML 2.0 federation的role

给role起名为`access-session-tags`，附加`access-same-project-team`的策略（可以参见[如何根据标签定义访问Amazon资源的权限](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/1.-iam-shen-fen-shi-bie-yu-fang-wen-kong-zhi/abac-quan-xian-kong-zhi-fang-shi/abac-de-ying-yong/ru-he-gen-ju-biao-qian-ding-yi-pei-zhi-fang-wen-amazon-zi-yuan-de-quan-xian)），编辑role trust policy使用以下的trust policy。

<details>

<summary>role trust policy</summary>

<pre class="language-json"><code class="lang-json">{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSamlIdentityAssumeRole",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRoleWithSAML",
                "sts:TagSession"
            ],
            "Principal": {
                "Federated": "arn:aws:iam::<a data-footnote-ref href="#user-content-fn-1">123456789012</a>:saml-provider/<a data-footnote-ref href="#user-content-fn-2">ExampleCorpProvider</a>"
            },
            "Condition": {
                "StringLike": {
                    "aws:RequestTag/cost-center": "*",
                    "aws:RequestTag/access-project": "*",
                    "aws:RequestTag/access-team": [
                        "eng",
                        "qas"
                    ]
                },
                "StringEquals": {
                    "SAML:aud": "https://signin.aws.amazon.com/saml"
                }
            }
        }
    ]
}
</code></pre>

</details>

上面的策略中，`AllowSamlIdentityAssumeRole`允许开发（eng）和测试（qas）团队在从`ExampleCorpProvider`单点登录到AWS时，代入角色。`ExampleCorpProvider`传递的属性中，`cost-center`和`access- project`的标签可以是任意值。但是`access-team`的值必须是“eng”或者“qas”表明身份是开发团队或者测试团队的。

## Step 2: 配置SAML IdP

配置你的SAML IdP传递`cost-center`, `access-project` 和 `access-team`属性作为session tags。因此，需要包含以下内容到你的SAML assertion：

```
// SAML assertion
<Attribute Name="http://www.amazonaws.cn/SAML/Attributes/PrincipalTag:cost-center">
  <AttributeValue>987654</AttributeValue>
</Attribute>
<Attribute Name="http://www.amazonaws.cn/SAML/Attributes/PrincipalTag:access-project">
  <AttributeValue>peg</AttributeValue>
</Attribute>
<Attribute Name="http://www.amazonaws.cn/SAML/Attributes/PrincipalTag:access-team">
  <AttributeValue>eng</AttributeValue>
</Attribute>
```

## Step 3: 允许控制台访问

允许SSO SAML用户可以从控制台访问。

## Step 4: 测试效果

从IdP创建的用户（带有session tags与secrets的tag是一样的），是否可以查看secrets。以及测试是否可以更新和删除secrets。

[^1]: 替换成你自己的Account ID

[^2]: 替换成你自己的IdP名字
