AWS IAM – EC2 Supported Resource-Level Permissions
利用 IAM Policy、以及 EC2 ResourceTag 限制權限,像是只有 DBA 可以針對 DB 機器做動作。
需求:用 ResourceTag 限制特定的 Actions
這個例子是 設定讓 DBA 可以 :
- 在 EC2 Console 看到所有 EC2
- DBA 只能針對 ResourceTag
Component=DB
做以下動作:- 開機 Start
- 關機 Stop
- 重開機 Reboot
- 允許更改 EC2 Instance Type
一開始我是這樣設定的, 有兩段 Statement:
- 第一段就是允許在 EC2 Console 看到所有資源
- 第二段就是針對條件
ec2:ResourceTag/Component
是DB
的,可以有四個動作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
{
“Version“: “2012-10-17″,
“Statement“: [
{
“Action“: [
“ec2:Describe*”,
“cloudwatch:Describe*”,
“cloudwatch:Get*”,
“cloudwatch:List*”,
“elasticloadbalancing:Describe*”
],
“Effect“: “Allow”,
“Resource“: “*”
},
{
“Action“: [
“ec2:StopInstances”,
“ec2:StartInstances”,
“ec2:RebootInstances”,
“ec2:ModifyInstanceAttribute”
],
“Condition“: {
“StringEquals“: {
“ec2:ResourceTag/Component“: [
“DB”
]
}
},
“Effect“: “Allow”,
“Resource“: “*”
}
]
}
|
看起來很美好。但實際上結果是:
以下這些 action 可以:
- ec2:StopInstances
- ec2:StartInstances
- ec2:RebootInstances
以下這些 action 不可以 :
- ec2:ModifyInstanceAttribute
所以 DBA 就不能修改 instance type. 開始限縮範圍找問題。
實驗一:指定 Resource 的 ARN
指定 Resource ANR, EC2 instance 的 ARN 格式是:
1
|
arn:aws:ec2:region:account-id:instance/instance-id
|
更改 Policy 如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
{
“Sid“: “Stmt1461734145000″,
“Effect“: “Allow”,
“Action“: [
“ec2:ModifyInstanceAttribute”,
“ec2:StartInstances”,
“ec2:StopInstances”
],
“Resource“: [
“arn:aws:ec2:us-west-1:12345678899:instance/i-12345678″
]
}
|
結果:
- ec2:StopInstances – ok
- ec2:StartInstances – ok
- ec2:ModifyInstanceAttribute – fail
更改 ARN: arn:aws:ec2:us-west-1:12345678899:instance/*
,這樣應該等於 *
,但結果還是一樣:
實驗二:確認 ModifyInstanceAttribute 是否能正確執行
問題出在 ModifyInstanceAttribute
這個動作,所以重新確認這個是不是跟 Instance Type
有關係。從 ModifyInstanceAttribute 可以找到 InstanceType
。
重新確認動作,先移走 Resource
ARN 的指定,如下:
1
2
3
4
5
6
7
8
9
10
|
{
“Sid“: “Stmt1461734145000″,
“Effect“: “Allow”,
“Action“: [
“ec2:ModifyInstanceAttribute”,
“ec2:StartInstances”,
“ec2:StopInstances”
],
“Resource“: “*”
}
|
結果:
- ec2:StopInstances – ok
- ec2:StartInstances – ok
- ec2:ModifyInstanceAttribute – ok
類似的,增加 Condition
結果也是,所以可以確認的是 Resource
、Condition
都會影響 ModifyInstanceAttribute
.
最後找到這個討論:Granting IAM users permission to change instance’s names (AWS Forums),然後找到這篇文件:Granting IAM Users Required Permissions for Amazon EC2 Resources,描述了 Resource 的限制,分成兩種:
- Supported Resource-Level Permissions: 哪一些 Action 支援 ARN 權限控管,不多,而且 ARM 也有限制。
- Unsupported Resource-Level Permissions: 哪一些 Action 不支援 Resource 權限控管,超多!!!
所以 ModifyInstanceAttribute
是不支援的 Resource-Level,所以前述寫法都不行。
Finally
ModifyInstanceAttribute
不支援的 Resource-Level,所以就要拆開 Statement,個別描述,所以最後修改成以下三部分:
- 在 EC2 Console 看到所有 EC2
- DBA 只能針對 ResourceTag
Component=DB
做以下動作:- 開機 Start
- 關機 Stop
- 重開機 Reboot
- 允許針對
所有 EC2
可以更改 Instance Type
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
{
“Version“: “2012-10-17″,
“Statement“: [
{
“Action“: [
“ec2:Describe*”,
“cloudwatch:Describe*”,
“cloudwatch:Get*”,
“cloudwatch:List*”,
“elasticloadbalancing:Describe*”
],
“Effect“: “Allow”,
“Resource“: “*”
},
{
“Action“: [
“ec2:StopInstances”,
“ec2:StartInstances”,
“ec2:RebootInstances”
],
“Condition“: {
“StringEquals“: {
“ec2:ResourceTag/Component“: [
“DB”
]
}
},
“Effect“: “Allow”,
“Resource“: “*”
},
{
“Action“: [
“ec2:ModifyInstanceAttribute”
],
“Effect“: “Allow”,
“Resource“: “*”
}
]
}
|
Reference
- AWS Service Actions and Condition Context Keys for Use in IAM Policies
- AWS Forums: Granting IAM users permission to change instance’s names
- AWS Security Blog: Demystifying EC2 Resource-Level Permissions
- AWS IAM JavaScript SDK
- Amazon Resource Names (ARNs) and AWS Service Namespaces
- Granting IAM Users Required Permissions for Amazon EC2 Resources