x-amz-meta-codebuild-buildarnがついていることに気が付いた話
概要
あるとき、このブログのcurlを叩いてレスポンスヘッダーを調べてみると、何やらx-amz-meta-codebuild-buildarn
なるヘッダーがついていることに気が付きました。
このブログはNext.jsで作成したコードをCodeBuildでビルド→S3に配置する構成をとっているのですが、このS3にアーティファクトを配置する際にこのヘッダーが自動付与されるみたいです。
とくに問題なさそうならよかったのですが、このヘッダーばっちりAWSアカウントIDを載せてちゃってました。
1x-amz-meta-codebuild-buildarn: arn:aws:codebuild:Region:XXXXXXXXXXXX:build/ProjectName:CodebuildIdentifier
数か月気が付かずほったらかしにしてたの、今更ながら恐ろしい・・・
さすがにセキュリティ的にまずいと思い、このヘッダーを削除しておこう、というのが今回の内容になります。
対応方法
アプローチ
アプローチについてはいくつかあると思われます。
- アーティファクトの出力先としてS3を直指定から、aws s3 cpを使ってアップロードに変更
こちらは上記に記載させていただいた2つ目のブログに記載があった方法になりますが、構成自体に大きく変更を加えることは避けたかったため今回この方法は見送ることにしました。
- CloudFront Functionsの利用
こちらの方法だと関数を作成するぐらいになるので、構成変更もなく比較的取り組みやすいですが、コード作成の労力もそれなりにかかると思ったため他が見当たらなければこの方法にしようとしていました。
- CloudFrontのレスポンスヘッダー削除の利用
結論から言うと今回はこの方法を採用しました。
CloudFrontでは以前からレスポンスヘッダーの追加ができるようになるResponse headers policiesがサポートされていましたが、2023年1月頭にレスポンスヘッダーの削除もできるように機能追加されていました。(恥ずかしながらこのポリシー自体今回初めて知りました・・・笑)こちらだとコンソール上から消したいヘッダーを指定するだけで設定が完了しますので、即採用です。
実装
今回はいつもお世話になっているDevelopersIOでの検証記事を基に実装しました。
① 左ペイン「ポリシー」→「レスポンスヘッダー」タブへと移動し、「レスポンスヘッダーポリシーを作成」をクリック

② 名前を入力後、下部にある「ヘッダーを削除」欄の「ヘッダーを追加」ボタンをクリックし、x-amz-meta-codebuild-buildarn
を記載
完了したら「作成」ボタンをクリックする

③ 左ペイン「ディストリビューション」→ 対象のディストリビューションをクリック →「ビヘイビア」タブへ移動し、対象となるビヘイビアを選択後「編集」ボタンをクリック

④ 「キャッシュキーとオリジンリクエスト」欄にある「レスポンスヘッダーポリシー」から先ほど作成したポリシーを選択し、「変更を保存」をクリック

設定はこれだけです。すごい簡単ですね~
その後再度curlで確認してみると、指定したヘッダーが消えていることが確認できます。
※今回は他にも別のヘッダーを削除しています。
1$ curl -I https://mathenglog.net 2HTTP/1.1 200 OK 3Server: CloudFront 4Content-Type: text/html 5Content-Length: 17406 6Connection: keep-alive 7Date: Sat, 01 Jun 2024 18:11:01 GMT 8Last-Modified: Sat, 04 May 2024 15:24:52 GMT 9Accept-Ranges: bytes 10X-Cache: Hit from cloudfront 11Via: 1.1 6f829fd5f4986144adb37b6a46c04276.cloudfront.net (CloudFront) 12X-Amz-Cf-Pop: KIX50-P1 13Alt-Svc: h3=":443"; ma=86400 14X-Amz-Cf-Id: y8cvOQ1B0CzustHAdb0OsSQ5UTPXW4t0Yhx_i_Qx8ZzEEw-10nvgMQ== 15Age: 57610
注意点
DevelopersIOの記事にもありますが、ヘッダーによっては削除できないものがあります。

これらのヘッダーについてはこのCloudFrontのポリシー削除からは削除不可能なので、別途CloudFront FunctionsやLambda@Edgeなどの代用が必要になります。
まとめ
こういうのは気が付いたら時すでに遅しということも少なくありません。
たとえアカウントIDだけでもセキュリティインシデントにつながりかねないので、多方面からサイトを確認して皆さんも気を付けましょう!