困っていた内容
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*" }