Identity-Aware Proxy(IAP)とCloud Armorを使用してCloud Runサービスへのアクセス制御を実装する

記事タイトルとURLをコピーする

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 はサーバーレスな環境でコンテナを実行できるサービスです。
サービスの詳細については、以下の記事で解説しています。

blog.g-gen.co.jp

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) ロードバランサの詳細については、以下の記事で解説しています。

blog.g-gen.co.jp

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 の詳細については、以下の記事で解説しています。

blog.g-gen.co.jp

Cloud Run サービスの作成

以降は、基本的にはドキュメントに記載されている手順を参考にしていきます。

まず、Cloud Run サービスを作成していきます。
当記事ではサービスに対するアクセス制御をメインに扱うので、コンテナはサンプルで用意されているものを使用します。
サンプル コンテナでテスト」 をクリックすることで、サンプルのコンテナイメージが自動で選択されます。

サンプルコンテナの使用

内向きトラフィックの許可を設定する項目で「内部」を選択し、「外部 HTTP(S) ロードバランサからのトラフィックを許可する」にチェックを入れます。
これにより、Cloud Run サービスの URL に対して、インターネットからの直接アクセスができなくなります。

認証 項目では「認証が必要」を選択します。
後ほど、IAP から Cloud Run サービスに接続できるように、IAP のサービスアカウントに対して権限を付与します。

内向きトラフィックの許可と認証の設定

ここまで設定したら、あとはデフォルトの設定のまま Cloud Run サービスを作成します。
デプロイが完了したら、サービスの URL に対して直接アクセスできないことを確認します。

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 アドレスの確保

確保した IP アドレスを参照する A レコードを Cloud DNS に設定します。

確保した IP アドレスを Cloud DNS に設定

HTTPS Load Balancing の設定

ロードバランサの種類を選択する

Cloud Run サービスの前段に配置するロードバランサを作成していきます。
ロードバランサの作成画面で「 HTTP(S) ロードバランシング」を選択し、次の画面では「インターネットから VM またはサーバーレス サービスへ」と「グローバル HTTP(S) ロードバランサ」にチェックを入れます。

HTTP(S) ロードバランシングを選択

グローバル HTTP(S) ロードバランサを選択

ロードバランサのフロントエンドを構成する

ロードバランサのフロントエンドを構成していきます。
プロトコル 項目に「 HTTPS(HTTP/2 を含む)」を選択し、先ほど確保した IP アドレスを設定して、証明書を新規に作成していきます。

フロントエンドの構成

Google マネージドの証明書を作成する」を選択し、ドメイン 1 項目 に今回使用するドメイン名を入力します。
ここに入力したドメイン名で、ロードバランサに設定する IP アドレスを名前解決することができれば、ロードバランサ作成後に証明書のプロビジョニングが成功します。

証明書の作成

フロントエンドの構成は以上なので、次にバックエンドの構成をしていきます。

ロードバランサのバックエンドを構成する

バックエンドサービスとして、Cloud Run を使用するサーバーレス NEG を作成していきます。
バックエンド タイプ 項目で「サーバーレス ネットワーク エンドポイント グループ」を選択し、新しいバックエンド 項目でサーバーレス NEG を作成します。

バックエンドの構成

Cloud Run 」を選択し、始めに作成した Cloud Run サービスを選択します。

サーバーレス NEG の作成

サーバーレス NEG を作成したらバックエンドサービスとして設定し、ロードバランサを作成します。

バックエンドサービスを設定してロードバランサを作成

SSL/TLS 証明書のプロビジョニング状態を確認する

作成されたロードバランサの詳細画面から、証明書のステータスを確認していきます。

証明書の確認

ロードバランサの作成からしばらく待つと、証明書のステータスが ACTIVE になります。

証明書のステータスの確認

IAP の設定

ロードバランサ経由で Cloud Run サービスにアクセスできましたが、このままではインターネット上のすべてのユーザーがサービスにアクセスできてしまいます。
ここからロードバランサに対して IAP を設定し、組織内のユーザーのみがサービスにアクセスできるようにします(参考)。

OAuth 同意画面を設定する

IAP を使用するためには、プロジェクトで OAuth 同意画面 を作成しておく必要があります。
User Type 項目に「内部」を選択し、サポートメール 項目に自身のメールアドレスなどを入力して、任意のアプリケーション名を設定して保存します。

同意画面の作成

ロードバランサに対して IAP を有効化する

作成したロードバランサで IAP を使用するように設定します。
これで、Cloud Run サービスにログインする際に、Google アカウントの認証が要求されるようになります。

IAP の有効化

ユーザーに対して IAP 経由のアクセスを許可する

IAP 経由のアクセスができるように、サービスにアクセスする組織内ユーザーに対して「 IAP-secured Web App User 」ロールを設定します。

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 起動元」ロールを付与します。

Cloud Run にプリンシパルを追加

Cloud Run 起動元ロールの付与

IAP 有効化を確認する

ロードバランサ経由で Cloud Run サービスにアクセスすると、Google アカウントのログイン画面が表示されるようになります。
先ほど IAP-secured Web App User ロールを付与した組織内ユーザーでログインします。

IAP 有効化の確認

サンプルのコンテナでは、サービスにアクセスすると以下のような画面が表示されます。

サンプルアプリケーションの表示

組織外の Google アカウントを使用してログインを試みると、以下のような画面が表示され、アクセスが拒否されます、

組織外の Google アカウントを使用した場合

Cloud Armor の設定

Cloud Armor ポリシーを作成する

最後に、ロードバランサに対して Cloud Armor を設定し、Cloud Run サービスにアクセスできる IP アドレス範囲を制限します。
バックエンド セキュリティポリシーデフォルトのルール アクションを「許可しない」に設定し、許可ルールに一致しないアクセスはすべて拒否するようにします。

デフォルトの拒否ルールを設定

ルールの追加 から、許可ルールを設定していきます。
サービスへのアクセスを許可する IP アドレス範囲を設定し、アクション 項目で「許可」を選択します。
優先度 は拒否ルールより小さい数字になっていればよいので、1000 を設定しておきます。

許可ルールにサービスアクセスを許可する IP アドレスを設定

ターゲットへのポリシーの適用 項目でロードバランサ作成時に設定したバックエンドサービスを選択し、Cloud Armor ポリシーを作成します。

ロードバランサのバックエンドサービスにポリシーを適用

ポリシーの適用を確認する

Cloud Armor ポリシーにより、許可された IP アドレス範囲からしか Cloud Run サービスにアクセスできないことを確認します。
許可された IP アドレス範囲からアクセスした場合、IAP による Google アカウント認証のあと、サービスへのアクセスが成功します。

許可された IP アドレス範囲からのアクセス

許可されていない IP アドレス範囲からアクセスした場合は、エラー画面が表示されます。

許可されていない IP アドレス範囲からのアクセス

これで、許可された IP アドレス範囲からアクセスし、かつ サービスへのアクセスが許可された Google アカウントを持つ組織内ユーザーのみが、Cloud Run サービスにアクセスできるようになりました。

佐々木 駿太 (記事一覧)

G-gen最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2024に選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。