メインコンテンツまでスキップ

Google Cloud

Shisho Cloud と Google Cloud を連携することで、Google Cloud プロジェクトや組織のセキュリティスキャンが実施できます。 この連携は以下の 3 ステップで行えます:

  1. Shisho Cloud が利用(impersonate)できるサービスアカウントと、それに関連するリソースを作成する。
  2. 作成したサービスアカウントに、セキュリティ検査を行いたい Google Cloud プロジェクトへの権限を付与する。
  3. 作成したサービスアカウントや関連リソースの情報を Shisho Cloud に登録する。

サービスアカウントと関連リソースの作成

まずは任意の Google Cloud プロジェクトに、以下のどれかの手順に従って、Shisho Cloud から利用するサービスアカウント・アイデンティティプール・アイデンティティプロバイダを作成してください。

info

複数の Google Cloud プロジェクトを検査したい場合でも、この手順は 1 回だけで問題ありません。 つまり、Shisho Cloud のためのサービスアカウント・アイデンティティプール・アイデンティティプロバイダは、それぞれ 1 つずつあれば十分です。

冒頭の # 入力値 セクションの値を適宜変更した後、以下のスクリプトを実行することで、必要なリソース(ID プロバイダ・IAM ロール)が作成されます:

#!/bin/bash

set -eu

# 入力値
############

# Google Cloud プロジェクトの ID
PROJECT_ID="your-google-cloud-project-id"

# Shisho Cloud 組織の ID
SHISHO_ORG_ID="you-shisho-organization-id"

# 作成するアイデンティティプールの ID; 特に理由がなければ変更の必要はありません
POOL_ID="shisho-cloud"

# 作成するアイデンティティプロバイダの ID; 特に理由がなければ変更の必要はありません
PROVIDER_ID="shisho-cloud"

# 作成するサービスアカウント名; 特に理由がなければ変更の必要はありません
SERVICE_ACCOUNT_NAME="shisho-cloud"

# Creation
############

TOKEN_ENDPOINT_URL="https://tokens.cloud.shisho.dev"
PROJECT_NUMBER="$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")"

# Ensure to enable APIs that needs to be enabled on the project that includes the service account to integrate with Shisho Cloud.
gcloud services enable \
bigquery.googleapis.com \
cloudasset.googleapis.com \
cloudkms.googleapis.com \
cloudresourcemanager.googleapis.com \
compute.googleapis.com \
container.googleapis.com \
dns.googleapis.com \
essentialcontacts.googleapis.com \
logging.googleapis.com \
iamcredentials.googleapis.com \
iam.googleapis.com \
pubsub.googleapis.com \
serviceusage.googleapis.com \
storage-component.googleapis.com \
sqladmin.googleapis.com \
--project "$PROJECT_ID"


# Create a new workload identity pool
gcloud iam workload-identity-pools create "$POOL_ID" \
--project="$PROJECT_ID" \
--description="An identity pool for Shisho Cloud audit jobs. Visit https://shisho.dev/docs/ja/g/getting-started/integrate-apps/googlecloud for further details." \
--location=global \
--display-name="$POOL_ID"

# Add a workload identity pool provider
gcloud iam workload-identity-pools providers create-oidc "$PROVIDER_ID" \
--project="$PROJECT_ID" \
--location="global" \
--workload-identity-pool="$POOL_ID" \
--description="An identity provider for Shisho Cloud audit jobs. Visit https://shisho.dev/docs/ja/g/getting-started/integrate-apps/googlecloud for further details." \
--display-name="$PROVIDER_ID" \
--attribute-mapping="google.subject=assertion.sub,attribute.organization_id=assertion.organization_id,attribute.workflow_id=assertion.workflow_id,attribute.job_id=assertion.job_id" \
--attribute-condition="assertion.organization_id == '$SHISHO_ORG_ID'" \
--issuer-uri="$TOKEN_ENDPOINT_URL"

# Create a service account that can be impersonated IDs in the pool
gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" \
--description="A service account that Shisho Cloud impersonates and use for listing up projects, resources, and their settings. Visit https://shisho.dev/docs/ja/g/getting-started/integrate-apps/googlecloud for further details." \
--project "$PROJECT_ID"

# Allow a service account to be impersonated. Note that the service account doesn't have ability to access config of Google resources yet.
gcloud iam service-accounts add-iam-policy-binding "$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
--project="$PROJECT_ID" \
--role="roles/iam.workloadIdentityUser" \
--member="principalSet://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$POOL_ID/*"

# Post-processing
echo "Visit https://cloud.shisho.dev/${SHISHO_ORG_ID}/settings/integrations/googlecloud and add a federation with:"
echo "- (1) Service Account Email: ${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
echo "- (2) Pool Project Number: ${PROJECT_NUMBER}"
echo "- (3) Pool ID: ${POOL_ID}"
echo "- (4) Provider ID: ${PROVIDER_ID}"

実行が完了すると、作成された以下のリソースに関する情報が Visit https://cloud.shisho.dev ... 以降に出力されます。 ここで表示される内容は後のステップ「Shisho Cloud への情報の登録」で利用するため、控えておいてください

  • shisho-cloud という名前のサービスアカウント
  • shisho-cloud という名前のアイデンティティプロバイダ
  • shisho-cloud という名前のアイデンティティプール

サービスアカウントが作成できたら、作成されたサービスアカウントの E メールアドレスを控えてください。 当該 E メールアドレスは、上記のスクリプト類をそのまま利用した場合、およそ shisho-cloud@<プロジェクト名>.iam.gserviceaccount.com のようになるはずです。

また、サービスアカウントの E メールアドレスと併せて、サービスアカウントや関連リソースを作成した Google Cloud プロジェクトのプロジェクト番号も控えてください。 これは通常 12 桁の数で、Google Cloud コンソールの ウェルカムページ で確認できます。

サービスアカウントのへの権限付与

ここまでの準備を終えた時点で、Shisho Cloud から Google Cloud のサービスアカウントを利用できる準備がほぼ整いました。 次はサービスアカウントに対して、実際にセキュリティスキャンを行いたい対象 へのアクセス権限を付与しましょう。

単一プロジェクトのセキュリティ管理をしたい場合

Google Cloud の組織全体、あるいはフォルダ全体を Shisho Cloud で検査し続けるよりも、プロジェクトを選んで Shisho Cloud へのアクセス権を設定したい場合があります。 この場合は、続くコードサンプルを参考に、作成したサービスアカウントへ当該プロジェクトに対する以下のロールを付与してください:

  • roles/iam.securityReviewer(セキュリティ審査担当者)
  • roles/bigquery.metadataViewer(BigQuery メタデータ閲覧者)
  • roles/orgpolicy.policyViewer(組織ポリシー閲覧者)
  • roles/browser(参照者)
  • roles/accessapproval.viewer(アクセス承認閲覧者)
info

ここで付与されるロールは、基本的にリソースの設定値のみを読み取れるものであり、データストレージ(Cloud Storage や Cloud SQL 等)内のデータへの閲覧権限は原則含みません。 ロールに含まれる詳細な権限を確認したい場合は、Google Cloud 公式ドキュメント を参照してください。

入力値 セクションの値を確認した後、以下のコマンドを実行することで、サービスアカウントへの権限付与が完了します:

#!/bin/bash

set -eu

# 入力値
############

# 作成したサービスアカウントが存在する Google Cloud プロジェクトの ID
PROJECT_ID="your-google-cloud-project-id"

# 先程作成したサービスアカウント名; 上述のスクリプトをそのまま実行した場合はそのままにしてください
SERVICE_ACCOUNT_NAME="shisho-cloud"

# Grant permissions
############
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/iam.securityReviewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/bigquery.metadataViewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/orgpolicy.policyViewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/browser" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/accessapproval.viewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

フォルダや Google Cloud 組織全体のセキュリティ管理をしたい場合

あるフォルダの中の全てのプロジェクト、あるいは Google Cloud 組織に含まれる全てのプロジェクトを Shisho Cloud で保護したい場合は、作成したサービスアカウントへ当該フォルダ/組織に対する以下のロールを付与してください:

  • roles/iam.securityReviewer(セキュリティ審査担当者)
  • roles/bigquery.metadataViewer(BigQuery メタデータ閲覧者)
  • roles/orgpolicy.policyViewer(組織ポリシー閲覧者)
  • roles/browser(参照者)
  • roles/accessapproval.viewer(アクセス承認閲覧者)

「単一プロジェクトのセキュリティ管理をしたい場合」と同じように、gcloud CLI や Terraform、Web コンソールからロールを付与できます。

例えば組織単位で権限を付与する場合、以下のように操作できます:

入力値 セクションの値を確認した後、以下のコマンドを実行することで、Google Cloud 組織へのサービスアカウントへの権限付与が完了します:

#!/bin/bash

set -eu

# 入力値
############

# 作成したサービスアカウントが存在する Google Cloud プロジェクトの ID
PROJECT_ID="your-google-cloud-project-id"

# Shisho Cloud でセキュリティレビューを行いたいリソースを含む、貴社 Google Cloud 組織の ID
# (gcloud organizations list などで出力される値が利用できます)
ORGANIZATION_ID="000000000000"

# 先程作成したサービスアカウント名; チュートリアル中のスクリプトをそのまま実行した場合はそのままにしてください
SERVICE_ACCOUNT_NAME="shisho-cloud"

# Grant permissions
############
gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/iam.securityReviewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/bigquery.metadataViewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/orgpolicy.policyViewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/browser" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/accessapproval.viewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"

Shisho Cloud への情報の登録

ここまでのステップで、Shisho Cloud が検査時に利用するサービスアカウント、およびサービスアカウントのアクセス権の設定が完了しています。 最後に、「歯車マーク ⚙️ > 連携(Integrations)」画面に表示されているカード「Google Cloud」の「設定」ボタンを押下し、画面の指示に従いながら必要事項を入力してください。 gcloud CLI (Cloud Shell 上で利用した場合を含む)でセットアップした場合、スクリプト実行後に出力された (1) - (4) の値が主に必要になります。

入力が完了すると、設定ページに、以下のようなチェックマークと共にサービスアカウントが表示されるはずです:

この状態になれば Google Cloud 連携のセットアップは完了です。 Shisho Cloud は Google Cloud のアカウントにアクセスできるようになっています!

info

Google Cloud 側のキャッシュ仕様の兼ね合いで、連携後数分間は Shisho Cloud が Google Cloud にアクセスできない可能性があります。 直ちに設定が完了しない場合は、最大 5 分程度お待ちください。

danger

もし上記の手順で Google Cloud 連携が正常に行えない場合は、遠慮なくサービス運営元(Flatt Security)にお問い合わせください。

参考: Google Cloud 連携の技術的詳細

上述のセットアップ手順では、サービスアカウントと並んで、Google Cloud の Workload Identity Federation という機能を利用しています。 この Workload Identity Federation は、外部サービス上のアイデンティティに Google Cloud 上のサービスアカウントとして振る舞う権限を付与するための枠組みです。

Shisho Cloud はこの枠組みを活用することで、サービスアカウントキーなしに、Google Cloud リソースの設定を取得します。 これはおよそ GitHub Action が有する OIDC ベースの Google Cloud/Google Cloud 連携の仕組み と同等の仕組みです。

セットアップされた機能・コンセプト

この枠組みのうち、Shisho Cloud にセキュリティスキャンを実施させるために実際に用いられているのは、2 つの機能・コンセプトです:

  • Workload Identity Pool
  • Workload Identity Provider

上述のセットアップ手順では、まず Workload Identity Pool を用意しました。 これは外部のアイデンティティ(Google から見た外部であり、ここでは Shisho Cloud 上のワークフロー実行を代表するアイデンティティ)を Google Cloud 内のプリンシパルに対応付けるためのものです。

また、当該 Workload Identity Pool には、Workload Identity Provider を登録しました。 これは外部のアイデンティティを表す情報(ID トークン等)と、Workload Identity Pool 内のアイデンティティとのマッピング・検証を行うためのものです。 Shisho Cloud の場合、ワークフローの実行ごとに ID トークンが払い出されるため、作成した Workflow Identity Provider には当該トークンと Google Cloud 上のプリンシパルを紐付けるための設定がなされています。

Google Cloud 環境へのアクセスの流れ

実際に Shisho Cloud が Google Cloud にアクセスしようとする際には、Shisho Cloud から Google Cloud の持つ Security Token Service API(STS)に対して、Shisho Cloud が発行した ID トークンが送出されます。 ID トークンを受け取った STS は、トークンを検証します。

ここで行われる検証の一つは、JWT の署名の検証です。 なお検証時に必要な公開鍵は Shisho Cloud の JWKs エンドポイントにて提供されており、そのエンドポイントは Workload Identity Federation の設定過程で登録されています。

また、検証では、JWT のペイロードにある情報(クレーム)に対しても検証が行われます。 これは Workload Identity Pool Provider に登録してあるマッピング情報・検証ロジックに基づきます。

上記の検証に成功した場合、STS は、Google Cloud に対する短命のアクセストークンを Shisho Cloud に返却します。 Shisho Cloud はこのアクセストークンを IAM API に再度渡し、あるサービスアカウントとして振る舞うための別のアクセストークンを要求します。 上述のセットアップ手順では、サービスアカウントに Workload Identity User ロールを付与しましたが、これがこのような要求を許可するための設定です。

最終的に Shisho Cloud は、サービスアカウントとして振る舞える権限をもったアクセストークンを獲得します。 上述のセットアップ手順では、サービスアカウントに roles/iam.securityReviewer 等のロールを付与しましたから、これで Shisho Cloud は Google Cloud のリソースの設定を読み取ることができるようになります。