【Security Hub修復手順】[CloudFront.16] CloudFront ディストリビューションでは、Lambda 関数 URL オリジンのオリジンアクセスコントロールを使用する必要があります

【Security Hub修復手順】[CloudFront.16] CloudFront ディストリビューションでは、Lambda 関数 URL オリジンのオリジンアクセスコントロールを使用する必要があります

AWS Security HubのCloudFront.16コントロール(Lambda関数URLオリジン向けオリジンアクセスコントロール設定)について、修復手順をご紹介します。
2026.09.27

かつまたです。

本記事では、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修復手順をご紹介します。

本記事の対象コントロール

[CloudFront.16] CloudFront ディストリビューションでは、Lambda 関数 URL オリジンのオリジンアクセスコントロールを使用する必要があります

[CloudFront.16] CloudFront distributions should use origin access control for Lambda function URL origins

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/cloudfront-controls.html#cloudfront-16

前提条件

本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容です。
AWS Security Hubの詳細についてはこちらのブログをご覧ください。

https://dev.classmethod.jp/articles/lets-learn-aws-security-hub/

https://dev.classmethod.jp/articles/aws-security-operation-with-securityhub-2021/

対象コントロールの説明

このコントロールは、Lambda 関数 URL をオリジンに持つCloudFrontディストリビューションで、オリジンアクセスコントロール(OAC)が設定されているかをチェックします。
OACが設定されていない場合、このコントロールは失敗します。

オリジンがS3バケットの場合は [CloudFront.13] が、Lambda 関数 URL の場合は本コントロールが評価対象になります。

対応が必要な理由

Lambda 関数 URL は、Lambda関数に割り当てられるHTTPSエンドポイントです。OACを使わずにCloudFrontのオリジンにする場合、認証タイプを NONE にして誰でもアクセスできる状態にしておく必要があります。

つまり、CloudFrontディストリビューションと関数 URL の2つの入口が並んで公開されます。検証環境で実際に確認すると、どちらからも同じ応答が返りました。

# CloudFront経由
$ curl -s https://d2rjfi7njde1in.cloudfront.net
Hello from Lambda function URL

# 関数 URL に直接
$ curl -s https://znsmj2qd2kbxqvseskja6uo6bu0pngar.lambda-url.ap-northeast-1.on.aws/
Hello from Lambda function URL

CloudFront側にWAFや地理的制限、署名付きURLを設定していても、関数 URL を直接呼ばれればすべて迂回されます。認証タイプが NONE の関数 URL はURLを知っていれば誰でも呼び出せるため、URLが漏えいした場合に防ぐ手段がありません。

OACを設定すると、CloudFrontがSigV4でリクエストに署名し、Lambdaのリソースベースポリシーで「このディストリビューション経由の呼び出しだけを許可する」と絞り込めます。本番環境・それ以外の環境を問わず設定することを推奨します。

修復手順

1. ステークホルダーに確認を取る

修復すると関数 URL への直接アクセスが遮断されます。事前に以下を確認してください。

  • 関数 URL を直接呼び出しているアプリケーションやバッチ処理がないか
  • 同じ関数 URL をオリジンにしているCloudFrontディストリビューションが他にないか
  • POST や PUT でリクエストボディを送る処理がないか(後述の注意点に該当します)

2つ目は、オリジンドメイン名で絞り込むと洗い出せます。

aws cloudfront list-distributions \
  --query "DistributionList.Items[?Origins.Items[?contains(DomainName, 'lambda-url')]].{Id:Id,Domain:DomainName,Origins:Origins.Items[].DomainName}" \
  --region us-east-1

2. OACを作成する

  1. CloudFrontコンソールを開き、左メニューから「オリジンアクセス」を選択します
  2. 「コントロール設定を作成」を選択します
  3. 名前を入力し、オリジンタイプに「Lambda」を選択して「Create」を選択します

署名動作は「署名リクエスト (推奨)」のままにします。

スクリーンショット 2026-09-22 20.28.00.png

3. Lambdaに CloudFront からの呼び出しを許可する

この手順だけはコンソールで実行できません。 Lambda 関数 URL のIAMポリシー編集はコンソール非対応であることが、AWS公式ドキュメントに明記されています。

To update the IAM policy for the Lambda function URL, you must use the AWS Command Line Interface (AWS CLI). Editing the IAM policy in the Lambda console isn't supported at this time.

Restrict access to an AWS Lambda function URL origin - Amazon CloudFront

次の2つのコマンドを実行します。lambda:InvokeFunctionUrl と lambda:InvokeFunction の両方が必要です。

aws lambda add-permission \
  --function-name <関数名> \
  --statement-id "AllowCloudFrontServicePrincipal" \
  --action "lambda:InvokeFunctionUrl" \
  --principal "cloudfront.amazonaws.com" \
  --source-arn "arn:aws:cloudfront::<アカウントID>:distribution/<ディストリビューションID>" \
  --region <関数のリージョン>

aws lambda add-permission \
  --function-name <関数名> \
  --statement-id "AllowCloudFrontServicePrincipalInvokeFunction" \
  --action "lambda:InvokeFunction" \
  --principal "cloudfront.amazonaws.com" \
  --source-arn "arn:aws:cloudfront::<アカウントID>:distribution/<ディストリビューションID>" \
  --region <関数のリージョン>

2025年10月以降に作成された関数 URL では、この2つの権限が揃っていないと403が返ります。以前は lambda:InvokeFunctionUrl だけで動作していたため、それより前に書かれた解説記事のコマンドをそのまま使うと修復後にアクセスできなくなります。

Starting in October 2025, new function URLs will require both lambda:InvokeFunctionUrl and lambda:InvokeFunction permissions.

Security and auth model for Lambda function URLs - AWS Lambda

なお、次の手順でオリジンにOACを割り当てると、コンソールにも同じコマンドが2つ表示されます。「Copy CLI command」ボタンからコピーできるので、こちらを使うとARNの入力を省けます。

スクリーンショット 2026-09-22 20.31.48.png

4. オリジンにOACを適用する

  1. 対象のディストリビューションを選択し、「オリジン」タブを開きます
  2. Lambda 関数 URL のオリジンを選択して「編集」を選択します
  3. プロトコルで「HTTPS のみ」を選択します
  4. 「Origin access control」で手順2で作成したOACを選択します
  5. 「変更を保存」を選択します

スクリーンショット 2026-09-22 20.31.42.png

5. デプロイの完了を待つ

ディストリビューションのステータスが「Deployed」になるまで待ちます。

aws cloudfront wait distribution-deployed --id <ディストリビューションID> --region us-east-1

この待ち時間を飛ばして次の手順に進むと、OACの設定が行き渡っていないエッジロケーションからのリクエストが署名されないまま送られ、403になるおそれがあります。

6. 関数 URL の認証タイプを変更する

  1. Lambdaコンソールで対象の関数を開き、「設定」タブから「関数 URL」を選択します
  2. 「編集」を選択します
  3. 認証タイプで「AWS_IAM」を選択し、「保存」を選択します

スクリーンショット 2026-09-22 20.35.01.png

OACは認証タイプが AWS_IAM であることを前提としています。NONE のままOACを設定しても、関数 URL は公開されたままです。

コンソールで認証タイプを変更すると、NONE 用に作成されていたパブリックアクセス許可のステートメントは自動で削除されます。「設定」タブの「アクセス権限」を開くと、CloudFront向けの2つだけが残っていることを確認できます。

スクリーンショット 2026-09-22 20.35.23.png

修復確認

CloudFront経由のアクセスは通り、関数 URL への直接アクセスは遮断されます。

# CloudFront経由
$ curl -s https://d2rjfi7njde1in.cloudfront.net
Hello from Lambda function URL

# 関数 URL に直接
$ curl -s https://znsmj2qd2kbxqvseskja6uo6bu0pngar.lambda-url.ap-northeast-1.on.aws/
{"Message":"Forbidden"}

Security Hubの検出結果がPASSEDに変わるまでには時間がかかる場合があります。

最後に

今回は、CloudFront.16の修復手順をご紹介しました。

CloudFront側の設定変更だけで終わらず、Lambdaのリソースベースポリシーと認証タイプをあわせて変更する必要がある点が、このコントロールの手間になります。特に権限付与はコンソールで完結しないため、CLIを使える環境を用意してから着手してください。

ご覧いただきありがとうございました。


AWS Security Hub 「基礎セキュリティのベストプラクティス」シリーズをご覧のあなたに特報!

本シリーズで紹介している各チェック項目(コントロール)について、推奨される対応方法や見解のまとめは、クラスメソッド経由でAWSをご活用されているお客様向けに特別公開しております。この機会にぜひ併せてご検討ください。

クラスメソッドのAWS総合支援を見る

何が提供されるの?

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事