特定の IP アドレスに対する AWS API コールへのアクセスを制限したいと考えています。AWS Identity and Access Management (IAM) ロールを使用して、API コールから AWS マネジメントコンソールへのアクセスを制限する方法を教えてください。
簡単な説明
IAM ポリシーの条件要素で aws:SourceIp グローバル条件キーを使用して、特定の IP アドレスからの API コールを制限できます。ただし、これにより、aws:ViaAWSService グローバル条件を一緒に使用しない限り、ユーザーに代わって呼び出しを行う AWS CloudFormation などの AWS のサービスへのアクセスは拒否されます。詳細については、「AWS: 送信元 IP に基づいて AWS へのアクセスを拒否する」を参照してください。
例えば、AWS CloudFormation が Amazon Elastic Compute Cloud (Amazon EC2) を呼び出してインスタンスを停止することを許可する AWS サービスロール があるとします。ターゲットサービス (Amazon EC2) は、発信ユーザーではなく呼び出しサービス (AWS CloudFormation) の IP アドレスを参照するため、リクエストは拒否されます。IAM ポリシーでは、評価対象の送信元 IP アドレスを送信元サービスからターゲットサービスに渡すことはできません。
解決方法
IAM ユーザーにアタッチされた IAM ポリシーと同じ一連の許可がアタッチされた IAM ロール を作成します。これにより、リクエストが指定された IP アドレスから送信された場合にのみ、IAM ユーザーに sts:AssumeRole API のロールを引き受けるための許可が付与されます。これは、ユーザーがロールを引き受けるときに aws:SourceIp 制限チェックが実行されるためです。ユーザーが IAM ロールを引き受けると、そのロールにアタッチされた IAM ポリシーのアクセス許可を取得します。ロールにアタッチされた IAM ポリシーは aws:SourceIp 条件キーを使用しないため、AWS のサービスへのアクセスが許可されます。
以下の IAM ポリシーを 作成し、プログラムによるアクセス許可を持つ IAM ユーザー にアタッチします。この IAM ポリシーにより、IAM ユーザーは Bobというロール名で AssumeRole を実行できます。Bob には追加のアクセス許可は必要ありません。IAM ユーザーが Bob ロールを引き受けると、他のすべての必要なアクセス許可が取得されます。
注意:
IAM ユーザーポリシー例
このポリシー例には、アカウントのリソースに対して API コールを実行するアクセス権限があります。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::EXAMPLEIAMACCOUNTID:role/Bob"
}
}
IAM ユーザーにアクセス許可を委任する IAM ロール Bob を作成します。IAM ロールの作成 (コンソール) の手順に従います。AWS CLI または API を使用することもできます。
注意:
- コンソールを使用してロールを作成する場合は、Bob の信頼ポリシーのこの例のようなロールの信頼ポリシーを変更します。AWS CLI の create-role または API の CreateRole を使用すると、信頼関係ポリシードキュメントを update-assume-role-policy ドキュメントパラメータの値として渡すことができます。
- リクエストは、指定された IP アドレス範囲 103.15.250.0/24 または 12.148.72.0/23 から送信される必要があります。それ以外の場合には、IAM ユーザーはロールを引き受けて API コールを実行できません。
IAM ロールの信頼ポリシー例
この信頼ポリシー例では、リクエスト元の IP アドレス範囲が 103.15.250.0/24 または 12.148.72.0/23 である場合に、ロールを引き受けることをユーザーに許可します。
注意: YOURIAMUSERNAME を IAM ユーザー名に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
},
"Action": "sts:AssumeRole",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"103.15.250.0/24",
"12.148.72.0/23"
]
}
}
}
]
}
注意: アクションは IAM ユーザーではなく、ユーザーが引き受けた IAM ロールによって実行されるため、この回避策は AWS CloudTrail ログを中断します。IAM ユーザーによって実行される assumeRole API 呼び出しは、IAM ユーザーの下の CloudTrail ログに記録されます。IAM ロールによって実行される追加の API 呼び出しは、ロール名の下の CloudTrail ログに記録されます。
関連情報
AWS グローバル条件コンテキストキー