📙
IAMでIP制限とMFA制限をかける方法と注意点
AWSを触っていると、MFAをかけつつ特定のIP以外からのアクセスを拒否したい場合がありますよね。
一見簡単に作れそうな印象を抱きますが、クラスメソッドさんの記事にある通り「否定かつ否定」条件を扱うIAMポリシーは直感的に理解しづらく、間違っている場合も多々あります。
今回作りたいIAMポリシーの答えは以下です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "123.45.123.34/32"
}
}
}
]
}
でも、以下の方が正しそうに見えませんか?(私には見えます)
※こちらは誤りなので注意
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
},
"NotIpAddress": {
"aws:SourceIp": "123.45.123.34/32"
}
}
}
]
}
後者の場合は、「MFAがない人」かつ「IPが123.45.123.34/32ではない人」がDeny Allになります。
これだと、「MFAを付けている」または「IPが123.45.123.34/32」のどちらかさえ満たしていたらDeny Allされません!(!a && !bとするところを!(a && b)としてしまっている状態)
実質MFA制限もIP制限もうまくいっていない状態です。
以下のようなポリシーを作って、IPとMFAを制限してるから安心!なんて思っていたら大惨事になります。
※こちらは誤りなので注意
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:DeleteObject",
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
},
"NotIpAddress": {
"aws:SourceIp": "123.45.123.34/32"
}
}
}
]
}
こちらのポリシーですが、
- MFAさえあればどのIPからでもs3:DeleteObject
- IPさえ正しければMFAがなくてもs3:DeleteObject
という恐ろしいポリシーのできあがりです。。
拒否かつ拒否のポリシーを作るときは気を付けましょう。
Discussion