arrow_back

Cloud Run で最小権限の IAM ポリシー バインディングを実装する [APPRUN]

ログイン 参加
700 以上のラボとコースにアクセス

Cloud Run で最小権限の IAM ポリシー バインディングを実装する [APPRUN]

ラボ 1時間 universal_currency_alt クレジット: 5 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

最小権限の原則とは、あるリソースに対してその機能に必要なリソースのみへのアクセスを許可することです。たとえば、サービスが自動データベース バックアップを実行する場合、サービスは 1 つのデータベースに対する読み取り専用権限に制限される必要があります。同様に、サービスがデータの暗号化のみを担当する場合、データの復号化の権限は付与されるべきではありません。

Cloud Run では、サービス アカウントを指定せずにサービスをデプロイすると、デフォルトのサービス アカウントが使用されます。使用されるデフォルトのサービス アカウントは、プロジェクトに対する広範な編集者のロールを持つ Compute Engine サービス アカウントです。ポリシー バインディングの継承により、このサービス アカウントにはプロジェクト内のほとんどのリソースに対する読み取り権限と書き込み権限が付与されています。便利ではありますが、このサービス アカウントでリソースを作成、変更、削除できるため、固有のセキュリティ リスクがあります。

このリスクを軽減し、最小権限の原則を実装するには、サービスの ID として機能するサービス アカウントを作成し、サービスの機能に必要な最小限の権限をそのアカウントに付与する必要があります。

目標

このラボでは、次のタスクの実行方法を学びます。

  • 環境を構成し、Cloud Run API を有効にする。
  • パブリック Cloud Run サービスを作成してデプロイする。
  • 未認証のリクエストでサービスをテストする。
  • 最小限の権限を持つサービス アカウントを作成する。
  • gcloud CLI を使用してサービス アカウントで認証し、Cloud Run サービスを呼び出す。
  • Cloud Run でサービスを呼び出すために必要な最小限の権限セットを付与して、最小権限を実装する。

前提条件

これらのラボは、Google Cloud に関する中級レベルの知識を前提としています。必要な手順はコンテンツで説明されていますが、以下のプロダクトのいずれかに慣れていれば、より理解が深まります。

  • IAM
  • Cloud Run

設定と要件

[ラボを開始] ボタンをクリックする前に

注: 以下の説明をお読みください。

ラボの時間は計測されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

この Qwiklabs ハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

必要なもの

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
  • ラボを完了するために十分な時間
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、ラボでは使用しないでください。 注: Pixelbook を使用している場合は、このラボをシークレット ウィンドウで実施してください。

ラボを開始してコンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側のパネルには、このラボで使用する必要がある一時的な認証情報が表示されます。

    [認証情報] パネル

  2. ユーザー名をコピーし、[Google Console を開く] をクリックします。 ラボでリソースが起動し、別のタブで [アカウントの選択] ページが表示されます。

    注: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
  3. [アカウントの選択] ページで [別のアカウントを使用] をクリックします。[ログイン] ページが開きます。

    [別のアカウントを使用] オプションがハイライト表示されている、アカウントのダイアログ ボックスを選択します。

  4. [接続の詳細] パネルでコピーしたユーザー名を貼り付けます。パスワードもコピーして貼り付けます。

注: 認証情報は [接続の詳細] パネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。請求が発生する事態を避けるため、Google Cloud アカウントをお持ちの場合でも、このラボでは使用しないでください。
  1. その後次のように進みます。
  • 利用規約に同意してください。
  • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
  • 無料トライアルには登録しないでください。

しばらくすると、このタブで Cloud コンソールが開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 Cloud コンソール メニュー

Google Cloud Shell の有効化

Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。

Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

    ハイライト表示された Cloud Shell アイコン

  2. [続行] をクリックします。

環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

Cloud Shell ターミナルでハイライト表示されたプロジェクト ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  • 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list

出力:

Credentialed accounts: - @.com (active)

出力例:

Credentialed accounts: - google1623327_student@qwiklabs.net
  • 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project =

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: gcloud ドキュメントの全文については、 gcloud CLI の概要ガイド をご覧ください。

タスク 1. 環境を構成する

Cloud Shell で環境変数を設定して、プロビジョニング プロセスをより柔軟にします。

  1. Cloud Run API を有効にします。

    gcloud services enable run.googleapis.com
  2. LOCATION 環境変数を作成します。

    LOCATION={{{project_0.default_region|REGION}}}
  3. デフォルトの Cloud Run リージョンを設定します。

    gcloud config set run/region $LOCATION

タスク 2. 公開サービスを作成してデプロイする

要件

Quickway Parking には、セキュリティを強化したい Cloud Run 課金サービスがあります。このタスクでは、次のことを実行します。

  • イメージから課金サービスをデプロイする。
  • 認証なしでサービスを呼び出してテストする。

Cloud Run を使用したデプロイ

Quickway の開発チームは、Google Cloud で利用できる請求アプリケーションのイメージをすでに持っています。

  1. 請求アプリケーションのイメージを Cloud Run にデプロイします。

    gcloud run deploy billing-service \ --image gcr.io/qwiklabs-resources/gsp723-parking-service \ --region $LOCATION \ --allow-unauthenticated
  2. 新しいサービスの URL を環境変数に割り当てます。

    BILLING_SERVICE_URL=$(gcloud run services list \ --format='value(URL)' \ --filter="billing-service")
  3. 認証なしでサービスを呼び出します。

    curl -X POST -H "Content-Type: application/json" $BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 100}' サービスは、呼び出されても出力を生成しません。
  4. Google Cloud コンソールのナビゲーション メニューナビメニュー)で、[Cloud Run] をクリックします。

  5. 課金サービスへのリンクをクリックします。

  6. サービスログを表示するには、[ログ] をクリックします。

  7. ログフィルタ minBalance を追加して、サービスへのリクエストで受け取った最小残高を表示します。

  8. サービスの詳細ページに戻るには、[<- サービスの詳細] をクリックします。

  9. 緑色のチェックマークの左側にあるチェックボックスをオンにして、billing-service を選択します。

    選択した課金サービスを含む Cloud Run ページ。

    セキュリティ チームは、セキュリティ設定で何かを発見しました。上記の構成のどの部分が懸念の対象になっているか、わかりますか?

    適用された認証を詳しく見てみましょう。現在、インターネット上の誰でも課金サービスを呼び出すことができます。これは、Cloud Run 起動元ロールを持つ allUsers ID によって示されます。

    Quickway Parking の図。課金サービスは一般公開されています。

    課金サービスが最初にデプロイされたとき、--allow-unauthenticated 権限が使用されました。これは、サービスが一般公開されており、認証なしで呼び出すことができることを意味します。

    タイプ 権限 説明
    URL アクセス --allow-unauthenticated サービスを一般公開する(未認証のユーザーがアクセスできる)。
    呼び出しプリンシパル allUsers サービスを誰でも呼び出し/トリガーできるようにする。

    --allow-unauthenticated 権限を削除すると、Cloud Run のデフォルトの権限を使用してサービスを保護するか、no-allow-unauthenticated 権限を明示的に指定できます。

    タイプ 権限 説明
    URL アクセス --no-allow-unauthenticated 認証でサービスを保護する(認証されたユーザーのみがアクセス可能)。
    呼び出しプリンシパル なし サービスを誰でも呼び出したりトリガーしたりできないようにする。
    注: Google Cloud では、ソリューションで常に最小権限を使用するようにしてください。

これらの変更を行うことで、セキュリティ チームは全体的な設計に満足するでしょう。

[進行状況を確認] をクリックして、実行したタスクを確認します。

パブリック Cloud Run サービスをデプロイする

タスク 3. サービス リクエストの認証

チームは、変更がどのように機能するかを示すために、アプリケーション設計を更新します。

Quickway Parking の図。課金サービスには認証が必要です。

主な変更点は次のとおりです。

  • 課金サービスへの未認証の一般公開アクセスを削除する。
  • 課金サービスを呼び出すための適切な権限を持つ新しいサービス アカウントを作成する。

認証を必要とするようにサービスを更新する

Cloud Run で使用される権限について理解を深めたところで、課金サービスに適用されている認証権限を修正します。

  1. 既存のデプロイ済みサービスを削除します。

    gcloud run services delete billing-service
  2. プロンプトが表示されたら、「Y」と入力して Enter キーを押します。

  3. --no-allow-authenticated 権限を使用して課金サービスを再デプロイします。

    gcloud run deploy billing-service \ --image gcr.io/qwiklabs-resources/gsp723-parking-service \ --region $LOCATION \ --no-allow-unauthenticated

    サービスを再デプロイすると、サービスの URL で認証されていないアクセスが許可されなくなります。また、サービスを呼び出すためのアクセス許可も削除されています。

  4. 数秒待ってから、前と同じように課金サービスを再度呼び出します。

    curl -X POST -H "Content-Type: application/json" $BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 100}'

    期待通りに、サービスで認証が必要になったため、出力は権限エラーになります。

サービス アカウントを作成する

課金サービスを呼び出すには、適切な権限を持つ ID またはサービス アカウントが必要であり、その ID をサービスにバインドする必要があります。

これは、Google Cloud コンソールまたは gcloud コマンドライン インターフェースで行うことができます。このラボでは、Google Cloud コンソールを使用してサービス アカウントを作成し、課金サービスの新しいポリシー バインディングを設定します。

  1. Google Cloud コンソールのナビゲーション メニューナビメニュー)から [IAM と管理] > [サービス アカウント] を選択します。

  2. 認証されたアクセスを提供する新しいサービス アカウントを作成するには、上部にある [サービス アカウントを作成] をクリックします。

  3. サービス アカウントに「Billing Initiator」という名前を付けます。

    [サービス アカウントの作成] ページで [作成して続行] ボタンがハイライト表示されています。

  4. アカウントを作成するには、[作成して続行] をクリックし、[アクセス権の付与] ステップに進みます。

  5. Billing Initiator サービス アカウントに課金サービスを呼び出す権限を付与するには、[ロール] プルダウンを選択し、左側をスクロールして [Cloud Run] を選択し、ロール [Cloud Run 起動元] を選択します。

    ハイライト表示された [続行] ボタン。

  6. サービス アカウントの設定を完了するには、[続行] をクリックしてから、[完了] をクリックします。

    コンソールのサービス アカウントのリストの一番上に、新しいサービス アカウントが表示されます。

    新しく作成されたサービス アカウントが、ステータスと説明とともに表示されます。

サービス アカウント Billing Initiator が作成され、プロジェクトの IAM ポリシー バインディングを使用して Cloud Run サービスを呼び出す権限が付与されています。

[進行状況を確認] をクリックして、実行したタスクを確認します。

サービス アカウントを作成する

タスク 4. 認証を使用してサービスを呼び出す

適切な権限を持つサービス アカウントが作成されたので、これを使用して Cloud Run サービスを呼び出すことができます。

gcloud で認証する

最初の手順は、サービス アカウントを gcloud で設定し、サービスとの認証に使用できるようにすることです。

  1. Cloud Shell ターミナルのメニューで、[追加](追加)をクリックして、別のタブで新しいシェルを開きます。

    このタスクの残りのコマンドをこの Cloud Shell ウィンドウで実行します。

  2. サービス アカウントの ID メールを取得し、環境変数に保存します。

    BILLING_INITIATOR_EMAIL=$(gcloud iam service-accounts list --filter="Billing Initiator" --format="value(EMAIL)"); echo $BILLING_INITIATOR_EMAIL
  3. この Cloud Shell ターミナルで、課金サービスの URL を環境変数に割り当てます。

    BILLING_SERVICE_URL=$(gcloud run services list \ --format='value(URL)' \ --filter="billing-service")
  4. サービス アカウントを使用して gcloud を認証するには、キーファイルを生成します。

    gcloud iam service-accounts keys create key.json --iam-account=${BILLING_INITIATOR_EMAIL}
  5. サービス アカウントを使用して Cloud Run へのアクセスを承認します。

    gcloud auth activate-service-account --key-file=key.json

サービスを呼び出す

  1. サービス アカウントから生成された ID トークンを使用して、Cloud Run の課金サービスを呼び出します。

    curl -X POST -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ $BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 500}'
  2. Google Cloud コンソールのナビゲーション メニューナビメニュー)で、[Cloud Run] をクリックします。

  3. 課金サービスへのリンクをクリックします。

  4. サービスログを表示するには、[ログ] をクリックします。

  5. ログフィルタ minBalance を追加して、サービスへのリクエストで受信した更新後の最小残高を表示します。

[進行状況を確認] をクリックして、実行したタスクを確認します。

認証を使用して Cloud Run サービスを呼び出す

タスク 5. 最小権限を実装する

適切な権限を持つサービス アカウントを使用して、以前は誰でもアクセスできた Cloud Run サービスを呼び出しました。しかし、この特定のサービスを呼び出すために必要な最小限の権限を使用しているでしょうか?

これが事実かどうかを判断するために、2 つ目の課金サービスをデプロイします。このサービスは、Cloud Scheduler などの他の内部限定公開サービスからのみアクセスできるものとします。

この要件の図を以下に示します。

2 つ目の内部課金サービスへのアクセスを示す要件図。

2 つ目のサービスをデプロイする

  1. 3 つ目の Cloud Shell ターミナル ウィンドウまたはタブを開きます。

  2. LOCATION 環境変数を作成します。

    LOCATION={{{project_0.default_region|REGION}}}
  3. 2 つ目のサービスをシミュレートするには、課金アプリケーションのイメージを Cloud Run にデプロイします。

    gcloud run deploy billing-service-2 \ --image gcr.io/qwiklabs-resources/gsp723-parking-service \ --region $LOCATION \ --no-allow-unauthenticated
  4. 新しいサービスの URL を環境変数に割り当てます。

    BILLING_SERVICE_2_URL=$(gcloud run services list \ --format='value(URL)' \ --filter="billing-service-2")

サービス アカウント ID を使用して 2 つ目のサービスを呼び出す

  1. 3 つ目の Cloud Shell ターミナルで、同じサービス アカウントを使用して Cloud Run へのアクセスを承認します。

    gcloud auth activate-service-account --key-file=key.json
  2. サービス アカウントから生成された ID トークンを使用して、2 つ目の Cloud Run サービスを呼び出します。

    curl -X POST -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ $BILLING_SERVICE_2_URL -d '{"userid": "1234", "minBalance": 900}'

なぜ成功したのでしょうか?これは、サービス アカウントを作成したときに、Cloud Run 起動元の権限がプロジェクトのこのアカウントに付与されたためです。継承により、2 つの Cloud Run サービスなどのプロジェクト内のリソースはこれらの権限を継承します。その結果、サービス アカウントを使用してサービスを呼び出すことができます。

サービス アカウントの権限を制限する

最小権限を完全に実装するには、サービス アカウントに必要なサービスに対する権限のみを付与する必要があります。

このサブタスクでは、プロジェクトのサービス アカウントに以前に付与した権限を削除し、元の課金サービスを呼び出すために必要な適切な権限を追加します。

  1. 1 つ目の Cloud Shell ターミナル ウィンドウに切り替えます。

  2. この Cloud Shell ターミナルで、サービス アカウントの ID メールを取得し、環境変数に保存します。

    BILLING_INITIATOR_EMAIL=$(gcloud iam service-accounts list --filter="Billing Initiator" --format="value(EMAIL)"); echo $BILLING_INITIATOR_EMAIL
  3. プロジェクトのサービス アカウントの権限を削除します。

    gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=serviceAccount:${BILLING_INITIATOR_EMAIL} \ --role=roles/run.invoker
  4. 課金サービスのサービス アカウントに権限を追加します。

    gcloud run services add-iam-policy-binding billing-service --region $LOCATION \ --member=serviceAccount:${BILLING_INITIATOR_EMAIL} \ --role=roles/run.invoker --platform managed

サービスを呼び出す

  1. 2 つ目の Cloud Shell ターミナル ウィンドウまたはタブに戻ります。

  2. 数秒待ってから、サービス アカウントから生成された ID トークンを使用して、最初の Cloud Run 課金サービスを呼び出します。

    curl -X POST -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ $BILLING_SERVICE_URL -d '{"userid": "1234", "minBalance": 700}'
更新された権限が反映されるまで数秒かかります。その後、この呼び出しは成功するはずです。
  1. 3 つ目の Cloud Shell ターミナル ウィンドウに切り替えます。

  2. 同じサービス アカウントから生成された ID トークンを使用して、2 つ目の Cloud Run サービスを呼び出してみます。

    curl -X POST -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ $BILLING_SERVICE_2_URL -d '{"userid": "1234", "minBalance": 500}' サービス アカウントには、最初のサービスを呼び出すために必要な最小限の権限しか付与されていないため、権限エラーが表示されます。

[進行状況を確認] をクリックして、実行したタスクを確認します。

最小権限を使用して Cloud Run サービスを呼び出す

お疲れさまでした

このラボでは、デプロイされたサービスを再構成してアクセスを保護する方法を確認し、Google Cloud のリソースにアクセスする権限を付与する際に最小権限の原則を実装しました。あなた:

  • Cloud Run にサービスをデプロイしている。
  • gcloud CLI を使用して、認証を必須とするようにサービスを更新した。
  • サービスを呼び出すために必要な権限を持つサービス アカウントを作成した。
  • Cloud Run で特定のサービスを呼び出すために必要な最小限の権限を設定し、最小権限の原則を実装する。

プロジェクト内でこれらのプロダクトを使用する方法について詳しくは、Serverless Expeditions の動画シリーズをご覧ください。

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。