Amazon EC2 APIのサポートされていないリソースレベルのアクセス許可について
はじめに
オペレーションチームの高橋です。
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」は「*」で対応します。
| 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 | AcceptReservedInstancesExchangeQuoteAllocateAddressAllocateHostsAssignIpv6AddressesAssignPrivateIpAddressesAssociateAddressAssociateDhcpOptionsAssociateRouteTableAssociateSubnetCidrBlockAssociateVpcCidrblockAttachInternetGatewayAttachNetworkInterfaceAttachVpnGatewayBundleInstanceCancelBundleTaskCancelConversionTaskCancelExportTaskCancelImportTaskCancelReservedInstancesListingCancelSpotFleetRequestsCancelSpotInstanceRequestsConfirmProductInstanceCopyImageCopySnapshotCreateCustomerGatewayCreateDefaultVpcCreateDhcpOptionsCreateEgressOnlyInternetGatewayCreateFlowLogsCreateFpgaImageCreateImageCreateInstanceExportTaskCreateInternetGatewayCreateKeyPairCreateNatGatewayCreateNetworkAclCreateNetworkAclEntryCreateNetworkInterfaceCreateNetworkInterfacePermissionCreatePlacementGroupCreateReservedInstancesListingCreateRouteCreateRouteTableCreateSecurityGroupCreateSnapshotCreateSpotDatafeedSubscriptionCreateSubnetCreateVpcCreateVpcEndpointCreateVpnConnectionCreateVpnConnectionRouteCreateVpnGatewayDeleteEgressOnlyInternetGatewayDeleteFlowLogsDeleteKeyPairDeleteNatGatewaysDeleteNetworkInterfaceDeleteNetworkInterfacePermissionDeletePlacementGroupDeleteSnapshotDeleteSpotDatafeedSubscriptionDeleteSubnetDeleteVpcDeleteVpcEndpointsDeleteVpnConnectionDeleteVpnConnectionRouteDeleteVpnGatewayDeregisterImageDescribeAccountAttributesDescribeAddressesDescribeAvailabilityZonesDescribeBundleTasksDescribeClassicLinkInstancesDescribeConversionTasksDescribeCustomerGatewaysDescribeDhcpOptionsDescribeEgressOnlyInternetGatewaysDescribeElasticGpusDescribeExportTasksDescribeFlowLogsDescribeFpgaImagesDescribeHostsDescribeIamInstanceProfileAssociationsDescribeIdentityIdFormatDescribeIdFormatDescribeImageAttributeDescribeImagesDescribeImportImageTasksDescribeImportSnapshotTasksDescribeInstanceAttributeDescribeInstancesDescribeInstanceStatusDescribeInternetGatewaysDescribeKeyPairsDescribeMovingAddressesDescribeNatGatewaysDescribeNetworkAclsDescribeNetworkInterfaceAttributeDescribeNetworkInterfacePermissionsDescribeNetworkInterfacesDescribePlacementGroupsDescribePrefixListsDescribeRegionsDescribeReservedInstancesDescribeReservedInstancesListingsDescribeReservedInstancesModificationsDescribeReservedInstancesOfferingsDescribeRouteTablesDescribeScheduledInstanceAvailabilityDescribeScheduledInstancesDescribeSecurityGroupReferencesDescribeSecurityGroupsDescribeSnapshotAttributeDescribeSnapshotsDescribeSpotDatafeedSubscriptionDescribeSpotFleetInstancesDescribeSpotFleetRequestHistoryDescribeSpotFleetRequestsDescribeSpotInstanceRequestsDescribeSpotPriceHistoryDescribeStaleSecurityGroupsDescribeSubnetsDescribeTagsDescribeVolumeAttributeDescribeVolumesDescribeVolumesModificationsDescribeVolumeStatusDescribeVpcAttributeDescribeVpcClassicLinkDescribeVpcClassicLinkDnsSupportDescribeVpcEndpointsDescribeVpcEndpointServicesDescribeVpcPeeringConnectionsDescribeVpcsDescribeVpnConnectionsDescribeVpnGatewaysDetachInternetGatewayDetachNetworkInterfaceDetachVpnGatewayDisableVgwRoutePropagationDisableVpcClassicLinkDnsSupportDisassociateAddressDisassociateRouteTableDisassociateSubnetCidrBlockDisassociateVpcCidrBlockEnableVgwRoutePropagationEnableVolumeIOEnableVpcClassicLinkDnsSupportGetConsoleOutputGetHostReservationPurchasePreviewGetPasswordDataGetReservedInstancesExchangeQuoteImportImageImportInstanceImportKeyPairImportSnapshotImportVolumeModifyHostsModifyIdentityIdFormatModifyIdFormatModifyImageAttributeModifyInstanceAttributeModifyInstancePlacementModifyNetworkInterfaceAttributeModifyReservedInstancesModifySnapshotAttributeModifySpotFleetRequestModifySubnetAttributeModifyVolumeModifyVolumeAttributeModifyVpcAttributeModifyVpcEndpointModifyVpcPeeringConnectionOptionsMonitorInstancesMoveAddressToVpcPurchaseHostReservationPurchaseReservedInstancesOfferingPurchaseScheduledInstancesRegisterImageReleaseAddressReleaseHostsReplaceNetworkAclAssociationReplaceNetworkAclEntryReplaceRouteReplaceRouteTableAssociationReportInstanceStatusRequestSpotFleetRequestSpotInstancesResetImageAttributeResetInstanceAttributeResetNetworkInterfaceAttributeResetSnapshotAttributeRestoreAddressToClassicRunScheduledInstancesUnassignIpv6AddressesUnassignPrivateIpAddressesUnmonitorInstances | 
まとめ
今回はAMIの作成を許可するポリシーを例に、リソースレベルのアクセス許可がサポートされているアクション、
されていないアクションのご紹介や、対応方法についてご紹介しました。
参考URL
Granting IAM Users Required Permissions for Amazon EC2 Resources Demystifying EC2 Resource-Level Permissions
ではまた。