terraform で CloudFront マネージドプリフィックスリストを利用したアクセス制限
https://aws.amazon.com/jp/about-aws/whats-new/2022/02/amazon-cloudfront-managed-prefix-list/
VPC が CloudFront のマネージドプリフィックスリストをサポートするようになりました。
これにより CloudFront からのアクセスをセキュリティグループルールベースでアクセス制限できるようになります。
早速 terraform で実装してみた
以下の構成を想定しています。
1 | CloudFront-->ALB |
ALB にアタッチするセキュリティグループで CloudFront のマネージドプリフィックスリスト ID のみ許可するようにします。
1 | # CloudFront のマネージドプリフィックスリスト取得 |
セキュリティグループルールベースで CloudFront からのアクセスを許可できました。
CloudFront のプレフィックスリストの取得方法について
プレフィックスリストの取得方法でどんな実装が正しいのか試行錯誤しました。
結論から言うと data “ec2_managed_prefix_list” を採用しました。
全てのリージョンで com.amazonaws.global.cloudfront.origin-facing
で指定されており、リージョン変更に柔軟な構成にしました。
1 | data "aws_ec2_managed_prefix_list" "cloudfront" { |
以下 data "aws_prefix_list"
で ID 直指定でも取得できましたが
リージョン毎に値が異なり、リージョン変更した場合に利用できません。
1 | data "aws_prefix_list" "cloudfront" { |
以下、 name 指定の場合、エラーになりました。
1 | data "aws_prefix_list" "cloudfront" { |
エラー内容
1 | Error: no matching prefix list found; the prefix list ID or name may be invalid or not exist in the current region |
参考: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/prefix_list#name
Filter 指定する場合、ステップ数も増えます。
シンプルな実装で済む data "aws_ec2_managed_prefix_list"
が最適と判断しました。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/prefix_list#filter
よりセキュアに
これは CloudFront のマネージドプリフィックリストでの制御とは話が逸れるところですが、
WAF or ALB のリスナールールでドメイン名で制限しておくとよりセキュアです。
1 つのリポジトリで app, admin と双方のコードを書いていて、
ルーティングに特に制限をかけていない場合、
以下のようにインターネット越しにアクセスできてしまう可能性があります。
1 | curl -H "Host: admin.example.com" https://example.com/login |
上記のような処理を防止すべく、
以下処理では、ALB リスナールールでデフォルト処理がメンテページ表示にし
指定したドメイン名の場合のみバックエンドへルーティングさせています。
1 | resource "aws_cloudfront_distribution" "app" { |
CloudFront 経由でないとアクセスできないようにする、に加えて、
さらにドメイン名によるアクセス制限を加えることでより
意図しない CloudFront からのルーティングを回避できます。
総評
既存では CloudFront のカスタムヘッダーに値を入れて
ALB の WAF でその値を照合するような仕組みを採用していましたが、
よりシンプルな実装にできました。
実質、セキュリティグループルールベースでの許可となるので
ALB → CloudFront + ALB への構成への移行もしやすくなったと感じました。
これは有難いアップデートです ♪
以上
参考になれば幸いです。
terraform で CloudFront マネージドプリフィックスリストを利用したアクセス制限
https://kenzo0107.github.io/2022/02/09/2022-02-10-cloudfront-managed-prefix/