API Gateway のリソースベースのポリシーで特定 IAM ユーザ・ロールだけに制限できないときの対処法

2023.11.22

困っていた内容

API Gateway の呼び出しをアカウント内の特定の IAM ロールに制限したいです。
許可する IAM ロールだけをリソースポリシーで許可しましたが、別の IAM ロールからも呼び出しに成功しました。
なぜ成功したのでしょうか。特定の IAM ロールだけを許可する方法を教えてください。

ポリシー設定のイメージ

{
   "Version": "2012-10-17",
   "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::123456789012:role/call-allow-role"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*",
        }
    ]
}

どう対応すればいいの?

許可する IAM ロール以外を拒否するポリシーを設定してください。

ポリシー設定のイメージ

{ 
  "Version": "2012-10-17", 
  "Statement": [ 
    { 
      "Effect": "Deny", 
      "Principal": "*", 
      "Action": "execute-api:Invoke", 
      "Resource": "execute-api:/*",
      "Condition": { 
        "StringNotEquals": { 
          "aws:PrincipalArn": "arn:aws:iam::123456789012:role/call-allow-role"
        } 
      } 
    } 
  ] 
}

同一アカウント内からの呼び出しの場合、明示的に拒否しない限り、IAM ポリシーもしくはリソースポリシーのいずれかで許可されていれば API Gateway の呼び出しは成功します。

そのため、リソースポリシーで許可するロールだけを指定しても、IAM ロール側のポリシー(アイデンティティベースのポリシー)で API Gateway の呼び出しが許可されていれば API Gateway を呼び出せます。

同一アカウント内の特定の IAM ロールだけに制限したい場合は、上記のような明示的な拒否のポリシーを設定してください。

参考資料

表 A: アカウント A が所有する API をアカウント A が呼び出す
IAM ポリシー (または Lambda または Amazon Cognito ユーザープール認証) API Gateway リソースポリシー 結果として生じる動作
許可 許可 許可
許可 許可も拒否もしない 許可
許可 拒否 明示的な拒否
許可も拒否もしない 許可 許可
許可も拒否もしない 許可も拒否もしない 暗黙的な拒否
許可も拒否もしない 拒否 明示的な拒否
拒否 許可 明示的な拒否
拒否 許可も拒否もしない 明示的な拒否
拒否 拒否 明示的な拒否