以下アップデートを紹介します。
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アカウントを列挙しないといけなかったのですが、 それが不要になりました。めっちゃ便利です。
おわりに
以上、 "アツい" グローバル条件キー追加の紹介でした。
マルチアカウント管理では「何かしら集約するケース」が多いです。 今回のアップデートで楽に集約できるケースが増えたのが嬉しいですね。
以上、参考になれば幸いです。