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
を使用せずにアクセスできるようにする手順を以下でご紹介します。
実装手順
- サービスアカウントを用意し、バケットへの参照権限(
roles/storage.objectViewer
)を付与
2.サービスアカウントのHMACキーを作成
Cloud Storageのコンソールから設定画面に行き、相互運用性のタブを選択します。
下の方へスクロールし、HMAC認証のためユーザーアカウントのアクセスキーを作成します。
3.GCLBのバックエンドにバケットではなくInternetNEGを設定、ドメインに「storage.googleapis.com」を設定
4.カスタムヘッダーにて「Host: <バケット名>.storage.googleapis.com」を追加
合わせて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のバックエンドセキュリティポリシーも適用できるようになったのも地味に嬉しいポイントです。