AWS Identity and Access Management
ユーザーガイド

IAM ポリシーエレメント: 変数

イントロダクション

IAM ポリシーでは、アクセスを制御する特定のリソースに対して名前を指定することが多くのアクセションで許可されています。たとえば、以下のポリシーでは、Amazon S3 バケット mybucket 内のプレフィックス David が付いたオブジェクトの一覧表示、読み取り、および書き込みが許可されます。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["David/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/David/*"] } ] }

場合によっては、ポリシーを書く際に対象リソースの正確な名前が分からないときがあります。ポリシーを汎用化して多くのユーザーが共用できるようにすると、ユーザーごとにポリシーの一意なコピーを作成する必要がなくなります。たとえば、前の例のように、各ユーザーに対して Amazon S3 バケット内の各自のオブジェクトにアクセスすることを許可するポリシーを記述する場合を考えます。この場合、ユーザー名をリソースの一部として明示的に指定するポリシーをユーザーごとに別個に作成しないで、1 つのグループポリシーを作成してそれをグループ内のすべてのユーザーに適用できます。

そのためには、ポリシー内にプレースホルダーを指定できる機能であるポリシー変数を使用します。ポリシーの評価時に、ポリシー変数はリクエスト自体のコンテキストから取得された値に置き換えられます。

以下は、Amazon S3 バケットのポリシーでポリシー変数を使用した例を示します。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"] } ] }

このポリシーの評価時、IAM は変数 ${aws:username} を実際の該当ユーザーのフレンドリ名に置き換えます。つまり、リソース名の一部としてユーザー名を使用することで、ユーザーのグループに適用された単一のポリシーを用いてバケットへのアクセスを制御できます。

変数は、$ プレフィックスの後に波かっこ ({ }) を付けることでマークできます。${ } 文字の内部には、ポリシーで使用する値の名前をリクエストから取得して含めることができます。使用できる値については、このページの後半で説明します。

注記

ポリシー変数を使用するには、ステートメントに Version エレメントを含めて、ポリシー変数をサポートするバージョンに設定する必要があります。変数はバージョン 2012-10-17 から導入されました。旧バージョンでのポリシー言語では、ポリシー変数をサポートしていません。Version エレメントを含めず、適切なバージョンの日付に設定しない場合、${aws:username} などの変数はポリシー内のリテラル文字列として扱われます。

Version ポリシー要素は、ポリシーバージョンとは異なります。Version ポリシーエレメントは、ポリシー内で使用され、ポリシー言語のバージョンを定義します。一方で、ポリシーバージョンは、IAM でカスタマー管理ポリシーを変更すると作成されます。変更されたポリシーによって既存のポリシーが上書きされることはありません。代わりに、IAM は管理ポリシーの新しいバージョンを作成します。Version ポリシーエレメントの詳細については、「IAM JSON ポリシーの要素:Version」を参照してください。ポリシーのバージョンの詳細については、「IAM ポリシーのバージョニング」を参照してください。

同じようにポリシー変数を使用して、各ユーザーに対し、自身のアクセスキーを管理することを許可することができます。ポリシーにより、ユーザーは次のようにユーザー David に対するアクセスキーをプログラムによって変更することが許可されます。

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/David"] }] }

このポリシーがユーザー David に関連付けられた場合、そのユーザーは自らのアクセスキーを変更できます。ユーザー固有の Amazon S3 オブジェクトへのアクセスを許可するポリシーと同様に、ユーザーの名前を含んだ別々のポリシーをユーザーごとに作成します。その後、各ポリシーを個々のユーザーに関連付ける必要があります。

ポリシー変数を使用することで、ポリシーを次のように作成できます。

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/${aws:username}"] }] }

このようにユーザー名に対してポリシー変数を使用することで、ユーザーごとに別々のポリシーを作成する必要がなくなります。代わりに、自らのアクセスキーを管理する権限を与える必要があるすべての者を含んだ IAM グループに対し、この新しいポリシーを関連付けることができます。ユーザーが自らのアクセスキーを修正することをリクエストした場合、IAM は ${aws:username} 変数を現在のリクエストから取得したユーザー名に置き換え、ポリシーを評価します。

ポリシー変数を使用する場所

Resource エレメントのポリシー変数、および Condition エレメントの文字列比較を活用できます。

リソースエレメント

ポリシー変数は、リソースを特定する ARN の最後の部分として表示されます。以下のポリシーは、グループに関連付けることができます。これにより、グループ内の各ユーザーには、Amazon S3 内のユーザー固有のオブジェクト (自身の「ホームディレクトリ」) に対する、プログラムによるフルアクセス許可が与えられます。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"] } ] }

注記

この例は aws:username キーを使用しています。これにより、「Apple」や「David」のようなユーザーのフレンドリ名が返されます。場合によっては、グローバルに一意の値である aws:userid キーを代わりに用いる場合もあります。詳細については、「一意の ID」を参照してください。

次のポリシーを IAM グループで使用できます。これにより、そのグループ内のユーザーは、自らの名前を持つ、us-east-2 リージョン内のキューを作成、使用、削除することができます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListForConsole", "Effect": "Allow", "Action": "sqs:ListQueues", "Resource": "*" }, { "Sid": "AllQueueActions", "Effect": "Allow", "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-2:*:${aws:username}-queue" } ] }

条件エレメント

ポリシー変数は、文字列演算子 (ConditionStringEqualsStringLike など) または ARN 演算子 (StringNotLikeArnEquals など) を含む条件で使用される ArnLike 値に使用することもできます。以下の Amazon SNS トピックポリシーでは、URL が AWS ユーザー名と一致した場合に限り、AWS アカウント 999999999999 のユーザーがトピックを管理 (トピックに対するすべてのアクションを実行) できるようにします。

{ "Version": "2012-10-17", "Statement": [{ "Principal": {"AWS": "999999999999"}, "Effect": "Allow", "Action": "sns:*", "Condition": {"StringLike": {"sns:endpoint": "https://example.com/${aws:username}/*"}} }] }

ポリシー変数に使用可能なリクエスト情報

ポリシー変数に置き換えられる値は、現在のリクエストコンテキストから取得される必要があります。

すべてのリクエストで利用可能な情報

ポリシーは、ポリシー変数として使用可能な値を持つキーを含んでいます (状況によってはキーに値が含まれていない場合もあります。詳細については、このリストの後に記載されている情報を参照してください)。

  • aws:CurrentTime: 日時を確認する条件で使用できます。

  • aws:EpochTime: エポック (UNIX) 時間で表した日付に日時条件で使用できます。

  • aws:TokenIssueTime: 一時的セキュリティ認証情報が発行された日付に日時条件で使用できます。注意: このキーは、一時的セキュリティ認証情報を使ってサインインをしようとするリクエストでのみ使用できます。一時的セキュリティ認証情報の詳細については、「一時的セキュリティ認証情報」を参照してください。

  • aws:principaltype: この値は、プリンシパルがアカウント、ユーザー、フェデレーション、または引き受けられたロールかどうかを示します。詳細については、以下の説明を参照してください。

  • aws:SecureTransport: これはリクエストが SSL を使用して送信されたかどうかを表すブール値です。

  • aws:SourceIp: これは IP アドレス条件で使用するための、リクエスタの IP アドレスです。IP アドレス条件演算子 が有効である場合、または代わりに VPC 固有のキーを使用する必要がある場合の詳細については、「SourceIp」を参照してください。

  • aws:UserAgent: この値は、リクエスタのクライアントアプリケーションに関する情報が含まれる文字列です。この文字列はクライアントによって生成され、信頼性が低い場合があります。このコンテキストキーは AWS CLI からのみ使用できます。

  • aws:userid: この値は、現在のユーザーの一意の ID です。以下の表を参照してください。

  • aws:username: これは現在のユーザーのフレンドリ名が含まれる文字列です。以下の表を参照してください。

  • ec2:SourceInstanceARN: これはリクエストの実行元 Amazon EC2 インスタンスの Amazon リソースネーム (ARN) です。このキーは、リクエストが EC2 インスタンスプロファイルに関連付けられている IAM ロールを使用して、Amazon EC2 インスタンスから実行された場合にのみ存在します。

重要

キー名では大文字と小文字は区別されません。たとえば、aws:CurrentTimeAWS:currenttime は同じです。

aws:usernameaws:useridaws:principaltype の値は、リクエストがどのタイプのプリンシパルによって開始されたか (リクエストが AWS アカウント、IAM ユーザー、IAM ロールその他のうち、いずれの認証情報を使用して行われたか) によって異なります。以下のは、さまざまなタイプのプリンシパルに対するキーの値を示しています。

Principal aws:username aws:userid aws:principaltype
AWS アカウント (なし) AWS アカウント ID Account
IAM ユーザー IAM-user-name 一意の ID User
委任ユーザー (なし) account:caller-specified-name FederatedUser
ウェブフェデレーティッドユーザー (Login with Amazon、Amazon Cognito、Facebook、Google)

ウェブ ID フェデレーションを使用するときに利用可能なポリシーキーの詳細については、「ウェブ ID フェデレーションを使用したユーザーの識別」を参照してください。

(なし)

role id:caller-specified-role-name

ここで、role id はロールの一意の ID であり、caller-specified-role-name は AssumeRoleWithWebIdentity リクエストに渡される RoleSessionName パラメータによって指定されます。

AssumedRole
SAML フェデレーションユーザー

SAML フェデレーションを使用するときに利用可能なポリシーキーの詳細については、「SAML ベースのフェデレーションでユーザーを一意に識別する」を参照してください。

(なし)

role id:caller-specified-role-name

ここで、role id はロールの一意の ID です。caller-specified-role-name は Attribute 要素によって指定され、Name 属性は https://aws.amazon.com/SAML/attributes/RoleSessionName に設定されています。

AssumedRole
委任されたロール (なし)

role id:caller-specified-role-name

ここで、role id はロールの一意の ID であり、caller-specified-role-name は AssumeRole リクエストに渡される RoleSessionName パラメータです。

AssumedRole
Amazon EC2 インスタンスに割り当てられたロール (なし)

role-id:ec2-instance-id

ここで、role id はロールの一意の ID であり、ec2-instance-id は EC2 インスタンスの一意の識別子です。

AssumedRole
匿名の呼び出し元 (Amazon SQS、Amazon SNS、および Amazon S3 のみ) (なし) (なし) Anonymous

この表:

  • なしである場合、値が現在のリクエスト情報内に存在しないため値の一致を調べる試みが失敗し、リクエストが拒否されることを意味します。

  • role-id は、作成時に各ロールに割り当てられる一意の識別子です。ロール ID を表示するには、AWS CLI コマンド aws iam get-role --role-name rolename を実行します。

  • caller-specified-name および caller-specified-role-name は、一時的認証情報を取得するための呼び出し元プロセス (アプリケーションまたはサービスなど) によって渡された名前です。

  • ec2-instance-id は、インスタンスにその起動時に割り当てられ、Amazon EC2 コンソールの [Instances (インスタンス)] ページに表示される値です。インスタンス ID を表示するには、AWS CLI コマンド aws ec2 describe-instances を実行します。

フェデレーションユーザーがリクエストで利用可能な情報

フェデレーションユーザーとは、IAM 以外のシステムを使用して認証されたユーザーです。たとえば、ある企業が AWS に発信する社内用のアプリケーションを使用しているとします。このアプリケーションを使用する社内すべてのユーザーに IAM ID を発行することは実際的ではありません。代わりに、単一の IAM ID を持つプロキシ(中間層)アプリケーションを使用するか、SAML ID プロバイダ(IdP)を使用することができます。プロキシアプリケーションまたは SAML IdP は、企業ネットワークを使用して個々のユーザーを認証します。プロキシアプリケーションは、その IAM ID を使用して、個々のユーザーの一時的セキュリティ認証情報を取得できます。SAML IdP は、実際には AWS 一時的セキュリティ認証情報の ID に置き換えることができます。次に、一時的な認証情報を使用して、AWS リソースにアクセスできます。

同様に、AWS リソースへのアクセスが必要なモバイルデバイス用アプリを作成することもできます。この場合、ウェブ ID フェデレーションを使用すると、アプリケーションで、Login with Amazon、Amazon Cognito、Facebook、Google などのよく知られた ID プロバイダーを使用するユーザーを認証できます。その後、アプリはこれらのプロバイダから取得したユーザーの認証情報を用いて、AWS リソースにアクセスするための一時認証情報を取得します。

ウェブ ID フェデレーションを使用する場合は、Amazon Cognito と AWS Mobile SDK を利用することをお勧めします。詳細については、以下を参照してください。

サービス固有の情報

リクエストはまた、リクエストコンテキストにサービス固有のキーや値を含めることもできます。次に例を示します。

  • s3:prefix

  • s3:max-keys

  • s3:x-amz-acl

  • sns:Endpoint

  • sns:Protocol

ポリシー変数の値を取得するために使用するサービス固有のキーに関する詳細については、各サービスに付属するドキュメンテーションを参照してください。たとえば、次のトピックをご覧ください。

特殊文字

それ以外の場合は特別な意味を持つ文字を表すことのできる、固定値を持つ事前定義された特殊なポリシー変数がいくつかあります。これらの特殊文字が、一致を試みている文字列、またリテラルに挿入した文字列の一部である場合、これらは誤って解釈されます。たとえば、文字列に挿入されたアスタリスク(*)は、リテラルな * としてではなく、任意の文字列を指定するワイルドカードとして解釈されます。この場合、事前定義した次のポリシー変数を使用できます。

  • ${*} - アスタリスク * が必要な場合に使用します。

  • ${$} - 疑問符 ? が必要な場合に使用します。

  • ${$} - ドル記号 $ が必要な場合に使用します。

これらの事前定義されたポリシー変数は、正規のポリシー変数を使用できるすべての文字列で使用できます。

追加情報

ポリシーの詳細については、以下を参照してください。