[アップデート] Organizations環境のリソースアクセス制御がめっちゃ楽になる!IAMグローバル条件キーが追加されました(aws:SourceOrgID, aws:SourceOrgPaths)
以下アップデートを紹介します。
AWS Organizations 環境において、 リソースベースポリシーの管理を簡素にする 新しい IAMグローバル条件キーが登場しました。 以下2つです。
- aws:SourceOrgID (公式ドキュメントリンク)
- aws:SourceOrgPaths (公式ドキュメントリンク)
何が嬉しいか
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:SourceOrgID (公式ドキュメントリンク)
- 値のサンプル:
o-a1b2c3d4e5
- 値のサンプル:
- aws:SourceOrgPaths (公式ドキュメントリンク)
- 値のサンプル:
o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/
- 値のサンプル:
これらは「プリンシパルが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、サービスプリンシパルにも対応しないかな〜」 とずっと思っていたのですが(以下画像)、 それを「新たな条件キーで解決する」ようなアップデートが来た、というわけですね。
試してみる
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
しばらくすると、配信されていることが確認できました。
今までは Resoruce句やCondition句で AWSアカウントを列挙しないといけなかったのですが、 それが不要になりました。めっちゃ便利です。
おわりに
以上、 "アツい" グローバル条件キー追加の紹介でした。
マルチアカウント管理では「何かしら集約するケース」が多いです。 今回のアップデートで楽に集約できるケースが増えたのが嬉しいですね。
以上、参考になれば幸いです。