🔏

いろんなポリシーの種類と条件を理解して構築するData perimeters on AWS

2024/12/23に公開

こちらは Fusic Advent Calendar 2024 の23日目の記事です!

きっかけ

re:Invent2024で「Data perimeter challenge [REPEAT] 【SEC307-R2】」に参加しました。
こちらのワークショップ(ハンズオン)では、S3へのアクセス制御を行うためData perimeter(データ境界)を構築しました。
ポリシーによるアクセス制御・予防的統制を改めて学ぶことができたので、実際に構築する際に必要となる考え方のベース・参照すべきドキュメントをここにまとめたいと思います。

※この記事はセッションレポートではありません。

re:Inventではなくre:Inforce2024ですが、Data perimeterについてのセッション動画も見つけました。
https://youtu.be/te8GsFjB6Fw?si=PJtkeGthpknJazwa

当記事および参照ドキュメントにおいては、上記re:Inforce時点ではまだなかったRCP = Resource Control Policy(re:Invent2024直前の11/13に発表!)を使用しています。

この記事でできるようになること

S3等に保存しているデータに対して、「誰が」「どこから」アクセスできるかの制御データ境界Data perimetersを構築するための基礎知識を整理できる。
※ここでいう「組織」とはAWS Organizationsで管理されている範囲を指します。

ここで話すこと

データを保護するためにどのポリシータイプに何を書くか

話さないこと

各ポリシーそのものの深い説明や評価ロジックについて

Data perimeters on AWSとは

[参考]
https://aws.amazon.com/identity/data-perimeters-on-aws/

組織のAWS環境内においてデータを保護するための境界として機能する許可ガードレールのセット。もっと噛み砕いて言うと、ポリシーのセットです。
アクセスできないものを制御するのではなく、 信頼されたアイデンティティのみが、期待されたネットワークから、信頼されたリソースにアクセスする ことを保証します。
既存のリソース単位ではなく、組織全体にSCP(Service Control Policy)・RCP(Resource Control Policy)・VPC endpoint policyを適用し、セキュリティの標準やベストプラクティスに準拠していることを保証します。

AWS Organizationsのポリシー

SCP(Service Control Policy)

IAMロールなど組織内のプリンシパルに付与される許可を制限するもの。
デフォルトでは全てのルートにFullAWSAccessがアタッチされています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

このように明示的なAllowが適用された上で、制限したい部分(OU・アカウント)にさらにSCPを適用することで組織内のあらゆるアクションを制限します。
[例]
「東京リージョンかつ特定のロール」以外からのS3へのアクセスを全て禁止するSCP

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyS3AccessOutsideSpecifiedRegion",
            "Effect": "Deny",
            "Action": [
                "s3:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": [
                        "ap-northeast-1"
                    ]
                },
                "ArnNotLike": {
                    "aws:PrincipalARN": [
                        "arn:aws:iam::*:role/Role1AllowedToBypassThisSCP",
                        "arn:aws:iam::*:role/Role2AllowedToBypassThisSCP"
                    ]
                }
            }
        }
    ]
}

[その他の例]
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_examples.html

RCP(Resource Control Policy)

組織内のリソースに対するアクセス許可を制限するもの。
2024年11月13日にリリースされました。
https://aws.amazon.com/jp/blogs/news/introducing-resource-control-policies-rcps-a-new-authorization-policy/

デフォルトではAWSリソースは外部プリンシパルからのアクセスを許可しません。
状況に応じて外部からのアクセスを明示的に許可します。この許可の付与をアプリケーション・システム等ごとに柔軟に設定することができます。(=★1)
これに対し、RCPを使用することで組織全体のリソースへのアクセス制御をコントロールできます。
つまり★1のような各アプリケーションごとの設定において適切でないアクセスが誤って許可されるのを防ぐことが可能となり、組織全体でのセキュリティ要件への準拠をコントロールできます。
[例]
リクエストが組織内のプリンシパルからでもなくAWSサービスからでもない場合、S3 バケットに対するアクセスを禁止するRCP

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnforceOrgIdentities",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {
                "StringNotEqualsIfExists": {
                    "aws:PrincipalOrgID": "{organizations ID}"
                },
                "BoolIfExists": {
                    "aws:PrincipalIsAWSService": "false"
                }
            }
        }
    ]
}

SCPとRCPの違い

SCPはIAMプリンシパルに付与される許可を制限し、RCPはリソースに付与される許可を制限します。
またSCPは誰(何)がアクセスしているかを評価し、RCPはリソースに対する全てのアクセスを評価します。

制限するもの いつ評価されるか
SCP IAMプリンシパルに付与される許可 IAMプリンシパルによる何らかのアクション発生時
RCP リソースに付与される許可 リソースへの何らかのアクション発生時

共通点として、どちらも許可を付与するものではなくアタッチした組織のルート・OU・アカウントに対して制限を設け、予防的統制を構築します。

VPC endpoint policy

VPCエンドポイントポリシーはVPCエンドポイントにアタッチできるリソースベースのポリシーで、AWSサービス(例: S3やDynamoDB)へのアクセスを制御するために使用されるポリシーです。
特定のVPCエンドポイントを通じて発生するリクエストに基づいてアクセス制御を定義します。
またリクエストがVPCエンドポイントを通過する際に評価されます。
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints-access.html

データ境界構築の考え方

概略

No 信頼する対象 保護する対象 使うポリシータイプ 具体例
IAMアイデンティティ リソース RCP S3バケットに対し特定のIAMロールのみPutObjectを許可する
IAMアイデンティティ ネットワーク VPC endpoint policy S3エンドポイントへのアクセスを特定のIAMロールに制限する
リソース IAMアイデンティティ SCP IAMロールが特定のS3のみ操作できるよう制限する
リソース ネットワーク VPC endpoiny policy VPCエンドポイント経由でのアクセスを特定のS3のみに制限する
ネットワーク IAMアイデンティティ SCP 特定のVPC外のIAMロールがEC2インスタンスを起動することを禁止する
ネットワーク リソース RCP 特定のVPCエンドポイントからのみRDSに接続を許可する

上記はこちらのData perimeter control objectives and capabilitiesの表を参考にしています。

使用する条件キーはこちらのドキュメントを参照。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html

順番がずれますが、具体的なポリシーを以下に示します。

【RCP】①リソースに対するアクセス制限:信頼されたアイデンティティのみ許可

ポリシー内容

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalArn": "arn:aws:iam::123456789012:role/TrustedRole"
        }
      }
    }
  ]
}

使用する条件キーと評価について

aws:PrincipalArnにより、リクエストを実行したプリンシパルが特定のIAMロール (arn:aws:iam::123456789012:role/TrustedRole)であるか評価。
このRCPがアタッチされた組織において、特定のIAMロール以外からのS3バケットへのPutObjectアクションを禁止する。

【RCP】⑥リソースに対するアクセス制限:信頼されたネットワークからのみ許可

ポリシー内容

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "rds:Connect",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:SourceVpce": "vpce-1234abcd"
        }
      }
    }
  ]
}

使用する条件キーと評価について

aws:SourceVpceにより、リクエストが特定のVPCエンドポイント (vpce-1234abcd) 経由で発生したかを評価。
このRCPがアタッチされた組織において、特定のVPCエンドポイントを経由しないRDSへの接続を禁止する。

【SCP】③アイデンティティに対するアクセス制限:信頼されたリソースへのアクションのみ許可

ポリシー内容

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ResourceAccount": "123456789012"
        }
      }
    }
  ]
}

使用する条件キーと評価について

aws:ResourceAccountにより、リクエスト対象のリソースが特定のAWSアカウント (123456789012) に属しているかを評価。
このSCPがアタッチされた組織において、特定のアカウント内以外へのS3操作をすべて禁止する。

【SCP】⑤アイデンティティに対するアクセス制限:信頼されたネットワークのみ許可

ポリシー内容

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpc": "vpc-1234abcd"
        }
      }
    }
  ]
}

使用する条件キーと評価について

aws:SourceVpcにより、リクエスト元のVPCが指定されたVPC (vpc-1234abcd) と一致するかを評価。(※VPCエンドポイントではない)
このSCPがアタッチされた組織において、特定のVPC以外からのEC2インスタンスの起動を拒否する。

【VPC endpoint policy】②ネットワークに対するアクセス制限:信頼されたアイデンティティのみアクセスを許可

ポリシー内容

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/TrustedRole"
      },
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::example-bucket/*"
    }
  ]
}

使用する条件キーと評価について

aws:PrincipalArnにより、アクセスを実行するアイデンティティが特定のIAMロール (arn:aws:iam::123456789012:role/TrustedRole) と一致するかを評価。
このポリシーがアタッチされたVPCエンドポイントにおいて、あるS3に対して特定のIAMロール以外からのリクエストを拒否します。

【VPC endpoint policy】④ネットワークに対するアクセス制限:信頼されたリソースへのアクセスのみ許可

ポリシー内容

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::example-bucket/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceAccount": "123456789012"
        }
      }
    }
  ]
}

使用する条件キーと評価について

aws:ResourceAccountにより、アクセスするS3バケットが特定のAWSアカウント (123456789012) に属しているかを評価。
このポリシーがアタッチされたVPCエンドポイントにおいて、特定のAWSアカウント内のS3バケットへのリクエストのみを許可します。

まとめ

re:Inventでのハンズオンセッション参加をきっかけに、改めてポリシーの種類と条件キーを整理することができました。
こういった厳密なアクセス制御は適切なポリシータイプの選択と条件の記述によって構築できます。

これは個人的な感想ですが、IAMにまつわるさまざまな概念を思考する際に言葉を的確に選んで表現することで厳密な定義を理解する楽しさだったり、それらを踏まえて評価ロジックを組み立ててTrue/False・Allow/Denyのはっきりした答えがあるところだったりがとてもおもしろいなーと感じました!
今後もまた現実世界のさまざまなユースケース・シナリオ視点でIAMを掘り下げて理解する試みをやってみようと思います。

GitHubで編集を提案
Fusic 技術ブログ

Discussion