ポリシーの構造 - Amazon Elastic Compute Cloud

ポリシーの構造

次のトピックでは、IAM ポリシーの簡単な構造について説明します。

ポリシー構文

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 ポリシーステートメントの例については、「AWS CLI または AWS SDK で使用するサンプルポリシー」を参照してください。

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 の IAM ポリシーを参照してください。

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 リソースネーム (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 ユーザーガイドすべてのリクエストで利用可能な情報を参照してください。

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 条件を参照してください。

すべての Amazon EC2 アクションは、aws:RequestedRegion および ec2:Region 条件キーをサポートします。詳細については、「例: 特定のリージョンへのアクセスの制限」を参照してください。

ec2:SourceInstanceARN 条件キー

ec2:SourceInstanceARN 条件キーは、リクエストの生成元インスタンスの ARN を指定する条件に使用できます。これは、AWS グローバル条件キーであり、サービス固有ではありません。ポリシーの例については、EC2 インスタンス: Amazon EC2 インスタンスへのボリューのアタッチまたはデタッチ例: 特定のインスタンスが他の AWS サービスでリソースを表示できるようにするを参照してください。ec2:SourceInstanceARN キーは、ステートメントの Resource 要素に ARN を入力する変数として使用することはできません。

Amazon EC2 のポリシーステートメントの例については、AWS CLI または AWS SDK で使用するサンプルポリシーを参照してください。

ec2:Attribute 条件キー

ec2:Attribute 条件キーは、リソースの属性によってアクセスをフィルタリングする条件に使用できます。条件キーは、プリミティブデータ型のプロパティ (文字列や整数など)、または [値] のプロパティのみを持つ複雑な AttributeValue オブジェクト (ModifyImageAttribute API アクションの Description または ImdsSupport オブジェクトなど) に使用できます。

重要

条件キーは、ModifyImageAttribute API アクションの 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:ResourceID 条件キーを使用する場合、条件キーの値は、API アクションによって作成される結果のリソースを指定するために使用されます。ec2:ResourceID 条件キーを使用して、API リクエストで指定されたソース リソースを指定することはできません。指定された API で次の ec2:ResourceID 条件キーのいずれかを使用する場合は、常にワイルドカード (*) を指定する必要があります。別の値を指定した場合、条件はランタイム中に常に * に解決されます。例えば、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

これらの API アクションでは ec2:ResourceID 条件キーを使用しないことをお勧めします。代わりに、特定のリソース ID に基づいてアクセスをフィルタリングする必要がある場合は、次のように Resource ポリシー要素を使用してフィルタリングすることをお勧めします。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CopyImage", "Resource": "arn:aws:ec2:us-east-1::image/ami-01234567890abcdef" } ] }

ユーザーが必要なアクセス許可を持っているかどうかの確認

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を参照してください。