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

MFA 条件を指定したサンプルポリシー

以下の例は、MFA の条件をポリシーに追加できるその他の方法を示します。

注記

以下の例は、自分の AWS アカウント内の IAM ユーザーまたはグループに直接アタッチされるポリシーを示します。例を適用してアカウント間で API を MFA 保護するには、代わりに IAM ロールを使用し、MFA 条件チェックをロールアクセスポリシーでなく、ロール信頼ポリシーに置きます。詳細については、「シナリオ: クロスアカウントの委任の MFA 保護」を参照してください。

例 1: 一定時間内の MFA 認証後のアクセス承認 (GetSessionToken)

以下の例では、ユーザーが過去 1 時間(3600 秒)以内に MFA によって認証された場合にのみ Amazon EC2 アクセスを許可するユーザーまたはグループに、アタッチされるポリシーを示します。ユーザーに長期的な認証情報があり、このポリシーが Amazon EC2 API を呼び出した場合、長期的な認証情報のリクエストコンテキストに MultiFactorAuthAge キーがないため、コールは停止します。演算子を NumericLessThanIfExists に変更して長期的な認証情報を許可するか、sts:GetSessionToken API を使用する MFA で検証済みの短期的な認証情報をユーザーが取得するように指示することができます。

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["ec2:*"], "Resource": ["*"], "Condition": {"NumericLessThan": {"aws:MultiFactorAuthAge": "3600"}} }] }

例 2: MFA 認証が有効ではないため特定の API へのアクセスを拒否 (GetSessionToken)

以下の例では、Amazon EC2 API 全体へのアクセスを許可するユーザーまたはグループにアタッチされるポリシーを示します。ただし、ユーザーが MFA 認証されていない場合、StopInstances および TerminateInstances へのアクセスは拒否されます。ポリシーでは、目的の効果を達成するために 2 つのステートメントが必要です。最初のステートメント( "Sid": "AllowAllActionsForEC2" を含む)では、すべての Amazon EC2 アクションを許可します。MFA 認証コンテキストがない場合 (MFA が使用されなかったことを意味します)、2 番目のステートメント ("Sid": "DenyStopAndTerminateWhenMFAIsNotPresent" を含む) で StopInstances および TerminateInstances アクションが拒否されます。

注記

Deny ステートメントの MultiFactorAuthPresent の条件チェックは、MFA が使用されていなければ該当キーが存在せず、評価できないため、{"Bool":{"aws:MultiFactorAuthPresent":false}} となりません。その代わりに、BoolIfExists チェックを使用して、値をチェックする前にキーが存在するかどうか確認します。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAllActionsForEC2", "Effect": "Allow", "Action": "ec2:*", "Resource": "*" }, { "Sid": "DenyStopAndTerminateWhenMFAIsNotPresent", "Effect": "Deny", "Action": [ "ec2:StopInstances", "ec2:TerminateInstances" ], "Resource": "*", "Condition": {"BoolIfExists": {"aws:MultiFactorAuthPresent": false}} } ] }

例 3: 一定時間内の MFA 認証が有効ではないため特定の API へのアクセスを拒否 (GetSessionToken)

以下の例では、Amazon EC2 API 全体へのアクセスを許可するユーザーまたはグループにアタッチされるポリシーを示します。ただし、StopInstances および TerminateInstances へのアクセスは、ユーザーが過去 1 時間以内に MFA で認証されていないと拒否されます。この例は前の例を拡張したものであり、目的の効果を達成するには 3 つのステートメントが必要です。最初の 2 つのステートメントは、前の例と同じです。依然として 2 番目のステートメントには、MFA がまったく使用されていない (MFA コンテキストが欠落している) 場合、StopInstances および TerminateInstances を拒否する条件が含まれています。次の例の 3 番目のステートメント ("Sid": "DenyStopAndTerminateWhenMFAIsOlderThanOneHour" を含む) では、MFA 認証が存在しているが、リクエストより 1 時間以上前に発生した場合に、StopInstances および TerminateInstances アクションを拒否する追加の条件が含まれています。たとえば、IAM ユーザーは MFA を使用して AWS マネジメントコンソール にサインインし、2 時間後に EC2 インスタンスを停止または終了しようとする場合があります。次のポリシーでは、これが回避されます。このシナリオで EC2 インスタンスを停止または終了するには、ユーザーはサインアウトし、MFA を使用して再度サインインして、それから 1 時間以内にインスタンスを停止または終了する必要があります。

注記

MFA を使用していない場合はキーがなく評価することができないため、最初の Deny ステートメントでの MultiFactorAuthPresent 条件チェックは "BoolIfExists" を使用します。MFA を使用しておらず値が存在しない場合、これは true を返し、ステートメントの一致、アクセスを拒否します。

条件 aws:MultiFactorAuthAge が存在するのは、MFA コンテキストがリクエストにある場合のみです。ステートメント 2 は MFA がまったく存在しない状況に対応し、ステートメント 3 は MFA が存在し、適切な時間帯に発生したかどうかを評価する状況に対応します。キーがない場合、...IfExists はテストが true を返し、ステートメントの一致、そしてユーザーがこうした API へのアクセスを拒否される原因になります。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAllActionsForEC2", "Effect": "Allow", "Action": "ec2:*", "Resource": "*" }, { "Sid": "DenyStopAndTerminateWhenMFAIsNotPresent", "Effect": "Deny", "Action": [ "ec2:StopInstances", "ec2:TerminateInstances" ], "Resource": "*", "Condition": {"BoolIfExists": {"aws:MultiFactorAuthPresent": false}} }, { "Sid": "DenyStopAndTerminateWhenMFAIsOlderThanOneHour", "Effect": "Deny", "Action": [ "ec2:StopInstances", "ec2:TerminateInstances" ], "Resource": "*", "Condition": {"NumericGreaterThanIfExists": {"aws:MultiFactorAuthAge": "3600"}} } ] }