IAM ロールを使用して、特定の IP アドレスから AWS マネジメントコンソールへの API 呼び出しを制限する方法を教えてください。

最終更新日: 2019 年 10 月 21 日

特定の IP アドレスへの AWS API 呼び出しへのアクセスを制限したいと考えています。AWS Identity and Access Management(IAM) ロールを使用して、API コールから AWS マネジメントコンソールへのアクセスを制限する方法を教えてください。

簡単な説明

IAM ポリシーの条件要素で aws:SourceIp グローバル条件キーを使用して、特定の IP アドレスからの API 呼び出しを制限できます。ただし、これにより、お客様に代わって呼び出しを行う AWS のサービス (AWS CloudFormation など) へのアクセスが拒否されます。

たとえば、AWS CloudFormation が Amazon Elastic Compute Cloud (Amazon EC2) を呼び出してインスタンスを停止することを許可する AWS サービスロール があるとします。ターゲットサービス (Amazon EC2) は、発信ユーザーの IP アドレスではなく呼び出しサービス (AWS CloudFormation) の IP アドレスを参照するため、リクエストは拒否されます。IAM ポリシーで評価するために、発信元の IP アドレスを呼び出し元のサービスを介してターゲットサービスに渡すことはできません。

注意: aws:SourceIp 条件キーを使用しないことをお勧めします。

解決方法

IAM ユーザーにアタッチされた IAM ポリシーと同じアクセス許可がアタッチされた IAM ロール を作成します。IAM ユーザーには、指定された IP アドレスからリクエストが送信される場合に、ロール sts:AssumeRole API を引き受けるアクセス権限だけが付与されます。これは、ユーザーがロールを引き受けるときに aws:SourceIp 制限チェックが実行されるためです。ユーザーが IAM ロールを引き受けると、そのロールにアタッチされた IAM ポリシーのアクセス許可を取得します。ロールにアタッチされた IAM ポリシーは aws:SourceIp 条件キーを使用しないため、AWS のサービスへのアクセスが許可されます。

以下の IAM ポリシーを 作成し、プログラムによるアクセス許可を持つ IAM ユーザー にアタッチします。この IAM ポリシーにより、IAM ユーザーは Bob というロール名で AssumeRole を実行できます。 Bobには追加のアクセス許可は必要ありません。IAM ユーザーが Bob ロールを引き受けると、他のすべての必要なアクセス許可が取得されます。

注意: Bob を IAM ロール名に置き換え、 EXAMPLEIAMACCOUNTID をアカウント ID に置き換えます。

IAM ユーザーポリシーの例

{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::EXAMPLEIAMACCOUNTID:role/Bob"
}
}

IAM ユーザーにアクセス許可を委任する IAM ロール Bob を作成します。IAM ロールの作成 (コンソール) の手順に従います。また、AWS コマンドラインインターフェイス (AWS CLI) または AWS API を使用することもできます。

注意: コンソールを使用してロールを作成する場合は、 Bob の信頼ポリシーのこの例のような ロールの信頼ポリシーを変更 します。CLI の create-role または API CreateRole を使用して、信頼関係ポリシードキュメントを -assume-role-policy ドキュメントパラメータの値として渡すことができます。

IAM Bob ロールポリシー: このポリシーには、アカウントのリソースに対して API 呼び出しを実行するアクセス許可があります。

IAM Bob 信頼ポリシー: このサンプル信頼ポリシーは、リクエストが 103.15.250.0/24 または 12.148.72.0/23 の IP アドレス範囲から送信される場合、ユーザーがロールを引き受けることを許可します。

注意: リクエストは、指定された IP アドレス範囲 103.15.250.0/24 または 12.148.72.0/23 から送信されている必要があります。そうでないと、IAM ユーザーはロールを引き受け、API コールを実行することができなくなります。

IAM ロールの信頼ポリシーの例

注意: EXAMPLEIAMUSERNAME を IAM ユーザー名に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/EXAMPLEIAMUSERNAME"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/EXAMPLEIAMUSERNAME"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "103.15.250.0/24",
            "12.148.72.0/23"
          ]
        }
      }
    }
  ]
}

注意: アクションは IAM ユーザーではなく、ユーザーが引き受けた IAM ロールによって実行されるため、この回避策は CloudTrail ログを中断します。IAM ユーザーによって実行される assumeRole API 呼び出しは、IAM ユーザーの下の CloudTrail ログに記録されます。IAM ロールによって実行される追加の API 呼び出しは、ロール名の下の CloudTrail ログに記録されます。