[アップデート] Organizations環境のリソースアクセス制御がめっちゃ楽になる!IAMグローバル条件キーが追加されました(aws:SourceOrgID, aws:SourceOrgPaths)

[アップデート] Organizations環境のリソースアクセス制御がめっちゃ楽になる!IAMグローバル条件キーが追加されました(aws:SourceOrgID, aws:SourceOrgPaths)

Clock Icon2023.11.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以下アップデートを紹介します。

AWS Organizations 環境において、 リソースベースポリシーの管理を簡素にする 新しい IAMグローバル条件キーが登場しました。 以下2つです。

何が嬉しいか

AWS Organizations 組織内における、 リソースベースポリシーの管理がめっちゃ楽になります

「どれぐらいめっちゃ楽になるか」は例を見ると分かると思います。

例として、メンバーアカウント上の VPC Flow Logs を 特定S3バケットへ集約したいときに必要な ステートメントBefore/Afterを記載します。

↓ 必要なステートメント Before

"Effect": "Allow",
"Principal": {
  "Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Condition": {
  "StringEquals": {
    "aws:SourceAccount": [
      "MEMBER-ACCOUNT-A-ID",
      "MEMBER-ACCOUNT-B-ID",
      "MEMBER-ACCOUNT-C-ID",
      "MEMBER-ACCOUNT-D-ID",
      "MEMBER-ACCOUNT-E-ID",
      "MEMBER-ACCOUNT-F-ID"
    ]
  }
}

↓ 必要なステートメント After

"Effect": "Allow",
"Principal": {
  "Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Condition": {
  "StringEquals": {
    "aws:SourceOrgID": "MY-ORGANIZATION-ID"
  }
}

めっちゃ楽になりましたね。

もう少し詳しく

改めて、以下2つのグローバル条件キーが登場しました。

これらは「プリンシパルがAWSサービスの場合」に 利用できる条件キーになります。 例えば以下のようなケースです。

  • VPC Flow Logs を S3バケットへ配信する (プリンシパル = delivery.logs.amazonaws.com )
  • CloudTrail証跡を S3バケットへ配信する (プリンシパル = cloudtrail.amazonaws.com )
  • SNSトピックが SQSキューへメッセージを送信する (プリンシパル = sns.amazonaws.com )

これら送信先のリソースベースポリシー(上の例だと S3, SQS)上で、 「 aws:SourceOrgID , aws:SourceOrgPaths を使った送信元制御」 ができるようになりました。

余談: PrincipalOrgID は使えないの?

ちなみに似たような条件キーとして aws:PrincipalOrgID および aws:PrincipalOrgPaths が既にありました。 これもリクエスト元を組織 or 組織単位に絞る場合に活用できるのですが、 AWSサービスプリンシパルでは使えません 。 IAMユーザーやIAMロール経由のアクセスでのみ使えます。

この制約が大きく、ハマりやすいです。 以下のようなブログもありました。

「PrincipalOrgID、サービスプリンシパルにも対応しないかな〜」 とずっと思っていたのですが(以下画像)、 それを「新たな条件キーで解決する」ようなアップデートが来た、というわけですね。

img

試してみる

VPC Flow Logs を「組織内の別アカウント」にあるS3バケットに配信してみます。

S3バケットには以下のようなバケットポリシーを設定しました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/AWSLogs/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:SourceOrgID": "o-example",
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    },
    {
      "Sid": "AWSLogDeliveryAclCheck",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
    }
  ]
}

以下のような VPC Flow Logs を設定しました。 LogDestinationの値が「組織内の別アカウント」にあるS3バケットです。

# aws ec2 describe-flow-logs --output yaml
FlowLogs:
- CreationTime: '2023-11-17T00:33:32.921000+00:00'
  DeliverLogsStatus: SUCCESS
  DestinationOptions:
    FileFormat: plain-text
    HiveCompatiblePartitions: false
    PerHourPartition: false
  FlowLogId: fl-example
  FlowLogStatus: ACTIVE
  LogDestination: arn:aws:s3:::DOC-EXAMPLE-BUCKET
  LogDestinationType: s3
  LogFormat: ${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport}
    ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status}
  MaxAggregationInterval: 600
  ResourceId: vpc-example
  Tags: []
  TrafficType: ALL

しばらくすると、配信されていることが確認できました。

img

今までは Resoruce句やCondition句で AWSアカウントを列挙しないといけなかったのですが、 それが不要になりました。めっちゃ便利です。

おわりに

以上、 "アツい" グローバル条件キー追加の紹介でした。

マルチアカウント管理では「何かしら集約するケース」が多いです。 今回のアップデートで楽に集約できるケースが増えたのが嬉しいですね。

以上、参考になれば幸いです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.