1. 这篇文章主要是想记录一下如何通过token本地访问、测试S3而不是直接使用IAM User的Access keys。简而言之就是通过StsClient assumeRole获取临时的credentials然后生成S3Client。
详细的IAM, STS相关的官网文档可以参考这里。
2. 第一步先在这里创建一个IAM User。
1) 输入UserName,并且编程接口,然后下一步直接Next不赋予权限,Tag可以忽略。
2) Review界面如图:
3. 然后创建IAM Role。
1) 输入你的AccountID,并且为了安全,可以输入external ID,这里假设输入的是“Required”,如图:
2) Attach权限,选择“AmazonS3FullAccess”,如图:
3) 输入IAM Role名称,假设这里输入的是“TestUserRoleForS3”,如图:
4) 创建Role之后,就能得到Role ARN,如图:
4. 现在已经给TestUser添加了Role了,那么接下来就是配置TesUser的policy来assume role了。
1) TestUser的Permissions配置的右下角“Add inline policy”,如图:
2) 然后,输入以下的policy并假设命名为“TestUserRoleSTS”,如图:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::123456789101:role/TestUserRoleForS3"
}
]
}
5. 以上配置IAM role使得我们可以通过Sts Client来获取Credentials并且访问S3,具体的代码可以参考:关于应用程序中使用STS切换IAM角色
6. 如果需要授权多个aws account来assume role,修改Trust Relationship里面的Principal。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::abc**********:root",
"arn:aws:iam::123*********:root"
]
},
"Action": "sts:AssumeRole"
}
]
}
注:
1. 如果遇见User is not authorized to perform: iam:PassRole on resource,可能是生成Credentials的时候缺少了external id配置;
2. 如果需要通过cli方式验证结果,可以参考:关于 AWS IAM Role 的最佳实践。
附:
1. Python版本的assume role可以参考:管理对 Amazon S3 资源的访问