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

所要時間2分
0

AWS Identity and Access Management (IAM) ロールを使用して、AWS マネジメントコンソールへの API コールによるアクセスを制限したいと考えています。

簡単な説明

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 アドレスを認識するため、リクエストは拒否されます。呼び出しサービスを経由する発信元の IP アドレスを、ターゲットサービスに渡して IAM ポリシーで評価することはできません。

解決策

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

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

注:

IAM ユーザーポリシーの例

このポリシー例には、アカウント内のリソースに API コールを実行するアクセス許可があります。

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

IAM ロール Bob を作成して IAM ユーザーにアクセス許可を委任します。次に、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 グローバル条件コンテキストキー

コメントはありません

関連するコンテンツ