メニュー
AWS Identity and Access Management
ユーザーガイド

IAM ポリシー変数の概要

はじめに

IAM ポリシーでは、アクセスを制御するリソースの名前を指定できます。以下のポリシーにより権限を得たユーザーは、Amazon S3 バケット mybucket 内において、プレフィックス David がついたオブジェクトをプログラム的にリスト化、読み取り、および書き込みをすることができます。

Copy
{ "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 バケット内に自身のオブジェクトを持つ許可を与える必要があると想像してください。しかし、リソースの一部としてユーザー名を指定することで各ユーザーに対して別途のポリシーを作成するよりも、グループ内のすべてのユーザーに対して機能する単一のグループポリシーを作成しようと考えたとします。

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

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

Copy
{ "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 ポリシー要素の詳細については、「Version」を参照してください。ポリシーのバージョンの詳細については、「管理ポリシーのバージョニング」を参照してください。

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

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

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

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

Copy
{ "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 内のユーザー固有のオブジェクト(自身の「ホームディレクトリ」)に対する、プログラムによるフルアクセス許可が与えられます。

Copy
{ "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 リージョン内のキューを作成、使用、削除することができます。

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

条件エレメント

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

Copy
{ "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 アドレスです。SourceIp が有効である場合、または代わりに VPC 固有のキーを使用する必要がある場合の詳細については、「IP アドレス条件演算子」を参照してください。

  • aws:UserAgent: この値は、リクエスタのクライアントアプリケーションに関する情報が含まれる文字列です。

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

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

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

重要

すべての条件キーの名前で、大文字と小文字が区別されます。

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

Principal aws:username aws:userid aws:principaltype
AWS アカウント (なし) AWS アカウント ID Account
IAM ユーザー IAM ユーザー名 一意の ID User
委任ユーザー (なし) アカウント:発信者が指定した名前 FederatedUser
ウェブフェデレーションユーザー(Login with Amazon、Amazon Cognito、Facebook、Google)

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

(なし)

ロール ID: 発信者が指定したロール名

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

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

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

(なし)

ロール ID: 発信者が指定したロール名

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

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

ロール ID: 発信者が指定したロール名

ここで、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 は、作成時に各ロールに割り当てられる一意の識別子です。次の AWS CLI コマンドでロール ID を表示できます: aws iam get-role --role-name rolename

  • 発信者が指定した名前および発信者が指定したロール名は、一時認証情報を取得するための発信プロセスによって渡された名前です (アプリケーションまたはサービスなど)。

  • 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 は、実質的に、ID 情報を AWS の一次的な認証情報と交換できます。次に、一時的な認証情報を使用して、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

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

特殊文字

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

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

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

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

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

追加情報

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