IAM ポリシーの要素: 変数とタグ - AWS Identity and Access Management

IAM ポリシーの要素: 変数とタグ

ポリシーを記述するときにリソースや条件キーの正確な値がわからない場合、AWS Identity and Access Management (IAM) のポリシー変数をプレースホルダーとして使用します。

注記

AWS が変数を解決できない場合は、これによってステートメント全体が無効になる可能性があります。たとえば、aws:TokenIssueTime 変数を使用する場合は、リクエスタが一時的な認証情報 (IAM ロール) を使用して認証した場合にのみ、変数は値に解決されます。変数が無効なステートメントを発生させないようにするには、...IfExists 条件演算子を使用します。

はじめに

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 バケット内の各自のオブジェクトにアクセスすることを許可するポリシーを記述する場合を考えます。ただし、リソースの一部としてユーザーの名前を明示的に指定する個別のポリシーを各ユーザーに対して作成しないでください。代わりに、そのグループ内の任意のユーザーに対して機能する単一のグループポリシーを作成します。

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

重要

単一値の条件キーは、変数として使用できます。複数値の条件キーは、変数としては使用できません。

次の例は、ポリシー変数を使用する 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:user/David"] }] }

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

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

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

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

ポリシー変数としてのタグ

一部の AWS サービスでは、それらのサービスによって作成されたリソースに独自のカスタム属性をアタッチできます。例えば、Amazon S3 バケットや IAM ユーザーにタグを適用できます。これらのタグはキーバリューのペアです。タグキー名と、そのキー名に関連付けられた値とを定義します。たとえば、department キーと Human Resources 値を持つタグを作成します。IAM エンティティのタグ付けの詳細については、「IAM リソースのタグ付け」を参照してください。他の AWS サービスによって作成されるリソースのタグ付けについては、そのサービスのドキュメントを参照してください。タグエディタの使用については、「AWS Management Console ユーザーガイド」の「タグエディタの使用」を参照してください。

IAM リソースにタグ付けすることで、IAM リソースの検出、整理、および追跡を簡単に行うことができます。また、IAM アイデンティティにタグ付けして、リソースまたはタグ付け自体へのアクセスを制御することもできます。タグを使用したアクセスの制御については、「タグを使用した IAM ユーザーおよびロールへのアクセスとそのユーザーおよびロールのアクセスの制御」を参照してください。

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

Resource 要素のポリシー変数、および Condition 要素の文字列比較を活用できます。

リソースの要素

ポリシー変数は Resource 要素で使用できますが、ARN のリソース部分でのみ使用できます。ARN のこの部分は、5 番目のコロン (:) の後に表示されます。サービスやアカウントなど 5 番目のコロンよりも前の ARN の部分は、変数を使用して置き換えることはできません。ARN 形式の詳細については、IAM 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 キーを代わりに用いる場合もあります。詳細については、「一意の識別子」を参照してください。

次のポリシーを 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" } ] }

ARN の一部をタグ値で置き換えるには、接頭辞とキー名を ${} で囲みます。たとえば、Resource 要素は、リクエストしているユーザーの department タグの値と同じ名前のバケットのみを参照します。

"Resource": ["arn:aws:s3:::bucket/${aws:PrincipalTag/department}"]

条件の要素

ポリシー変数は、文字列演算子または ARN 演算子を含む任意の条件の Condition の値に使用できます。文字列演算子には StringEqualsStringLikeStringNotLike などが含まれます。ARN 演算子には ArnEqualsArnLike が含まれます。ポリシー変数は NumericDateBooleanBinaryIP Address、または Null など、他の演算子では使用できません。条件演算子の詳細については、「IAM JSON ポリシー要素: 条件演算子」を参照してください。

以下の Amazon SNS トピックポリシーでは、AWS アカウント 999999999999 のユーザーが、トピックを管理 (トピックに対するすべてのアクションを実行) できるようにします。ただし、このアクセス許可が付与されるのは、URL が AWS ユーザー名に一致している場合のみです。

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

Condition 要素式のタグを参照するときは、関連する接頭辞とキー名を条件キーとして使用します。次に、条件値でテストする値を使用します。たとえば、次のポリシー例では、IAM ユーザーへのフルアクセスが許可されていますが、タグ costCenter がユーザーに添付されている場合に限ります。タグの値は、12345 または 67890 である必要があります。タグ値が設定されていない場合、またはそれ以外の値の場合、リクエストは失敗します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:*user*" ], "Resource": "*", "Condition": { "StringLike": { "iam:ResourceTag/costCenter": [ "12345", "67890" ] } } } ] }

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

JSON ポリシーの Condition 要素を使用して、リクエストコンテキストのキーを、ポリシーで指定したキーバリューと比較できます。ポリシー変数を使用する場合、AWS は、ポリシー内の変数の代わりにリクエストコンテキストキーの値を置換します。

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

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

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

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

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

  • 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:userid、および aws:PrincipalType の値は、リクエストを開始したプリンシパルの値によって異なります。例えば、IAM ユーザー、IAM ロール、または AWS アカウントのルートユーザー の認証情報を使用してリクエストを行うことができます。以下のは、様々な種類のプリンシパルに対するキーの値を示しています。

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

ここで、rrole-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 Anonymous

この テーブルの については、次の点に注意してください。

  • なしである場合、値が現在のリクエスト情報内に存在しないために値を一致させる試みが失敗し、ステートメントが無効になることを意味します。

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

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

特殊文字

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

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

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

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

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

デフォルト値の指定

AWS が変数を解決できない場合は、これによってステートメント全体が無効になる可能性があります。ただし、ポリシーに変数を追加する場合、変数のデフォルト値を指定できます。変数に AWS 値が指定されていない場合は、指定した既定のテキストを使用します。

変数にデフォルト値を追加するには、デフォルト値を一重引用符 (' ') で囲み、変数テキストとデフォルト値をコンマとスペース (, ) で区切ります。

例えば、プリンシパルが team=yellow でタグ付けされている場合、DOC-EXAMPLE-BUCKET-yellow という名前で ExampleCorp's のAmazon S3 バケットにアクセスできます。このリソースを使用するポリシーでは、チームメンバーがチームのバケットにアクセスすることは許可されますが、他のチームのリソースにアクセスすることはできません。チームタグのないユーザーの場合、company-wide のデフォルト値をバケットの名前として設定します。これらのユーザーは DOC-EXAMPLE-BUCKET-company-wide バケットにのみアクセスでき、チームへの参加方法などの一般的な情報を確認できます。

"Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET-${aws:PrincipalTag/team, 'company-wide'}"

詳細情報

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