📝

Identity Based PolicyとResource Based Policyの違いと使い分け

2022/03/15に公開

概要

AWSのポリシーの付与の仕方にIdentity based policyとResource based policyがあります。

これら2つの関係性と使い分けについてまとめます。

この記事で解説すること

  • Identity / Resource based policyの違い
  • Identity / Resource based policyの論理評価の仕組み
  • Identity / Resource based policyの使い分け

Identity / Resource based policyの違い

Identity Resource
アタッチできるリソース IAM系のリソース SQS,S3,KMSなどの特定のAWSリソース
ポリシーのアタッチ先と権限付与先が同一か? Yes No
Inline policyのみ? No Yes

ポリシーのアタッチ先と権限付与先

例えばS3のバケットポリシーに以下のようなポリシーを書くと、hoge-userに対してs3:PutObjectを許可するという意味になります。
このようにポリシーのアタッチ先(S3)と権限の付与先(hoge-user)が異なっているのがResource based policyの特徴です。

policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddCannedAcl",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:hoge-user",
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
        }
    ]
}

Resource based policyはinline policyのみ

Resouce based policyはinline policyしか付与できないため、S3バケットA,B,Cに対して同じポリシーを適用したい場合、毎回同じinline policyを書く必要があります。

Identity / Resource based policyが同時にある時の論理評価の仕組み

s3-bucket-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:hoge-user",
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
        }
    ]
}
hoge-user-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Resource": {
                "AWS": [
                    "arn:aws:s3:::examplebucket/*",
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
        }
    ]
}

このようにIdentity / Resource based policyがどちらも存在する場合を考えます。

この場合片方が独立して評価されるのではなく一度合体してから評価が行われます。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/PolicyEvaluationHorizontal111621.png

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_evaluation-logic.html

そのため上の例でいうと、明示的なDenyステートメントがあるためs3:PutObjectは結果として禁止されます。

Identity / Resource based policyの使い分け

ここまでの話を踏まえて二つのポリシーの使い分けについて考えます。

例えばS3バケットAに対するaアクションをhoge-userに許可したい場合、Identity / Resource based policyのどちらでも実現可能です。

しかし基本的には

  • 許可はIdentity based policy
  • 拒否はResource based policy

という使い分けにするのが良さそうです。

例えばS3のあるバケットに機微情報を保存しているとします。
この時にうっかりアクセス権を持ったfuga-userが作成されてしまうと機微情報が意図せず漏れてしまいます。
このような事態を確実に防ぐにはS3のresource based policyに特定のアカウント以外からのアクセスをDenyするようなステートメントを書くことで対処可能です。

このことを考えるとResource based policyは明示的な拒否を宣言するために使うようにすると権限管理がスッキリすると思います。

参考: https://devlog.arksystems.co.jp/2020/03/12/9338/

Discussion