クロスアカウントで1週間どハマりしてたけど、ペアプロで解決したああああ!ブログ書くぞ!
— adachin👾SRE (@adachin0817) July 23, 2024
4ヶ月ぶりのブログとなります!直近はセキュリティ周りの基盤を設計していまして、Amazon Inspectorでクロスアカウント先のS3に調査結果をCSVでエクスポートしようとしたら久しぶりにドハマリしました。今回初めてクロスアカウントでのポリシー設定を行ったので、みんなもハマらないようにぜひ参考にしてみてください。(みんなできるかも…)
構成
- Account A(Organizations)
- Amazon Inspector
- Account B(Organizations)
- KMS
- S3
Inspectorの結果はそれぞれのアカウントのS3で管理するよりもデータ専用のアカウントで管理した方が後々分析がしやすくなります。構成図にすると非常にシンプルに見えますね。Organizationsで管理されているAWSアカウントAから、アカウントBのS3にInspectorの調査結果をCSV形式でエクスポートするだけですが、いくつかの課題があります。クロスアカウントでどのKMSを利用するか、またどのようにポリシーを設定すればいいかについての懸念があります。エクスポート時にうまくいかない場合、以下のようなエラーが永遠と出てくる状態になります。
Access denied to S3 bucket. Confirm the S3 bucket details and KMS key policy and try again.
今回はアカウントBのKMSとS3をTerraformで設定してみました。
Terraform
- kms.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
resource "aws_kms_key" "s3_bucket_key" { description = "hoge" enable_key_rotation = true policy = jsonencode({ "Version" : "2012-10-17", "Id" : "key-consolepolicy-3", "Statement" : [ { "Sid" : "Enable IAM User Permissions", "Effect" : "Allow", "Principal" : { "AWS" : [ "arn:aws:iam::${account_a}:root", "arn:aws:iam::${account_b}:root" ] }, "Action" : "kms:*", "Resource" : "*" }, { "Sid" : "Allow use of the key", "Effect" : "Allow", "Principal" : { "Service" : "inspector2.amazonaws.com" }, "Action" : [ "kms:Decrypt", "kms:GenerateDataKey*" ], "Resource" : "*" } ] }) tags = { Name = "hoge-inspector-key" } } |
アカウント Aではなく、アカウント Bに対してまずはKMSを作成しましょう。ポリシーですが、まずそれぞれのアカウントに対してのPrincipalはアカウント AとBを指定します。ActionはKMSすべての権限にしました。次はサービスに対してのPrincipalは inspector2.amazonaws.com
を指定し、ActionはKMSのDecryptとGenerateDataKeyを許可します。
個人的にInspector専用のIAMロールを作成するのかと思いきや、Principalでサービス名を指定しているので作成する必要がありません。(思い込みはNG!)
- s3.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
resource "aws_s3_bucket" "inspector_hoge" { bucket = "inspector-hoge" tags = { Name = "inspector-hoge" Environment = "Prod" } } resource "aws_s3_bucket_versioning" "inspector_hoge_versioning" { bucket = aws_s3_bucket.inspector_hoge.id versioning_configuration { status = "Enabled" } } resource "aws_s3_bucket_server_side_encryption_configuration" "inspector_hoge_encryption" { bucket = aws_s3_bucket.inspector_hoge.id rule { apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" kms_master_key_id = aws_kms_key.s3_bucket_key.arn } } } resource "aws_s3_bucket_logging" "inspector_hoge_logging" { bucket = aws_s3_bucket.inspector_hoge.id target_bucket = aws_s3_bucket.log_hoge.id target_prefix = "inspector-hoge/" } resource "aws_s3_bucket_public_access_block" "inspector_hoge" { bucket = aws_s3_bucket.inspector_hoge.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } resource "aws_s3_bucket_policy" "inspector_reports_policy" { bucket = aws_s3_bucket.inspector_hoge.id policy = jsonencode({ "Version" : "2012-10-17", "Statement" : [ { "Sid" : "allow-inspector", "Effect" : "Allow", "Principal" : { "Service" : "inspector2.amazonaws.com" }, "Action" : [ "s3:PutObject", "s3:PutObjectAcl", "s3:AbortMultipartUpload" ], "Resource" : "arn:aws:s3:::inspector-hoge/*", "Condition" : { "StringEquals" : { "aws:SourceAccount" : "${account_a}" }, "ArnLike" : { "aws:SourceArn" : "arn:aws:inspector2:ap-northeast-1:${account_a}:report/*" } } } ] }) } resource "aws_s3_object" "exported_csv" { for_each = toset(var.folders) bucket = aws_s3_bucket.inspector_hoge.bucket key = "${each.value}/test.txt" source = "test.txt" } |
- variables.tf
1 2 3 4 5 6 7 8 |
variable "folders" { type = list(string) default = [ "account-a", "account-c", "account-d" ] } |
S3はアカウント Bで作成したKMSを指定し、ポリシーは inspector2.amazonaws.com
に対して、ActionでS3のPutObject、PutObjectAcl、AbortMultipartUploadを許可しましょう。リソースのS3 ARNではアカウント Aに対してreportを指定します。
以上でアカウントAからBのS3にinspectorのCSVをエクスポートする準備が整いました。以下Inspectorの権限周りについてAWSのドキュメントがありますので、参考にしてみてください。
https://docs.aws.amazon.com/ja_jp/inspector/latest/user/findings-managing-exporting-reports.html
Test
まとめ
クロスアカウントは複雑でゲキムズですが、一度経験すればあとは他のサービスも同様と感じました。自分はポリシーを複雑にし過ぎてしまったのと、ChatGPTは頼らずドキュメントを読みましょう!と反省。
ちなみに転職して2ヶ月目ということで、先々週に会社のイベントでLTしてきました。入社エントリーは気が向いたら書きますので、しばしお待ちくださいませ!んじゃまた!
https://findy.connpass.com/event/323099/
🍺!!
#techbrew_findy pic.twitter.com/E7kwKx7riO— adachin👾SRE (@adachin0817) July 11, 2024
https://t.co/Vwf1aiUGYS
本日のスライドです!!!#techbrew_findy— adachin👾SRE (@adachin0817) July 11, 2024
0件のコメント