AWS CloudShell で IP アドレス制限のある IAM ユーザの操作が AccessDenied になるときの対処方法

2023.06.28

困っていた内容

IAM ポリシーの条件で"aws:SourceIp"を指定し、IAM ユーザーに IP アドレス制限をかけています。
また、CloudFormation などの AWS を経由するサービスを考慮し"aws:ViaAWSService"の条件も指定しています。

ポリシー設定のイメージ

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.0.113.0/24"
                ]
            },
            "Bool": {"aws:ViaAWSService": "false"}
        }
    }
}

上記ポリシーで意図した制限ができているのですが、CloudShell で AWS CLI を実行すると AccessDenied が発生します。 原因と対処方法を教えてください。

どう対応すればいいの?

IAM ポリシーに次の条件を追加してください。

"StringNotLike": {
  "aws:userAgent": "*exec-env/CloudShell*"
}

AWS CloudShell で AWS CLI を実行した場合、送信元の IP アドレス("aws:SourceIp")は AWS CloudShell の IP アドレスとなります。また、AWS CloudShell で実行した操作は、AWS を経由するサービス("aws:ViaAWSService")には該当しません。

そのため、「ポリシー設定のイメージ」のようなポリシーを設定している場合は"aws:SourceIp"の制限対象外に AWS CloudShell の IP アドレスが含まれていないと、アクセスが拒否されます。

AWS CloudShell で実行した操作を除外したい場合は上記のポリシー条件を追加してください。

追加例

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.0.113.0/24"
                ]
            },
            "Bool": {"aws:ViaAWSService": "false"},
            "StringNotLike": {
                "aws:userAgent": "*exec-env/CloudShell*"
            }
        }
    }
}

参考資料

AWS CloudShell から発生した API リクエストは会社の IP アドレス範囲から発生するものではなく、AWS のサービス 経由で呼び出されるものでもありません。つまり、CloudShell リクエストは拒否されます。CloudShell リクエストを拒否ステートメントから除外するには、次の条件を追加します。

"StringNotLike": {
  "aws:userAgent": "*exec-env/CloudShell*"
}