说到权限的本质,其实是形容某个个体(Principal)在某些情况下(Condition)能或不能(Effect)对某些资源(Resource)做某些动作(Action),在IAM中被称为一句策略声明(Policy Statement),而一个策略则可以包括若干句Statement。也就是说,IAM系统中的权限(permission)是由一条条策略相互组合作用而来的。我们先来看一条例policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListForConsole",
"Effect": "Allow",
"Action": "sqs:ListQueues",
"Resource": "*"
},
{
"Sid": "AllQueueActions",
"Effect": "Allow",
"Action": "sqs:*",
"Resource": "arn:aws:sqs:us-east-2:*:${aws:username}-queue",
"Condition": {"StringLike": {"sns:endpoint": "https://example.com/${aws:username}/*"}}
}
]
}
可以看出来policy是一个JSON的object,包括两个key:Version和Statement。Version这里指的是Policy的格式是哪个版本,虽然目前只有这一版。而Statement则是之前提到的若干策略声明,没个声明又包括了若干常见的key:Sid,Effect,Action,Resource和Condition。Sid并没有什么实际作用,一般来说会形容此声明是干什么的,或者就是一个唯一的ID来方便索引,比如这里的”ListForConsole“即是说这个声明可以在web console中罗列sqs资源。Effect应该很好猜了,就是可以(Allow)或者不可以(Deny)。Action在这里可以看作是具体的操作,一般可分为Read,List,Write,Tagging和Permission Management(先跳过),及很常见的对于资源的访问,比如这里的“sqs:ListQueues"便是“列出SQS队列们”,而这个冒号👈前缀及指明了服务的类型sqs。Resource也是必不可少的一个key,因为不管做什么Action都要有对应的受体,即使是任意受体也要指明”*“,而这里的第二句Statement便具体了很多,指明了只有在us-east-2地区的所有账户中的以”用户名-queue“命名的所有sqs资源。Condition描述了这个Statement的触发条件,比如名字匹配某个pattern,日期先后,或者某个数字等于几时才考虑此声明,若没有添加Condition,则是一定触发。