|

2024-12-16

Tips

Cloud Storageバケットへの直接アクセスを制限する方法

Google Cloud

Cloud StorageへのアクセスをCloud CDN経由のみに絞りたい

AWS CloudFrontだとOrigin Access Control (OAC)を利用してオリジンへのアクセス制限が可能ですが、Google Cloudだと違った実装が必要になります。

GCLB (Google Cloud Load Balancer)にはIAM権限を直接付与する事ができない

一般的にCloud Storageのオブジェクトを公開するには、ACLにてallUsersにオブジェクト閲覧権限を付与する形になります。

この場合は前段にCloud CDNを機能として含むGCLBを設定していても、オリジン(バケット)直アクセスが可能となってしまいます。

 

Compute EngineなどリソースによってはIAM権限を付与してアクセス許可が可能ですが、悩ましい事にGCLBにはIAM権限を直接付与する事ができません。

AllUsersを使用せずにアクセスできるようにする手順を以下でご紹介します。

実装手順

  1. サービスアカウントを用意し、バケットへの参照権限(roles/storage.objectViewer)を付与

 

2.サービスアカウントのHMACキーを作成

Cloud Storageのコンソールから設定画面に行き、相互運用性のタブを選択します。 image

 

下の方へスクロールし、HMAC認証のためユーザーアカウントのアクセスキーを作成します。 image

 

3.GCLBのバックエンドにバケットではなくInternetNEGを設定、ドメインに「storage.googleapis.com」を設定 image

 

4.カスタムヘッダーにて「Host: <バケット名>.storage.googleapis.com」を追加 image

合わせてCloud CDNも有効化します。

 

5.Cloud CDNの非公開送信元の認証にて、2.で作ったHMACキーを登録

こちらだけコンソールでの実装ができないので、CLIやterraform等での実装が必要になります。

 

以下CLIの場合です。

非公開送信元のバックエンド構成をYAMLファイルにエクスポート

gcloud compute backend-services export BACKEND_SERVICE_NAME \ [--destination=DESTINATION]

YAMLを編集してbackendServices の securitySettings セクションで、追加の構成オプションを指定

securitySettings: awsV4Authentication: accessKeyId: ACCESS_KEY_ID accessKey: ACCESS_KEY [accessKeyVersion: ACCESS_KEY_VERSION] originRegion: REGION

バックエンドサービスに構成を再度インポート

gcloud compute backend-services import BACKEND_SERVICE_NAME \ [--source=SOURCE]

 

ちなみに、バックエンドサービスをコンソールなどから変更すると、インポートした設定も消えてしまうので要注意です。(なので長期的に運用していく場合はterraform等での実装がおすすめです。)

 

以上で実装は完了になります。

多少手順を踏む必要はございましたが、希望通りGoogle Cloudでのオリジンアクセス制限を実現する事ができました。

まとめ

今回の記事では、Google CloudにおけるCDN+Storage構成でのオリジンアクセス制限の実装方法を紹介しました。

これで直接オリジンにアクセスされる事がなく安心です!

またCloud StorageをGCLBのバックエンドサービスとしてぶら下げる事で、WAFを含むCloud Armorのバックエンドセキュリティポリシーも適用できるようになったのも地味に嬉しいポイントです。


この記事の著者

プロフィール画像

金谷 洋佑

朝日放送グループホールディングス株式会社 DX・メディアデザイン局 R&Dチーム

動画・広告配信を主に取り組んでおり、その傍らでシステムのモダナイズの提案・支援や開発も担当。アプリケーションからネットワーク・セキュリティ・インフラまで幅広く励んでます!