📙

IAMでIP制限とMFA制限をかける方法と注意点

2022/02/17に公開

AWSを触っていると、MFAをかけつつ特定のIP以外からのアクセスを拒否したい場合がありますよね。
一見簡単に作れそうな印象を抱きますが、クラスメソッドさんの記事にある通り「否定かつ否定」条件を扱うIAMポリシーは直感的に理解しづらく、間違っている場合も多々あります。

複数の否定条件を使ったS3バケットポリシーを正しく理解してますか?

今回作りたい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