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/ComponentDB 的,可以有四個動作
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 結果也是,所以可以確認的是 ResourceCondition 都會影響 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,個別描述,所以最後修改成以下三部分:

  1. 在 EC2 Console 看到所有 EC2
  2. DBA 只能針對 ResourceTag Component=DB 做以下動作:
    • 開機 Start
    • 關機 Stop
    • 重開機 Reboot
  3. 允許針對 所有 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


Comments