Amazon EC2 のアイデンティティベースのポリシー
デフォルトでは、ユーザーには Amazon EC2 リソースを作成または変更、または Amazon EC2 API、Amazon EC2 コンソールあるいは CLI を使用するタスクを実行する許可がありません。ユーザーがリソースを作成または変更、およびタスクを実行できるようにするには、IAM ポリシーを作成する必要があります。これによって、必要な特定のリソースおよび API アクションを使用するための許可をユーザーに付与し、その後、ポリシーをその許可が必要なユーザー、グループまたは IAM ロールにアタッチします。
ポリシーをユーザー、ユーザーのグループ、またはロールにアタッチする場合、ポリシーによって特定リソースの特定タスクを実行するユーザーの許可が許可または拒否されます。IAM ポリシーの一般的な情報については、「IAM ユーザーガイド」の「IAM の許可とポリシー」を参照してください。カスタム IAM ポリシーの管理と作成の詳細については、「IAM ポリシーの管理」を参照してください。
IAM ポリシーは、1 つ以上の Amazon EC2 アクションを使用するアクセス許可を付与または拒否する必要があります。さらに、このアクションで使用できるリソース (すべてのリソースか、場合によっては特定のリソース) も指定する必要があります。このポリシーには、リソースに適用する条件も含めることができます。
最初に、Amazon EC2 の AWS マネージドポリシーがニーズを満たしているかどうかを確認できます。満たしていない場合は、独自のカスタムポリシーを作成できます。詳細については、「Amazon EC2 の AWS マネージドポリシー」を参照してください。
内容
ポリシー構文
IAM ポリシーは 1 つ以上のステートメントで構成される JSON ドキュメントです。各ステートメントは次のように構成されます。
{
"Statement":[{
"Effect":"effect
",
"Action":"action
",
"Resource":"arn
",
"Condition":{
"condition
":{
"key
":"value
"
}
}
}
]
}
ステートメントはさまざまなエレメントで構成されます。
-
Effect: effect は、
Allow
またはDeny
にすることができます。デフォルトでは、 ユーザーはリソースおよび API アクションを使用するアクセス許可がないため、リクエストはすべて拒否されます。明示的な許可はデフォルトに上書きされます。明示的な拒否はすべての許可に優先します。 -
[Action]: action は、アクセス許可を付与または拒否する対象とする、特定の API アクションです。action の指定については、Amazon EC2 のアクションを参照してください。
-
[Resource]: アクションによって影響を及ぼされるリソースです。Amazon EC2 API アクションの中には、アクションによって作成/変更できるリソースをポリシー内で特定できるものもあります。Amazon リソースネーム (ARN) を使用して、またはステートメントがすべてのリソースに適用されることを示すワイルドカード (*) を使用して、リソースを指定します。詳細については、Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可を参照してください。
-
[Condition]: condition はオプションです。ポリシーの発効条件を指定するために使用します。Amazon EC2 の条件を指定する方法については、Amazon EC2 の条件キーを参照してください。
ポリシー要件の詳細については、「IAM ユーザーガイド」の「IAM JSON ポリシーリファレンス」を参照してください。Amazon EC2 の IAM ポリシーステートメントの例については、「Amazon EC2 API へのアクセスを制御するポリシーの例」を参照してください。
Amazon EC2 のアクション
IAM ポリシーステートメントで、IAM をサポートするすべてのサービスから任意の API アクションを指定できます。Amazon EC2 の場合、API アクション ec2:
の名前に次のプレフィクスを使用します。例: ec2:RunInstances
および ec2:CreateImage
。
単一のステートメントに複数のアクションを指定するには、次のようにコンマで区切ります。
"Action": ["ec2:action1", "ec2:action2"]
ワイルドカードを使用して複数のアクションを指定することもできます。例えば、以下のようにDescribeという単語で始まる名前のすべてのアクションを指定できます。
"Action": "ec2:Describe*"
注記
現在、すべての Amazon EC2 Describe* API アクションがリソースレベルのアクセス許可をサポートしているわけではありません。Amazon EC2のリソースレベルの許可の詳細については、Amazon EC2 のアイデンティティベースのポリシーを参照してください。
Amazon EC2 API アクションをすべて指定するには、* ワイルドカードを以下のように使用します。
"Action": "ec2:*"
Amazon EC2 アクションのリストを確認するには、サービス認証リファレンスのAmazon EC2 で定義されるアクションを参照してください。
Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可
リソースレベルのアクセス許可とは、ユーザーがアクションを実行できるリソースを指定できる機能を意味します。Amazon EC2 は、リソースレベルのアクセス許可を部分的にサポートします。これは、特定の Amazon EC2 アクションでは、満たす必要がある条件、またはユーザーが使用できる特定のリソースに基づいて、ユーザーがそれらのアクションをいつ使用できるかを制御できることを意味します。例えば、特定の AMI のみを使用して、特定のタイプのインスタンスだけを起動するアクセス許可をユーザーに付与できます。
IAM ポリシーステートメントでリソースを指定するには、Amazon リソースネーム (ARN) を使用します。ARN 値の指定については、Amazon EC2 用の Amazon リソースネーム (ARN)を参照してください。API アクションが個々の ARN をサポートしていない場合は、ワイルドカード (*) を使用して、アクションによってすべてのリソースが影響を受ける可能性があることを指定する必要があります。
リソースレベルのアクセス許可をサポートする Amazon EC2 API アクション、およびポリシーで使用できる ARN と条件キーがわかる表を見るには、Amazon EC2 のアクション、リソース、および条件キーを参照してください。
Amazon EC2 API アクションに対して使用する IAM ポリシーで、タグベースのリソースレベルアクセス許可を適用できます。これにより、ユーザーがどのリソースを作成、変更、または使用できるかを制御しやすくなります。詳細については、Amazon EC2 リソース作成時にタグ付けするアクセス許可の付与を参照してください。
Amazon EC2 用の Amazon リソースネーム (ARN)
各 IAM ポリシーステートメントは、ARN を使用して指定したリソースに適用されます。
ARN には以下の一般的な構文があります。
arn:aws:[service]:[region]:[account-id]:resourceType/resourcePath
- service
-
サービス (例:
ec2
)。 - region
-
リソースのリージョン (例:
us-east-1
)。 - account-id
-
ハイフンなしの AWS アカウント ID (例:
123456789012
)。 - resourceType
-
リソースの種類 (例:
instance
)。 - resourcePath
-
リソースを識別するパス。パスにワイルドカードの * が使用できます。
例えば、以下のように ARN を使用して、ステートメント内で特定のインスタンス (i-1234567890abcdef0
) を指定することができます。
"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0"
以下のように * ワイルドカードを使用して、特定のアカウントに属するすべてのインスタンスを指定できます。
"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/*"
また、以下のように * ワイルドカードを使用して、特定のアカウントに属するすべての Amazon EC2 リソースを指定することもできます。
"Resource": "arn:aws:ec2:us-east-1:123456789012:*"
すべてのリソースを指定する場合、または特定の API アクションが ARN をサポートしていない場合は、以下のように、Resource
エレメント内で * ワイルドカードを使用します。
"Resource": "*"
Amazon EC2 API アクションの多くが複数のリソースと関連します。例えば、AttachVolume
では Amazon EBS ボリュームをインスタンスにアタッチするため、ユーザーはボリュームおよびインスタンスを使用する許可が必要です。1 つのステートメントで複数のリソースを指定するには、次のように ARN をカンマで区切ります。
"Resource": ["arn1
", "arn2
"]
Amazon EC2 リソースの ARN のリストについては、Amazon EC2 で定義されるリソースタイプを参照してください。
Amazon EC2 の条件キー
ポリシーステートメントでは、オプションで有効になるタイミングを制御する条件を指定できます。各条件には 1 つ以上のキーと値のペアが含まれます。条件キーは大文字小文字を区別しません。AWS グローバル条件キーに加え、追加のサービス固有の条件キーも定義されています。
Amazon EC2 のサービス固有の条件キーのリストについては、Amazon EC2 の条件キーを参照してください。Amazon EC2 では、AWS グローバル条件キーも実装されています。詳細については、IAM ユーザーガイドのすべてのリクエストで利用可能な情報を参照してください。
すべての Amazon EC2 アクションは、aws:RequestedRegion
および ec2:Region
条件キーをサポートします。詳細については、「例: 特定のリージョンへのアクセスの制限」を参照してください。
IAM ポリシーで条件キーを使用するには、Condition
ステートメントを使用します。例えば、次のポリシーは、セキュリティグループのインバウンドルールとアウトバウンドルールを追加および削除するアクセス許可をユーザーに付与します。ec2:Vpc
条件キーを使用して、これらのアクションを実行できる対象は、特定の VPC 内のセキュリティグループに限ることを指定します。
{ "Version": "2012-10-17", "Statement":[{ "Effect":"Allow", "Action": [ "ec2:AuthorizeSecurityGroupIngress", "ec2:AuthorizeSecurityGroupEgress", "ec2:RevokeSecurityGroupIngress", "ec2:RevokeSecurityGroupEgress"], "Resource": "arn:aws:ec2:region:account:security-group/*", "Condition": { "StringEquals": { "ec2:Vpc": "arn:aws:ec2:region:account:vpc/vpc-11223344556677889" } } } ] }
複数の条件、または単一の条件に複数のキーを指定する場合、論理 AND 演算を使用してそれらを評価します。1 つのキーに複数の値を使用して単一の条件を指定する場合、論理 OR 演算を使用して条件を評価します。アクセス許可が付与されるには、すべての条件を満たしている必要があります。
条件を指定する際にプレースホルダーも使用できます。詳細については、IAM ユーザーガイドのIAM ポリシーエレメント: 変数およびタグを参照してください。
重要
多くの条件キーはリソースに固有のものであり、一部の API アクションでは複数のリソースを使用します。条件キーを使用してポリシーを作成する場合は、ポリシーステートメントの Resource
要素で、条件キーが適用されるリソースを指定します。指定しない場合、そのポリシーはユーザーに対してすべてのアクションの実行を禁止します。これは、条件キーが適用されないリソースに対して条件チェックが失敗するためです。リソースを指定しない場合や、ポリシーの Action
要素に複数の API アクションを含めている場合は、...IfExists
条件タイプを使用して、条件キーが適用されないリソースに対して無視されるようにする必要があります。詳細については、IAM ユーザーガイドの..IfExists 条件を参照してください。
ec2:Attribute 条件キー
ec2:Attribute
条件キーは、リソースの属性によってアクセスをフィルタリングする条件に使用できます。
この条件キーは、プリミティブデータ型のプロパティ (文字列や整数など)、または [値] のプロパティのみを含む複雑な AttributeValue オブジェクト (ModifyImageAttribute API アクションの Description または ImdsSupport オブジェクトなど) に使用できます。条件キーは、ModifyImageAttribute の LaunchPermission オブジェクトなど、複数のプロパティを含む複雑なオブジェクトには使用できません。
例えば、次のポリシーでは、ModifyImageAttributeAPI アクションの複雑な Description オブジェクトによるアクセスをフィルタリングするために ec2:Attribute/Description
条件キーを使用します。条件キーは、イメージの説明を Production
または Development
のいずれかに変更するリクエストのみを許可します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:ModifyImageAttribute", "Resource": "arn:aws:ec2:us-east-1::image/ami-*", "Condition": { "StringEquals": { "ec2:Attribute/Description": [ "Production", "Development" ] } } } ] }
次のポリシー例では、ModifyImageAttribute API アクションのプリミティブな Attribute プロパティによるアクセスをフィルタリングするために ec2:Attribute
条件キーを使用します。この条件キーは、イメージの説明を変更しようとするすべてのリクエストを拒否します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:ModifyImageAttribute", "Resource": "arn:aws:ec2:us-east-1::image/ami-*", "Condition": { "StringEquals": { "ec2:Attribute": "Description" } } } ] }
ec2:ResourceID 条件キー
指定された API アクションで次の ec2:
条件キーを使用する場合、条件キーの値は、API アクションによって作成される結果のリソースを指定するために使用されます。Resource
IDec2:
条件キーを使用して、API リクエストで指定されたソース リソースを指定することはできません。指定された API で次の Resource
IDec2:
条件キーのいずれかを使用する場合は、常にワイルドカード (Resource
ID*
) を指定する必要があります。別の値を指定した場合、条件はランタイム中に常に *
に解決されます。例えば、CopyImage API で ec2:ImageId
条件キーを使用するには、次のように条件キーを指定する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CopyImage", "Resource": "arn:aws:ec2:us-east-1::image/ami-*", "Condition": { "StringEquals": { ec2:ImageID": "*" } } } ] }
これらの API アクションではこれらの条件キーを使用しないことをお勧めします。
-
ec2:DhcpOptionsID
–CreateDhcpOptions
-
ec2:ImageID
–CopyImage
、CreateImage
、ImportImage
、RegisterImage
-
ec2:InstanceID
–RunInstances
およびImportInstance
-
ec2:InternetGatewayID
–CreateInternetGateway
-
ec2:NetworkAclID
–CreateNetworkAcl
-
ec2:NetworkInterfaceID
–CreateNetworkInterface
-
ec2:PlacementGroupName
–CreatePlacementGroup
-
ec2:RouteTableID
–CreateRouteTable
-
ec2:SecurityGroupID
–CreateSecurityGroup
-
ec2:SnapshotID
–CopySnapshot
、CreateSnapshot
、CreateSnapshots
、ImportSnapshots
-
ec2:SubnetID
–CreateSubnet
-
ec2:VolumeID
–CreateVolume
およびImportVolume
-
ec2:VpcID
–CreateVpc
-
ec2:VpcPeeringConnectionID
–CreateVpcPeeringConnection
特定のリソース ID に基づいてアクセスをフィルタリングするには、次のように Resource
ポリシー要素を使用することをお勧めします。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CopyImage", "Resource": "arn:aws:ec2:us-east-1::image/ami-01234567890abcdef" } ] }
ec2:SourceInstanceARN 条件キー
ec2:SourceInstanceARN
を使用して、リクエスト元のインスタンスの ARN を指定します。これは AWS グローバル条件キーであり、Amazon EC2 以外のサービスで使用できるということです。ポリシーの例については、「例: 特定のインスタンスが他の AWS サービスでリソースを表示できるようにする」を参照してください。
属性ベースのアクセスを使用するアクセスの制御
EC2 リソースを使用するための許可をユーザーに付与する IAM ポリシーを作成する場合、ポリシーの Condition
要素にタグ情報を含めることで、タグに基づいてアクセスをコントロールできます。これは、属性ベースのアクセス制御 (ABAC) と呼ばれます。ABAC を使用すると、ユーザーが変更、使用、または削除できるリソースをより適切に制御できます。詳細については、AWS の ABAC とはを参照してください。
例えば、インスタンスを終了することをユーザーに許可するが、インスタンスに environment=production
タグが付いている場合はアクションを拒否するポリシーを作成できます。これを行うには、aws:ResourceTag
条件キーを使用し、リソースにアタッチされているタグに基づいてリソースへのアクセスを許可または拒否します。
"StringEquals": { "aws:ResourceTag/environment": "production" }
Amazon EC2 API アクションが aws:ResourceTag
条件キーを使用したアクセスの制御をサポートしているかどうかについては、Amazon EC2 のアクション、リソース、および条件キーを参照してください。Describe
アクションはリソースレベルのアクセス権限をサポートしないため、条件のない別のステートメントでそれらのアクセス権限を指定する必要があることに注意してください。
IAM ポリシーの例は、Amazon EC2 API へのアクセスを制御するポリシーの例を参照してください。
タグに基づいてリソースへのユーザーのアクセスを許可または拒否する場合は、ユーザーが同じリソースに対してそれらのタグを追加または削除することを明示的に拒否することを検討する必要があります。そうしないと、ユーザーはそのリソースのタグを変更することで、制限を回避してリソースにアクセスできてしまいます。
ユーザー、グループ、およびロールに許可を付与する
アクセス権限を付与するには、ユーザー、グループ、またはロールにアクセス許可を追加します。
-
AWS IAM Identity Center のユーザーとグループ:
アクセス許可セットを作成します。「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成する」の手順に従ってください。
-
IAM 内で、ID プロバイダーによって管理されているユーザー:
ID フェデレーションのロールを作成します。詳細については、「IAM ユーザーガイド」の「サードパーティー ID プロバイダー (フェデレーション) 用のロールの作成」を参照してください。
-
IAM ユーザー:
-
ユーザーが担当できるロールを作成します。手順については、「IAM ユーザーガイド」の「IAM ユーザー用ロールの作成」を参照してください。
-
(お奨めできない方法) ポリシーをユーザーに直接アタッチするか、ユーザーをユーザーグループに追加する。詳細については、「IAM ユーザーガイド」の「ユーザー (コンソール) へのアクセス権限の追加」を参照してください。
-
ユーザーが必要なアクセス許可を持っているかどうかの確認
IAM ポリシーを作成したら、ポリシーを本稼働環境に置く前に、そのポリシーがユーザーに特定の API アクションおよび必要なリソースを使用するアクセス許可を付与しているかどうかを確認することをお勧めします。
まずテスト目的のユーザーを作成し、作成した IAM ポリシーをテストユーザーにアタッチします。次に、テストユーザーとしてリクエストを作成します。
テスト中の Amazon EC2 アクションがリソースを作成または変更する場合、DryRun
パラメータ を使用してリクエストを作成する (または AWS CLI オプションで --dry-run
コマンドを実行する) 必要があります。この場合、発信者は認証チェックを行いますが、操作は完了しません。例えば、実際に終了させることなく、ユーザーが特定のインスタンスを終了できるかどうかを確認できます。テストユーザーに必要なアクセス許可がある場合、リクエストで DryRunOperation
が返されます。必要なアクセス許可がない場合は UnauthorizedOperation
が返されます。
ポリシーが想定したアクセス許可をユーザーに付与していない場合、または過度に許可されている場合、必要に応じてポリシーを調整し、必要な結果を得るまで再テストできます。
重要
ポリシーの変更が反映され、有効になるには数分間かかります。したがって、ポリシーの更新をテストするには 5 分かかると見ておいてください。
認証チェックが失敗した場合、リクエストでは診断情報でエンコードされたメッセージが返されます。DecodeAuthorizationMessage
アクションを使用してメッセージをデコードできます。詳細については、AWS Security Token Service API リファレンス のDecodeAuthorizationMessage、およびAWS CLI コマンドリファレンスのdecode-authorization-messageを参照してください。