Cloud Run の上り(内向き)トラフィックの保護

1. 概要

このラボでは、Cloud Run サービスへのアクセスを制限し、オンプレミスまたはプロジェクトの VPC で実行されているワークロードからのリクエストのみを許可する方法について説明します。使用できるアクセス制御には、上り(内向き)設定と Identity and Access Management(IAM)ポリシーの 2 つのレイヤがあります。

5aed47d10595c878.png

上り(内向き)設定

Ingress 設定を使用すると、ネットワークの送信元(内部または外部)に基づいてリクエストをフィルタリングできます。デフォルトでは、パブリック インターネットからのリクエストを含むすべてのリクエストが転送されます。

IAM ポリシー

IAM ポリシーを使用すると、送信者の ID に基づいてリクエストをフィルタリングできます。これは、サービス間リクエストの認証によく使用されます。

このラボでは、Ingress 設定を使用する方法とタイミングについて学習します。

オンプレミス ホストが VPC 経由で接続する

このラボでは、オンプレミス ワークロードをシミュレートします。オンプレミス ホストを Cloud Run に接続するには、 オンプレミス ホスト用の限定公開の Google アクセスを構成します。これには、次に示すように、VPC ネットワークに Cloud VPN ゲートウェイを設定する操作が含まれます。

31611f6a2f12fd0c.png

VPC 内のジャンプサーバーを使用してオンプレミス ワークロードをシミュレートする

このラボでは、次の図に示すように、VPC 内の Compute Engine 仮想マシンからリクエストを送信して、オンプレミス ホストからのリクエストの送信をシミュレートします。

aebf22740c7a84f0.png

ジャンプサーバーとして使用する Compute Engine 仮想マシンは、Cloud VPN ゲートウェイと同じネットワーク送信元を持つため、オンプレミス ワークロードからのリクエスト送信をシミュレートできます。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この場所はいつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

環境設定

  1. 後のコマンドで使用するために、環境変数をプロジェクト ID に設定します。
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. このラボの実行に必要な API を有効にします。
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. サンプルアプリ リポジトリのクローンを作成してディレクトリに移動する
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. Compute Engine と Cloud Run のデフォルトのリージョンとゾーンを設定する
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. サービスをデプロイします。

まず、サービスをデプロイして一般公開します。ブラウザからリクエストを送信できることを確認したら、サービスをロックダウンし、内部ネットワーク ソースからのリクエストのみを許可します。

次のコマンドを実行する手順は次のとおりです。

  • ソースコードの場所(...): partner-registration-service ディレクトリにいることを確認して、Enter キーを押してデフォルトを受け入れます
  • サービス名(partner-registration-service): Enter キーを押してデフォルトを受け入れます
  • [partner-registration-service] への未認証の呼び出しを許可しますか(y/N)?Y
gcloud run deploy 

このコマンドが完了すると、Cloud Run サービスの URL が一覧表示されます。出力は次のリストのようになります。

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

ブラウザでサービス URL を開きます。以下のような出力が表示されます。

Partner registration service: RUNNING

内部リクエストのみを許可するようにサービスを設定する

次に、Cloud Run サービスの上り(内向き)設定を使用して、内部ソースからのリクエストのみを許可します。内部ソースには、Cloud Run サービスと同じプロジェクト(または VPC Service Controls の境界)にある VPC ネットワーク内のリソースが含まれます。これは、このユースケースに最適です。

また、他の Google Cloud プロダクトからのリクエストは、VPC の一部でなくても内部リクエストと見なされます。これらのプロダクトには、Pub/Sub や Workflows などがあります。

これらのソースからのリクエストは、run.app URL でサービスにアクセスする場合でも、Google ネットワーク内にとどまります。一般公開は禁止されています。

内部リクエストのみを許可するようにサービスを更新します。

gcloud run services update partner-registration-service --ingress=internal

サービス URL を再度開くと、「Error: Forbidden - Access is forbidden」と表示されます。

ブラウザは、Google Cloud プロジェクトの内部の送信元ではなく、外部ネットワークの送信元からリクエストを送信するため、これは想定どおりの動作です。サービスのセキュリティが強化されました。

4. ジャンプサーバーとして Compute Engine 仮想マシンを作成する

次のステップでは、ジャンプサーバーとして使用する Compute Engine インスタンスを VPC に作成して、Cloud VPN ゲートウェイを介したオンプレミス サーバーからのリクエストをシミュレートします。

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

このコマンドの出力は次のようになります。

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

Compute Engine インスタンスからサービスにリクエストを送信する

仮想マシンでターミナルを開き、VPC ネットワーク内のマシンから直接リクエストを送信します。

次のコマンドで Cloud Shell で SSH を設定するように求められた場合は、手順に沿って操作します。

gcloud compute ssh jump-server

次のコマンドを使用して、Cloud Run サービスの URL を取得します。

gcloud run services describe partner-registration-service --region us-central1

出力の最初の数行は次のようになります。

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

URL をコピーし、curl を使用して Compute Engine インスタンスからリクエストを送信します。VM インスタンスはプロジェクトの VPC ネットワークで実行されるため、このリクエストは成功します。これは内部ソースです。

export SERVICE_URL=https://

curl ${SERVICE_URL}

出力は次のようになります。

Partner registration service: RUNNING

5. IAM ベースのアクセス制御はどうですか?

このラボでは、上り(内向き)設定を使用する方法とタイミングについて説明しました。オンプレミス ワークロードを Cloud Run に接続する場合は、Ingress 設定が最初のステップとして適しています。

IAM ベースのアクセス制御の実装には、特にオンプレミス ホストから呼び出す場合は、より多くの労力が必要です。

  • IAM では、ホストで有効期間の長いサービス アカウント認証情報を管理する必要があります。
  • IAM では、サービス アカウントの認証情報を使用してリクエストに署名するためにコードを変更する必要があります。

アクセス制御には多層アプローチをおすすめします。上り(内向き)設定を使用して内部ホストへのアクセスのみを制限するのは、最初のステップとして適切ですが、それだけに留まらないでください。

6. 完了

お疲れさまでした。これでこの Codelab は終了です。

次のステップ:

Cymbal Eats の他の Codelab をご確認ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

有用な参考資料

Cloud Run の 2 つのアクセス制御レイヤの詳細を確認する際に役立つその他のリソースを以下に示します。