AWS CloudShell で IP アドレス制限のある IAM ユーザの操作が AccessDenied になるときの対処方法
困っていた内容
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*" }