当ブログですが、Cloud Armorを使い管理系機能のアクセスを制限をかけているのですが、appspot URL経由だと管理系機能にアクセス可能となるセキュリティホールが存在しています。
絵にするとこんな感じです。
AWSで当ブログを運用していた時、同様のセキュリティホールがあり以前記事を書いているのですが、
- 表門は施錠
- 裏門は開放状態
という全く同じ状況になっている訳です。
これ何とかしたいなーと思っていたところ、GAEにIngress Controlsという機能が追加されていたので、こちらを使い対策をすることにしました。
What is Ingress Controls??
GAEへのリクエストを制限する機能です。
この機能を使うことにより、
- GCPの同一プロジェクト内のVPCからのリクエストのみ許可
- GCPロードバランサと同一プロジェクト内のVPCからのリクエストのみ許可
ということが出来るようになります。
公式Docでは以下のことが書かれているので、GAEを使う場合の必須設定と思った方が良いですね。
注:AppEngineアプリでCloudLoad Balancingを使用する場合は、入力コントロールを使用して、アプリが内部トラフィックとCloud LoadBalancingトラフィックのみを受信するようにすることをお勧めします。それ以外の場合、ユーザーはアプリのappspot URL を使用して、GCLBで構成されたアクセス制御(Cloud Armor、IAP)を含むロードバランサーをバイパスできます。
設定
公式Doc記載のコマンド実行で簡単に設定出来ました。
- GCPロードバランサからのリクエストのみ許可
- GCP同一プロジェクト内のVPCからのリクエストのみ許可
を行うコマンドとなります。
gcloud app services update 【GAEのサービス名】 --ingress internal-and-cloud-load-balancing
動作確認
appspot URLにアクセスしてみます。
curl -s -D - -o /dev/null https://○○○.appspot.com/
HTTP/2 403
x-appengine-city: 接続をしようとした都市名を表示
x-appengine-citylatlong: 34.690081,135.195631
x-appengine-country: JP
x-appengine-region: 28
content-length: 1519
content-type: text/html; charset=UTF-8
date: Wed, 23 Dec 2020 12:56:04 GMT
alt-svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
403(リクエスト拒否)を返してくれています。
まとめ
appspot URLへの直接アクセスルートを遮断出来たのでスッキリしました。
CloudRunも同様の問題(run.appURLに直接アクセス可能)があるので、気になり調べてみましたが、ちゃんとIngress controls機能があるようです。
CloudRunをお使いの方もこのあたりはご注意された方よいと思います。