ポリシーの Principal と NotPrincipal で同じ書き方をしても対象が異なるもの

ポリシーの Principal と NotPrincipal で同じ書き方をしても対象が異なるもの

はじめに

こんにちは、パオの人ことさすけです!
今回はポリシーの記述方法に関する仕様のお話です。Principal と NotPrincipal では少し仕様が異なる部分がありましたので、メモ感覚で書き残しておきます。

Principal と NotPrincipal

まずは簡単に Principal と NotPrincipal で何ができるのかについて見ていきましょう。
たとえば Principal では、以下のバケットポリシーのような書き方をした場合「User1Role1 に対して、test バケット内のオブジェクトに対する全 S3 アクション権限を付与する」という内容になります。

Principal
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowTestAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::xxxxxxxxxxxx:user/User1",
                    "arn:aws:iam::xxxxxxxxxxxx:role/Role1"
                ]
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::test/*"
        }
    ]
}

Principal を下記バケットポリシーのように NotPrincipal に変更して見ましょう。
すると「User1Role1 以外 に対して、test バケット内のオブジェクトに対する全 S3 アクション権限を付与する」といった内容になります。

NotPrincipal
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowTestAccess",
            "Effect": "Allow",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::xxxxxxxxxxxx:user/User1",
                    "arn:aws:iam::xxxxxxxxxxxx:role/Role1"
                ]
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::test/*"
        }
    ]
}

arn:aws:iam::xxxxxxxxxxxx:root の扱いについて

さて、ここからが本題です。
まずは皆さんの印象のままで良いので、少し以下 2 つのバケットポリシーについてどのような権限になっているか考えてみてください!

Principal の場合

1 つ目は、Principal の場合です。
全文としては下記の通りになりますが、皆さんはこのポリシーは誰に対して全 S3 アクション許可していると思いますか??

Principal
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowTestAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::xxxxxxxxxxxx:root"
                ]
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::test/*"
        }
    ]
}

正解は アカウント ID(xxxxxxxxxxxx)配下の全ユーザーおよび全ロール です!
意外ですよね、、自分も最初はルートユーザーを指すと思っていたので、初めて調べた時は驚きました。

たとえば上記ポリシーであれば、当該アカウント ID からであれば、どのユーザーどのロールを使用しても test バケット内のオブジェクトに対して、全 S3 アクションが許可されるということですね。

NotPrincipal の場合

では、2 つ目に下記のように NotPrincipal の場合、誰が対象になるのでしょうか?
こちらも少し考えてみてください!

NotPrincipal
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowTestAccess",
            "Effect": "Allow",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::xxxxxxxxxxxx:root"
                ]
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::test/*"
        }
    ]
}

正解は、ルートユーザー をです!
NotPrincipal の場合は、直感的というか想像通りな感じですね。

つまり上記ポリシーでは、ルートユーザーに対してのみ test バケット内のオブジェクトに対して全 S3 アクションを許可しているということになります。

まとめ

今回は Principal と NotPrincipal では、arn:aws:iam::xxxxxxxxxxxx:root と記述したときの対象ユーザーおよびロールが異なるという話をしました。
この仕様は、割と知らない方もいるかと思いますので、ぜひ覚えておいてください!「ルートユーザーを指定したつもりなのにできていなかった」なんてことになっては大変ですから、、。

参考文献

アノテーション株式会社

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.