# 第三方访问您的AWS资源

## 简介

有时候，你需要给予外包的第三方厂商授予访问和使用AWS资源的权限。你可以通过在condition中指定*External ID*来指定谁可以使用你创建出来的IAM role。

这个ID是第三方随机生成的一串字符。因此，在配置IAM role的时候需要第三方提供一个*External ID* 。

## 举例

假设你有个供应商叫Example公司，这家公司还服务很多其他的使用AWS的企业。你不应该给它IAM user，这是在AWS账号中一个长期有效的权限。相反，你应该使用IAM role。创建一个role，role关联的policy假设如下所示

<pre><code>// sample code
<strong>{
</strong>    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "externalid",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DescribeInstances",
                "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
                "ec2:DescribeSecurityGroups",
                "ec2:UpdateSecurityGroupRuleDescriptionsIngress"
            ],
            "Resource": "*"
        }
    ]
}
</code></pre>

假设Example公司提供了他们的*External ID：*

"Condition": {"StringEquals": {"sts:ExternalId": "<mark style="color:red;">Unique ID Assigned by Example Corp</mark>"}}

你可以将上面的policy调整为：

```
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "externalid",
			"Effect": "Allow",
			"Action": [
				"ec2:CreateTags",
				"ec2:DescribeInstances",
				"ec2:UpdateSecurityGroupRuleDescriptionsEgress",
				"ec2:DescribeSecurityGroups",
				"ec2:UpdateSecurityGroupRuleDescriptionsIngress",
				"sts:AssumeRole"
			],
			"Resource": "*",
			"Condition": {
				"StringEquals": {
					"sts:ExternalId": [
						"Unique ID Assigned by Example Corp"
					]
				}
			}
		}
	]
}
```

创建完成以后你把role的Amazon Resource Name (ARN)提供给Example公司，当Example Corp需要访问你的AWS资源时，该公司的人就会调用AWS sts:AssumeRole API。该调用包括要角色的ARN和*External ID*参数。

这样，任何想assume该角色的人必须是该角色的负责人，并且必须包括正确的*External ID*。

## 参考资料

\[docs] [How to use an external ID when granting access to your AWS resources to a third party](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)
