Amazon EC2 APIのサポートされていないリソースレベルのアクセス許可について

IAM

はじめに

オペレーションチームの高橋です。

Amazon EC2 APIの多くはリソースレベルでのアクセス許可制限が可能です。
しかしながらリソールレベルのアクセス許可がサポートされていないアクションもあります。
サポートされていないアクションは見落としがちです。
今回は、リソースレベルのアクセス許可でサポートされていないアクションを指定した場合のIAMポリシー作成時のエラー内容と回避策をご紹介します。

作成するIAMポリシー

例として以下IAMポリシーを作成します。

  • Resources:特定のEC2インスタンス
  • Actions:EC2インスタンスの停止、起動、再起動、AMIの作成
  • Effect: 許可

エラーになるIAMポリシー

「Policy Generator」で以下IAMポリシーを作成したとします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt000",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:CreateImage",
                "ec2:CreateSnapshot",
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:<aws account id>:instance/<instance id>"
            ]
        }
    ]
}

問題ないように見えますがこの中にリソースレベルでのアクセス許可がサポートされていないアクションがあります。
そのため、リソースレベルでサポートされていないアクションを実行すると「You are not authorized to perform this operation.」とエラーが発生します。

1
2
3
$ aws ec2 create-image --no-reboot --name "backup-${today}-${instance-id}" --instance-id ${instance-id}
 
An error occurred (UnauthorizedOperation) when calling the CreateImage operation: You are not authorized to perform this operation.

修正後のIAMポリシー

リソースレベルのアクセス許可がサポートされているアクションとサポートされていないアクションでStatementを分けて作成します。

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
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt000",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateImage",
                "ec2:CreateSnapshot",
                "ec2:Describe*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "Stmt001",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:<aws account id>:instance/<instance id>"
            ]
        }
    ]
}

リソースレベルでサポートされているアクション

  • RebootInstances
  • StartInstances
  • StopInstances

これらのアクションはリソースレベルでのアクセス許可が可能ですので「Resource element」を使用して制御します。

1
2
3
4
5
6
7
8
9
10
11
12
{
            "Sid": "Stmt001",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:<aws account id>:instance/<instance id>"
            ]
        }

リソースレベルレベルでサポートされていないアクション

  • CreateSnapshot
  • CreateImage
  • Describe*

これらのアクションはリソースレベルでのアクセス許可がサポートされていません。
そのため「Resource element」は「*」で対応しないとなりません。

1
2
3
4
5
6
7
8
9
10
11
12
{
    "Sid": "Stmt000",
    "Effect": "Allow",
    "Action": [
        "ec2:CreateImage",
        "ec2:CreateSnapshot",
        "ec2:Describe*"
    ],
    "Resource": [
        "*"
    ]
},

リソールレベルでの制御がサポートされていないアクション一覧

現時点で以下のアクションに対してはリソースレベルでの制御が許可されていません。
そのため、先ほどのIAMポリシーのように「Resource element」は「*」で対応します。

Granting IAM Users Required Permissions for Amazon EC2 Resources | Unsupported Resource-Level Permissions

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
AcceptReservedInstancesExchangeQuote
AllocateAddress
AllocateHosts
AssignIpv6Addresses
AssignPrivateIpAddresses
AssociateAddress
AssociateDhcpOptions
AssociateRouteTable
AssociateSubnetCidrBlock
AssociateVpcCidrblock
AttachInternetGateway
AttachNetworkInterface
AttachVpnGateway
BundleInstance
CancelBundleTask
CancelConversionTask
CancelExportTask
CancelImportTask
CancelReservedInstancesListing
CancelSpotFleetRequests
CancelSpotInstanceRequests
ConfirmProductInstance
CopyImage
CopySnapshot
CreateCustomerGateway
CreateDefaultVpc
CreateDhcpOptions
CreateEgressOnlyInternetGateway
CreateFlowLogs
CreateFpgaImage
CreateImage
CreateInstanceExportTask
CreateInternetGateway
CreateKeyPair
CreateNatGateway
CreateNetworkAcl
CreateNetworkAclEntry
CreateNetworkInterface
CreateNetworkInterfacePermission
CreatePlacementGroup
CreateReservedInstancesListing
CreateRoute
CreateRouteTable
CreateSecurityGroup
CreateSnapshot
CreateSpotDatafeedSubscription
CreateSubnet
CreateVpc
CreateVpcEndpoint
CreateVpnConnection
CreateVpnConnectionRoute
CreateVpnGateway
DeleteEgressOnlyInternetGateway
DeleteFlowLogs
DeleteKeyPair
DeleteNatGateways
DeleteNetworkInterface
DeleteNetworkInterfacePermission
DeletePlacementGroup
DeleteSnapshot
DeleteSpotDatafeedSubscription
DeleteSubnet
DeleteVpc
DeleteVpcEndpoints
DeleteVpnConnection
DeleteVpnConnectionRoute
DeleteVpnGateway
DeregisterImage
DescribeAccountAttributes
DescribeAddresses
DescribeAvailabilityZones
DescribeBundleTasks
DescribeClassicLinkInstances
DescribeConversionTasks
DescribeCustomerGateways
DescribeDhcpOptions
DescribeEgressOnlyInternetGateways
DescribeElasticGpus
DescribeExportTasks
DescribeFlowLogs
DescribeFpgaImages
DescribeHosts
DescribeIamInstanceProfileAssociations
DescribeIdentityIdFormat
DescribeIdFormat
DescribeImageAttribute
DescribeImages
DescribeImportImageTasks
DescribeImportSnapshotTasks
DescribeInstanceAttribute
DescribeInstances
DescribeInstanceStatus
DescribeInternetGateways
DescribeKeyPairs
DescribeMovingAddresses
DescribeNatGateways
DescribeNetworkAcls
DescribeNetworkInterfaceAttribute
DescribeNetworkInterfacePermissions
DescribeNetworkInterfaces
DescribePlacementGroups
DescribePrefixLists
DescribeRegions
DescribeReservedInstances
DescribeReservedInstancesListings
DescribeReservedInstancesModifications
DescribeReservedInstancesOfferings
DescribeRouteTables
DescribeScheduledInstanceAvailability
DescribeScheduledInstances
DescribeSecurityGroupReferences
DescribeSecurityGroups
DescribeSnapshotAttribute
DescribeSnapshots
DescribeSpotDatafeedSubscription
DescribeSpotFleetInstances
DescribeSpotFleetRequestHistory
DescribeSpotFleetRequests
DescribeSpotInstanceRequests
DescribeSpotPriceHistory
DescribeStaleSecurityGroups
DescribeSubnets
DescribeTags
DescribeVolumeAttribute
DescribeVolumes
DescribeVolumesModifications
DescribeVolumeStatus
DescribeVpcAttribute
DescribeVpcClassicLink
DescribeVpcClassicLinkDnsSupport
DescribeVpcEndpoints
DescribeVpcEndpointServices
DescribeVpcPeeringConnections
DescribeVpcs
DescribeVpnConnections
DescribeVpnGateways
DetachInternetGateway
DetachNetworkInterface
DetachVpnGateway
DisableVgwRoutePropagation
DisableVpcClassicLinkDnsSupport
DisassociateAddress
DisassociateRouteTable
DisassociateSubnetCidrBlock
DisassociateVpcCidrBlock
EnableVgwRoutePropagation
EnableVolumeIO
EnableVpcClassicLinkDnsSupport
GetConsoleOutput
GetHostReservationPurchasePreview
GetPasswordData
GetReservedInstancesExchangeQuote
ImportImage
ImportInstance
ImportKeyPair
ImportSnapshot
ImportVolume
ModifyHosts
ModifyIdentityIdFormat
ModifyIdFormat
ModifyImageAttribute
ModifyInstanceAttribute
ModifyInstancePlacement
ModifyNetworkInterfaceAttribute
ModifyReservedInstances
ModifySnapshotAttribute
ModifySpotFleetRequest
ModifySubnetAttribute
ModifyVolume
ModifyVolumeAttribute
ModifyVpcAttribute
ModifyVpcEndpoint
ModifyVpcPeeringConnectionOptions
MonitorInstances
MoveAddressToVpc
PurchaseHostReservation
PurchaseReservedInstancesOffering
PurchaseScheduledInstances
RegisterImage
ReleaseAddress
ReleaseHosts
ReplaceNetworkAclAssociation
ReplaceNetworkAclEntry
ReplaceRoute
ReplaceRouteTableAssociation
ReportInstanceStatus
RequestSpotFleet
RequestSpotInstances
ResetImageAttribute
ResetInstanceAttribute
ResetNetworkInterfaceAttribute
ResetSnapshotAttribute
RestoreAddressToClassic
RunScheduledInstances
UnassignIpv6Addresses
UnassignPrivateIpAddresses
UnmonitorInstances

まとめ

今回はAMIの作成を許可するポリシーを例に、リソースレベルのアクセス許可がサポートされているアクション、
されていないアクションのご紹介や、対応方法についてご紹介しました。

参考URL

Granting IAM Users Required Permissions for Amazon EC2 Resources Demystifying EC2 Resource-Level Permissions

ではまた。