简介:事实上在利用 AWS 任何资源之前,都需要为使用者设置相应的权限。AWS 通过 IAM 对资源进行访
目录
IAM 介绍:
AWS Identity and Access Management(IAM)负责控制 AWS 资源的访问,通过控制登录用户以及控制用户的权限来实现其功能。
AWS 用户主要分两大类
AWS account root user:第一次注册 AWS 服务时创建的用户,具有对 AWS 所有资源的访问权限。此用户一般不做为平时的工作用户,而只用来管理部分帐号相关的工作,比如 Billing
AWS IAM user:由 root user 创建的用户,用来做平时具体工作,需要赋予需要的权限。做为 AWS 管理员,一般也不会用 root 用户,而是用 IAM user 进行日常工作。


评估 identity-based policies 和 resource-based policies
identity-based policies 赋予 user、group 或 role,指定它们是否有操作 AWS 资源的权限。
resource-based policies 赋予 AWS 资源,指定 user、group 或 role 可以对自身的 AWS 资源进行操作。
当存在两种 policy 时,总的允许权限是两种 policy 的中允许权限的和,即只要其中一种 policy 允许一个操作,那么总的权限就是允许这个操作。
对于拒绝权限,只要一种 policy 中存在拒绝权限,则即使另一种 policy 中存在允许权限,总的权限也是拒绝。(拒绝权限高于允许权限)
图 3图片
举个例子
AWS 管理员小王(Principal)的帐号“xiaowang001”(Entity)中存在一个 policy(identity-based policies),这个 policy 只允许小王 Put(上传)S3 “bucket1”。(这里简化起见,先不考虑还要 list bucket 的权限)
S3 “bucket1”的 policy(resource-based policies)只允许小王对“bucket1”中对像进行 delete 操作。
这时小王访问 S3 时,在两种 policy 的作用下,小王既可以上传也可以删除 S3 “bucket1”中的对象。
如果小王的用户的 policy 允许对 S3 “bucket1”做 Put(上传),但 S3 “bucket1”的 policy 中禁止小王的用户 Put(上传),则小王没有上传这个 S3 Bucket 的权限。
评估 identity-based policies 和 permissions boundaries
permissions boundaries 的作用是限制权限,两种 policy 在一起的总权限是两种 policy 权限的交集。
identity-based policies 中定义的权限,如果超出了 permissions boundaries 定义的权限,则超出的部分不起作用。
图 4图片
评估 identity-based policies 和 Organizations SCPs
Organizations SCPs 与 permissions boundaries 类似,两种 policy 在一起的总的允许权限是两种 policy 权限的交集。任一 policy 中存在拒绝权限,则总体权限拒绝。
图 5图片
评估 policy 流程(单 AWS Account 内)
account 内部 policy 权限评估流程如下
图 6图片说明:
1.Deny evaluation:默认所有 request 都是拒绝(隐式拒绝)。AWS 评估所有与 request 相关的 policy(Organizations SCPs, resource-based policies, IAM permissions boundaries, role session policies, and identity-based policies),如果在任一 policy 中发现一条拒绝权限,则这个 request 被拒绝掉(显式拒绝),评估流程终止。如果没有发现显式拒绝,则评估流程继续
2.Organizations SCPs:评估流程开始检查 SCP,如果 SCP 中没有发现允许的权限,则 request 被隐式拒绝掉,评估流程终止。如果没有启用 SCP,或者 SCP 中存在允许的权限,则评估流程继续
3.Resource-based policies:如果 request 的 AWS 资源存在 Resource-based policies 并且其中存在允许的权限,则 request 允许执行,评估流程结束,如果 Resource-based policies 中没有允许的权限,则评估流程继续
4.IAM permissions boundaries:AWS 检查 entity(用户、组或 role)是否设置 permissions boundaries。如果其中中没有发现允许的权限,则 request 被隐式拒绝掉,评估流程终止。如果没有启用permissions boundaries,或者其中存在允许的权限,则评估流程继续
5.Session policies:AWS 检查用户是否用 AWS CLi 或者 AWS API 启动了 session。如果 session policy 存在并且其中没有发现允许的权限,则 request 被隐式拒绝掉,评估流程终止。如果没有启用 session policy,或者 session policy 中存在允许的权限,则评估流程继续
6.Identity-based policies:AWS 检查用户及用户所在的组绑定的 policy,如果任一 policy 存在允许的权限,则 request 允许执行,评估流程结束。如果任一 policy 不存在允许的权限,则 request 被隐式拒绝掉,评估流程终止
7.Errors:如果 AWS 在评估流程中发生错误,则产生 exception 并中止
8. identity-based policies 和 resource-based policies 例子
identity-based policies 和 resource-based policies 是平时用的最多的 policy。(之前我们文章中配置的全部是 identity-based policies)
以下例子来自 AWS 官网
假设用户 Carlos 有一个 AWS IAM user “carlossalazar”,用户 Carlos 想存文件到 S3 Bucket “carlossalazar-logs”中
AWS IAM user “carlossalazar”中绑定了如下identity-based policy
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “AllowS3ListRead”, #可选项,内容任意写
“Effect”: “Allow”, #允许下列动作(操作)
“Action”: [
“s3:ListAllMyBuckets”, #列出S3中所有bucket的动作
“s3:HeadBucket” #与ListAllMyBuckets配合使用
],
“Resource”: ““ #通配符是指所有AWS资源,因为Action中的两个动作都是针对S3的,所以这里就是所有S3的资源
},
{
“Sid”: “AllowS3Self”,
“Effect”: “Allow”,
“Action”: “s3:“, #指对S3的所有动作
“Resource”: [
“arn:aws:s3:::carlossalazar/“, #AWS资源为S3 Bucket “carlossalazar”中的所有对象
“arn:aws:s3:::carlossalazar” #AWS资源为S3 Bucket “carlossalazar”
]
},
{
“Sid”: “DenyS3Logs”,
“Effect”: “Deny”, #拒绝下列动作
“Action”: “s3:“,
“Resource”: [
“arn:aws:s3:::log“, #AWS资源为S3 Bucket名称中包含“log”的所有Bucket
“arn:aws:s3:::log/“ #AWS资源为S3 Bucket名称中包含“log”的所有Bucket中的所有对象
]
}
]
}
说明:
Sid:可选项,区分不同的权限语句
Effect:表示允许或者拒绝权限
Action:列出一系列动作(操作)
Resource:对于 identity-based policy,是指可操作的 AWS 资源;对于 resource-based policies 是可选项,没有指定的话,指被绑定这个 policy 的 AWS 资源
“AllowS3ListRead”这段语句允许 IAM user “carlossalazar”列出 S3 中的所有 Buckets 名称
“AllowS3Self”这段语句允许“carlossalazar”对 S3 Bucket “carlossalazar”做所有操作
“The DenyS3Logs”这段语句拒绝“carlossalazar”对 S3 中名称里含有“log”的 Bucket 的任何操作(所以即使“AllowS3ListRead”中允许列出所有 Bucket 名称,实际上“carlossalazar”也看不到含有“log”的 Bucket)
S3 Bucket “carlossalazar”中绑定了如下resource-based policy
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”, #允许
“Action”: “s3:“, #对S3的任何操作
“Principal”: { “AWS”: “arn:aws:iam::111122223333:user/carlossalazar” }, #指定动作允许或拒绝的对像是IAM user “carlossalazar”
“Resource”: ““ #AWS资源S3 Bucket “carlossalazar”
}
]
}
说明:
Principal 只在 resource-based policy 中出现,指定允许或拒绝的用户,role 或联合用户(federated user)
这段语句允许 IAM user “carlossalazar”对 S3 Bucket “carlossalazar”进行任何动作
现在假设没有 permissions boundaries,用户 Carlos 利用 AWS IAM user “carlossalazar”存文件到 S3 Bucket “carlossalazar-logs”中,评估流程如下
图 7图片说明:
因为 identity-based policy 中“The DenyS3Logs”这段语句存在显示拒绝,所以评估结果为拒绝,Carlos 无法上传文件到 Bucket “carlossalazar-logs”
现在用户 Carlos 发现自己搞错了,实际上是想存文件到 S3 Bucket “carlossalazar”中,评估流程如下
图 8图片说明:
两种 policy 中都没有拒绝操作,并且存在允许操作,所以用户 Carlos 存文件到 S3 Bucket “carlossalazar”成功
9. 显式拒绝和隐式拒绝
最后再说一下显式拒绝和隐式拒绝的区别。
如果 request 被拒绝是因为评估时用到的任一 policy 中有一条拒绝的语句,这种情况就是显式拒绝。
对一种操作,如果 policy 中既存在允许语句,又存在拒绝语句,则拒绝高于允许,最终结果为拒绝。
对一种操作,如果 policy 中既没有允许语句,也没有拒绝语句,则最终结果为拒绝,这种就是隐式拒绝。
当设计授权 policy 时,可以综合利用允许、显式拒绝和隐式拒绝
比如可以把下面 identity-based policy 绑定在 Administor group 中,这样所有此 group 下的管理员用户,除了不能访问 billing,有 AWS 的全部权限。
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: ““,
“Resource”: ““
},
{
“Effect”: “Deny”,
“Action”: “aws-portal:“,
“Resource”: ““
}
]
}
可以把下列 polic 赋予给某个用户,让这个用户可以管理用户,但是不能管理 group 和其它 AWS 资源(隐式拒绝)
{
“Version”: “2012-10-17”,
“Statement”: {
“Effect”: “Allow”,
“Action”: [
“iam:AttachUserPolicy”,
“iam:CreateUser”,
“iam:DeleteUser”,
“iam:DeleteUserPolicy”,
“iam:DetachUserPolicy”,
“iam:GetUser”,
“iam:GetUserPolicy”,
“iam:ListAttachedUserPolicies”,
“iam:ListUserPolicies”,
“iam:ListUsers”,
“iam:PutUserPolicy”,
“iam:UpdateUser”
],
“Resource”: ““
}
}
总结
IAM 检查权限的整个过程比较复杂,但是平时使用接触多的一般是 identity-based policy 和 resource-based policy,把这两个弄明白了,基本上可以解决大部分问题。
资源下载
官网 IAM 文档,深入学习必看 https://docs.aws.amazon.com/iam/index.html