G-gen の佐々木です。当記事では、 Google Cloud (旧称: GCP ) の サーバーレスなコンテナ実行基盤である Cloud Run にデプロイしたサービスに対して、許可された Google アカウントだけがアクセスできるように、Identity-Aware Proxy を用いたアクセス制限を設定していきます。
さらに、Cloud Armor を使用することで、サービスのアクセス元ネットワークの IP アドレス範囲を制限します。
アーキテクチャ
構成図
当記事では、社内向けの Web サービスを想定し、Cloud Run で実行するサービスの前段にロードバランサを配置して、 IAP によるユーザー認証機能 と Cloud Armor による アクセス元 IP アドレス制限 を実装します。
Cloud Run がサーバーレスの特性を持つため、非常に安価に社内向けサービスを構築することができます。
使用するサービス
当記事で主に使用する Google Cloud のサービスは以下の 4 つです。
いずれも、ユーザによるインフラの管理が不要なマネージドサービスとなります。
Cloud Run
Cloud Run はサーバーレスな環境でコンテナを実行できるサービスです。
サービスの詳細については、以下の記事で解説しています。
Cloud Load Balancing
Cloud Load Balancing は、レイヤ 4 、レイヤ 7 のトラフィック分割を提供する、マネージドなロードバランサです。
Cloud Run サービスに対して、後述する Identity-Aware Proxy や Cloud Armor を使用したアクセス制御を行いたい場合、フロントエンドに Cloud Load Balancing の 1 つである、HTTP(S) ロードバランサ を使用する必要があります。
当記事で使用する グローバル外部 HTTP(S) ロードバランサ は、単一の外部 IP アドレスを用いてグローバルな (リージョンを跨いだ) トラフィック分割を実現できる、プロキシベースのレイヤ 7 ロードバランサです。
ロードバランサのバックエンドとして Cloud Run を使用する場合、Cloud Run サービスをサーバーレス ネットワーク エンドポイント グループ (サーバーレス NEG ) として設定します。
外部 HTTP(S) ロードバランサの詳細については、以下の記事で解説しています。
Identity-Aware Proxy
Identity-Aware Proxy ( 以下、IAP と記載 ) は、Web アプリケーションや、仮想マシンなどのクラウドリソースに対して、アプリケーションレベルの認証機能を提供するサービスです。
IAP を用いることで、Web アプリケーションや仮想マシンにアクセスできるユーザーを、IAP を利用できる IAM ロール がアタッチされた組織内 Google アカウント / グループ に制限することができます。
Cloud Armor
Cloud Armor は Google 製のクラウド型 WAF ( Web Application Firewall ) を利用できるサービスです。
Cloud Load Balancing に対して設定することで、DDoS 保護機能や、セキュリティポリシーによるネットワークアクセス元の制限など、ロードバランサの背後にあるサービスを保護する機能が提供されます。
Cloud Armor の詳細については、以下の記事で解説しています。
Cloud Run サービスの作成
以降は、基本的にはドキュメントに記載されている手順を参考にしていきます。
まず、Cloud Run サービスを作成していきます。
当記事ではサービスに対するアクセス制御をメインに扱うので、コンテナはサンプルで用意されているものを使用します。
「サンプル コンテナでテスト」 をクリックすることで、サンプルのコンテナイメージが自動で選択されます。
内向きトラフィックの許可を設定する項目で「内部」を選択し、「外部 HTTP(S) ロードバランサからのトラフィックを許可する」にチェックを入れます。
これにより、Cloud Run サービスの URL に対して、インターネットからの直接アクセスができなくなります。
認証 項目では「認証が必要」を選択します。
後ほど、IAP から Cloud Run サービスに接続できるように、IAP のサービスアカウントに対して権限を付与します。
ここまで設定したら、あとはデフォルトの設定のまま Cloud Run サービスを作成します。
デプロイが完了したら、サービスの URL に対して直接アクセスできないことを確認します。
IP アドレスの確保と DNS 設定
ロードバランサのバックエンドとして Cloud Run のようなサーバレス NEG を使用する場合、通信プロトコルは HTTPS のみに制限されます。
そのためにロードバランサに設定する SSL/TLS 証明書は、セルフマネージド SSL 証明書と Google マネージド SSL 証明書が使用できます(参考)。
今回は Google Cloud によって取得・管理される Google マネージド SSL 証明書を使用していきます。
Google マネージド SSL/TLS 証明書 はドメイン認証型(DV)の証明書です。ロードバランサの IP アドレスを参照する A または AAAA レコードをドメインの DNS ゾーンに登録するだけで、Google がドメイン所有権を確認して、証明書が発行されます。
そこで、ロードバランサに使用する IP アドレスを事前に確保し、DNS レコードの設定を行っておきます。
ロードバランサは グローバル外部 HTTP(S) ロードバランサ を使用するため、タイプを グローバル に設定して IP アドレスを予約します。
確保した IP アドレスを参照する A レコードを Cloud DNS に設定します。
HTTPS Load Balancing の設定
ロードバランサの種類を選択する
Cloud Run サービスの前段に配置するロードバランサを作成していきます。
ロードバランサの作成画面で「 HTTP(S) ロードバランシング」を選択し、次の画面では「インターネットから VM またはサーバーレス サービスへ」と「グローバル HTTP(S) ロードバランサ」にチェックを入れます。
ロードバランサのフロントエンドを構成する
ロードバランサのフロントエンドを構成していきます。
プロトコル 項目に「 HTTPS(HTTP/2 を含む)」を選択し、先ほど確保した IP アドレスを設定して、証明書を新規に作成していきます。
「Google マネージドの証明書を作成する」を選択し、ドメイン 1 項目 に今回使用するドメイン名を入力します。
ここに入力したドメイン名で、ロードバランサに設定する IP アドレスを名前解決することができれば、ロードバランサ作成後に証明書のプロビジョニングが成功します。
フロントエンドの構成は以上なので、次にバックエンドの構成をしていきます。
ロードバランサのバックエンドを構成する
バックエンドサービスとして、Cloud Run を使用するサーバーレス NEG を作成していきます。
バックエンド タイプ 項目で「サーバーレス ネットワーク エンドポイント グループ」を選択し、新しいバックエンド 項目でサーバーレス NEG を作成します。
「 Cloud Run 」を選択し、始めに作成した Cloud Run サービスを選択します。
サーバーレス NEG を作成したらバックエンドサービスとして設定し、ロードバランサを作成します。
SSL/TLS 証明書のプロビジョニング状態を確認する
作成されたロードバランサの詳細画面から、証明書のステータスを確認していきます。
ロードバランサの作成からしばらく待つと、証明書のステータスが ACTIVE になります。
IAP の設定
ロードバランサ経由で Cloud Run サービスにアクセスできましたが、このままではインターネット上のすべてのユーザーがサービスにアクセスできてしまいます。
ここからロードバランサに対して IAP を設定し、組織内のユーザーのみがサービスにアクセスできるようにします(参考)。
OAuth 同意画面を設定する
IAP を使用するためには、プロジェクトで OAuth 同意画面 を作成しておく必要があります。
User Type 項目に「内部」を選択し、サポートメール 項目に自身のメールアドレスなどを入力して、任意のアプリケーション名を設定して保存します。
ロードバランサに対して IAP を有効化する
作成したロードバランサで IAP を使用するように設定します。
これで、Cloud Run サービスにログインする際に、Google アカウントの認証が要求されるようになります。
ユーザーに対して IAP 経由のアクセスを許可する
IAP 経由のアクセスができるように、サービスにアクセスする組織内ユーザーに対して「 IAP-secured Web App User 」ロールを設定します。
IAP が Cloud Run サービスに対して認証できるようにする
プロジェクトごとに存在する IAP のサービスアカウントに対して、Cloud Run サービスを呼び出す権限を付与します。
IAP のサービスアカウントのプリンシパル名は以下のような形式になっています。
service-<プロジェクト番号>@gcp-sa-iap.iam.gserviceaccount.com
※プロジェクト番号は Google Cloud コンソールの Welcome ページ などで確認できます。
上記のプリンシパルに対して「Cloud Run 起動元」ロールを付与します。
IAP 有効化を確認する
ロードバランサ経由で Cloud Run サービスにアクセスすると、Google アカウントのログイン画面が表示されるようになります。
先ほど IAP-secured Web App User ロールを付与した組織内ユーザーでログインします。
サンプルのコンテナでは、サービスにアクセスすると以下のような画面が表示されます。
組織外の Google アカウントを使用してログインを試みると、以下のような画面が表示され、アクセスが拒否されます、
Cloud Armor の設定
Cloud Armor ポリシーを作成する
最後に、ロードバランサに対して Cloud Armor を設定し、Cloud Run サービスにアクセスできる IP アドレス範囲を制限します。
バックエンド セキュリティポリシーでデフォルトのルール アクションを「許可しない」に設定し、許可ルールに一致しないアクセスはすべて拒否するようにします。
ルールの追加 から、許可ルールを設定していきます。
サービスへのアクセスを許可する IP アドレス範囲を設定し、アクション 項目で「許可」を選択します。
優先度 は拒否ルールより小さい数字になっていればよいので、1000 を設定しておきます。
ターゲットへのポリシーの適用 項目でロードバランサ作成時に設定したバックエンドサービスを選択し、Cloud Armor ポリシーを作成します。
ポリシーの適用を確認する
Cloud Armor ポリシーにより、許可された IP アドレス範囲からしか Cloud Run サービスにアクセスできないことを確認します。
許可された IP アドレス範囲からアクセスした場合、IAP による Google アカウント認証のあと、サービスへのアクセスが成功します。
許可されていない IP アドレス範囲からアクセスした場合は、エラー画面が表示されます。
これで、許可された IP アドレス範囲からアクセスし、かつ サービスへのアクセスが許可された Google アカウントを持つ組織内ユーザーのみが、Cloud Run サービスにアクセスできるようになりました。
佐々木 駿太 (記事一覧)
G-gen最北端、北海道在住のクラウドソリューション部エンジニア
2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2024に選出。好きなGoogle CloudプロダクトはCloud Run。
趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。
Follow @sasashun0805