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
 

QQ咨询