Google Cloud
Shisho Cloud と Google Cloud を連携することで、Google Cloud プロジェクトや組織のセキュリティスキャンが実施できます。 この連携は以下の 3 ステップで行えます:
- Shisho Cloud が利用(impersonate)できるサービスアカウントと、それに関連するリソースを作成する。
- 作成したサービスアカウントに、セキュリティ検査を行いたい Google Cloud プロジェクトへの権限を付与する。
- 作成したサービスアカウントや関連リソースの情報を Shisho Cloud に登録する。
サービスアカウントと関連リソースの作成
まずは任意の Google Cloud プロジェクトに、以下のどれかの手順に従って、Shisho Cloud から利用するサービスアカウント・アイデンティティプール・アイデンティティプロバイダを作成してください。
複数の Google Cloud プロジェクトを検査したい場合でも、この手順は 1 回だけで問題ありません。 つまり、Shisho Cloud のためのサービスアカウント・アイデンティティプール・アイデンティティプロバイダは、それぞれ 1 つずつあれば十分です。
- gcloud CLI
- Terraform
- Web コンソール(Cloud Shell)
冒頭の # 入力値
セクションの値を適宜変更した後、以下のスクリプトを実行することで、必要なリソース(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
という名前のアイデンティティプール
変数 shisho_cloud_org_id
の値をご自身の Shisho Cloud 組織の ID に変更した後、以下の Terraform 実装をご自身の Terraform プロジェクトに含め、 terraform apply
を実行してください。
サンプルコードは、以下のように定義された project
変数に、サービスアカウント等を作成する Google Cloud プロジェクト ID を指定されていることを仮定しています:
variable "project" {
type = string
}
このような変数が別名で定義されている場合、サンプルコード中の var.project
の参照を適宜置換してください。
そのよな変数が定義されていない場合、GOOGLE_PROJECT
環境変数を設定した上で、サンプルコードから var.project
を削除して利用するか、var.project
を直接プロジェクト ID に置換してください。
locals {
# 以下を Shisho Cloud 組織の ID に変更してください:
shisho_cloud_org_id = "your-shisho-organization-id"
}
# Ensure to enable APIs that needs to be enabled on the project that includes the service account to integrate with Shisho Cloud.
resource "google_project_service" "bigquery" {
project = var.project
service = "bigquery.googleapis.com"
}
resource "google_project_service" "cloudasset" {
project = var.project
service = "cloudasset.googleapis.com"
}
resource "google_project_service" "cloudkms" {
project = var.project
service = "cloudkms.googleapis.com"
}
resource "google_project_service" "resourcemanager" {
project = var.project
service = "cloudresourcemanager.googleapis.com"
}
resource "google_project_service" "compute" {
project = var.project
service = "compute.googleapis.com"
}
resource "google_project_service" "container" {
project = var.project
service = "container.googleapis.com"
}
resource "google_project_service" "dns" {
project = var.project
service = "dns.googleapis.com"
}
resource "google_project_service" "essentialcontacts" {
project = var.project
service = "essentialcontacts.googleapis.com"
}
resource "google_project_service" "logging" {
project = var.project
service = "logging.googleapis.com"
}
resource "google_project_service" "iamcredentials" {
project = var.project
service = "iamcredentials.googleapis.com"
}
resource "google_project_service" "iam" {
project = var.project
service = "iam.googleapis.com"
}
resource "google_project_service" "pubsub" {
project = var.project
service = "pubsub.googleapis.com"
}
resource "google_project_service" "serviceusage" {
project = var.project
service = "serviceusage.googleapis.com"
}
resource "google_project_service" "storage-component" {
project = var.project
service = "storage-component.googleapis.com"
}
resource "google_project_service" "sqladmin" {
project = var.project
service = "sqladmin.googleapis.com"
}
# Create a service account
resource "google_service_account" "shisho_cloud" {
project = var.project
account_id = "shisho-cloud"
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."
}
# Create an identity pool
resource "google_iam_workload_identity_pool" "shisho_cloud" {
project = var.project
workload_identity_pool_id = "shisho-cloud"
description = "An identity pool for Shisho Cloud audit jobs. Visit https://shisho.dev/docs/ja/g/getting-started/integrate-apps/googlecloud for further details."
}
# Create an identity provider
resource "google_iam_workload_identity_pool_provider" "shisho_cloud" {
project = var.project
workload_identity_pool_provider_id = "shisho-cloud"
workload_identity_pool_id = google_iam_workload_identity_pool.shisho_cloud.workload_identity_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."
oidc {
issuer_uri = "https://tokens.cloud.shisho.dev"
}
attribute_mapping = {
"google.subject" = "assertion.sub"
"attribute.organization_id" = "assertion.organization_id"
"attribute.workflow_id" = "assertion.workflow_id"
"attribute.job_id" = "assertion.job_id"
}
# Limit the scope of the service account to only be able to access the
attribute_condition = "attribute.organization_id == '${local.shisho_cloud_org_id}'"
}
# Grant the identity from the identity provider to impersonate the service account
resource "google_service_account_iam_member" "shisho_cloud_iam_workload_identity_user" {
service_account_id = google_service_account.shisho_cloud.id
role = "roles/iam.workloadIdentityUser"
member = "principalSet://iam.googleapis.com/${google_iam_workload_identity_pool.shisho_cloud.name}/*"
}
実行が完了すると、以下が作成されているはずです:
shisho-cloud
という名前のサービスアカウントshisho-cloud
という名前のアイデンティティプロバイダshisho-cloud
という名前のアイデンティティプール
画面右上のターミナルボタンから Cloud Shell を起動してください。以下の画像のうち、右上でハイライトされているボタンです:
クリックしてしばらく経つと、以下のように Cloud Shell が起動し、gcloud
コマンドが利用できるようになります:
冒頭の # 作成した Shisho Cloud 組織の ID
セクションの値を適宜変更した後、当該 Cloud Shell 上に以下のスクリプトをコピー・アンド・ペーストして実行することで、必要なリソース(ID プロバイダ・IAM ロール)が作成されます:
# 作成した 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"
TOKEN_ENDPOINT_URL="https://tokens.cloud.shisho.dev"
PROJECT_ID="$(gcloud config get-value project)"
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 Workload Identity Pool & Provider
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"
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"
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
(アクセス承認閲覧者)roles/firebaseauth.viewer
(Firebase Authentication 閲覧者)roles/serviceusage.serviceUsageConsumer
(Service Usage ユーザー)roles/compute.viewer
(Compute 閲覧者)
ここで付与されるロールは、基本的にリソースの設定値のみを読み取れるものであり、データストレージ(Cloud Storage や Cloud SQL 等)内のデータへの閲覧権限は原則含みません。しかし、compute.viewer
ロールは例外的に VM のスクリーンショットとシリアルポート出力へのアクセス権限を含みます。 もしこれが望ましくない場合は、権限を付与しないことも可能ですが、一部機能が動作しない可能性があります。
ロールに含まれる詳細な権限を確認したい場合は、Google Cloud 公式ドキュメント を参照してください。
- gcloud CLI
- Terraform
- Web コンソール
入力値 セクションの値を確認した後、以下のコマンドを実行することで、サービスアカウントへの権限付与が完了します:
#!/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"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/firebaseauth.viewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/serviceusage.serviceUsageConsumer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--role="roles/compute.viewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"
Terraform でロールを設定する場合には、以下のように google_project_iam_member
リソースでロールを付与できます:
// 以下のようなサービスアカウントを前のステップで作成済とします:
// resource "google_service_account" "shisho_cloud" {
// project = var.project
// account_id = "shisho-cloud"
// 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."
// }
resource "google_project_iam_member" "shisho_cloud_project_security" {
project = var.project
role = "roles/iam.securityReviewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_project_iam_member" "shisho_cloud_project_bigquery" {
project = var.project
role = "roles/bigquery.metadataViewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_project_iam_member" "shisho_cloud_org_policy" {
project = var.project
role = "roles/orgpolicy.policyViewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_project_iam_member" "shisho_cloud_browser" {
project = var.project
role = "roles/browser"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_project_iam_member" "shisho_cloud_access_approval" {
project = var.project
role = "roles/accessapproval.viewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_project_iam_member" "shisho_cloud_firebase_auth" {
project = var.project
role = "roles/firebaseauth.viewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_project_iam_member" "shisho_cloud_service_usage" {
project = var.project
role = "roles/serviceusage.serviceUsageConsumer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_project_iam_member" "shisho_cloud_compute_viewer" {
project = var.project
role = "roles/compute.viewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
IAM & Admin コンソール を開き、プロジェクトセレクタが表示される場合は検査を行いたいプロジェクト(やフォルダ・組織単位)を選択してください。 表示されない場合は、画面が開いた後に、画面上部のプロジェクト名が表示された部分から、検査を行いたいプロジェクト(やフォルダ・組織単位)を選択してください。 すると以下のような画面が表示されます:
その後「アクセス権を付与」("Grant Access") ボタンを押下してください。 すると、以下のような画面が表示されます:
表示された画面で以下を記入した後、保存("Save")ボタンを押下してください:
- プリンシパル: 作成したサービスアカウントのアドレス(例:
shisho-cloud@<プロジェクト名>.iam.gserviceaccount.com
;- 「サービスアカウントと関連リソースの作成」 の際に Cloud Shell や gcloud CLI を利用した場合は、
Service Account Email:
の後に表示された値
- 「サービスアカウントと関連リソースの作成」 の際に Cloud Shell や gcloud CLI を利用した場合は、
- ロール: 以下のロールすべて
roles/iam.securityReviewer
(セキュリティ審査担当者 / Security Reviewer)roles/bigquery.metadataViewer
(BigQuery メタデータ閲覧者 / BigQuery Metadata Viewer)roles/orgpolicy.policyViewer
(組織ポリシー閲覧者)roles/browser
(参照者)roles/accessapproval.viewer
(アクセス承認閲覧者)roles/firebaseauth.viewer
(Firebase Authentication 閲覧者)roles/serviceusage.serviceUsageConsumer
(Service Usage ユーザー)roles/compute.viewer
(Compute 閲覧者)
フォルダや Google Cloud 組織全体のセキュリティ管理をしたい場合
あるフォルダの中の全てのプロジェクト、あるいは Google Cloud 組織に含まれる全てのプロジェクトを Shisho Cloud で保護したい場合は、作成したサービスアカウントへ当該フォルダ/組織に対する以下のロールを付与してください:
roles/iam.securityReviewer
(セキュリティ審査担当者)roles/bigquery.metadataViewer
(BigQuery メタデータ閲覧者)roles/orgpolicy.policyViewer
(組織ポリシー閲覧者)roles/browser
(参照者)roles/accessapproval.viewer
(アクセス承認閲覧者)roles/firebaseauth.viewer
(Firebase Authentication 閲覧者)roles/serviceusage.serviceUsageConsumer
(Service Usage ユーザー)roles/compute.viewer
(Compute 閲覧者)
「単一プロジェクトのセキュリティ管理をしたい場合」と同じように、gcloud
CLI や Terraform、Web コンソールからロールを付与できます。
例えば組織単位で権限を付与する場合、以下のように操作できます:
- 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"
gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/firebaseauth.viewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"
gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/serviceusage.serviceUsageConsumer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"
gcloud organizations add-iam-policy-binding "$ORGANIZATION_ID" \
--role="roles/compute.viewer" \
--condition=None \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com"
Terraform でロールを設定する場合には、以下のように google_organization_iam_member
リソースでロールを付与できます:
// 以下のようなサービスアカウントを前のステップで作成済とします:
// resource "google_service_account" "shisho_cloud" {
// project = var.project
// account_id = "shisho-cloud"
// 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."
// }
resource "google_organization_iam_member" "shisho_cloud_org_security" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/iam.securityReviewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_organization_iam_member" "shisho_cloud_org_bigquery" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/bigquery.metadataViewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_organization_iam_member" "shisho_cloud_org_policy" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/orgpolicy.policyViewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_organization_iam_member" "shisho_cloud_browser" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/browser"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_organization_iam_member" "shisho_cloud_access_approval" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/accessapproval.viewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_organization_iam_member" "shisho_cloud_firebase_auth" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/firebaseauth.viewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_organization_iam_member" "shisho_cloud_service_usage" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/serviceusage.serviceUsageConsumer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
resource "google_organization_iam_member" "shisho_cloud_compute_viewer" {
// org_id は gcloud organizations list などで出力される値が利用できます
org_id = "1234567890"
role = "roles/compute.viewer"
member = "serviceAccount:${google_service_account.shisho_cloud.email}"
}
IAM & Admin コンソール を開いた後、画面上部のプロジェクト名(Google Cloud ロゴの横)をクリックしてください。 すると以下のようなプロジェクト・フォルダ・組織のセレクタが表示されます:
その後「すべて」タブを選択すると、自社 Google Cloud プロジェクトを束ねる組織名(画像例の場合 flatt.tech
)やフォルダ名が確認できます。
組織全体を Shisho Cloud で検査したい場合、組織名(画像例の場合 flatt.tech
)をクリックしてください。
すると、自らの Google Cloud アカウントに組織設定を行うのに十分な権限(Google Workspace や Cloud Identity の管理者系ロール等)がある場合は、以下のような画面が表示されます:
その後「アクセス権を付与」("Grant Access") ボタンを押下してください。 すると、以下のような画面が表示されます:
表示された画面で以下を記入した後、保存("Save")ボタンを押下してください:
- プリンシパル: 作成したサービスアカウントのアドレス(例:
shisho-cloud@<プロジェクト名>.iam.gserviceaccount.com
;- 「サービスアカウントと関連リソースの作成」 の際に Cloud Shell や gcloud CLI を利用した場合は、
Service Account Email:
の後に表示された値
- 「サービスアカウントと関連リソースの作成」 の際に Cloud Shell や gcloud CLI を利用した場合は、
- ロール: 以下の 4 つのロール
roles/iam.securityReviewer
(セキュリティ審査担当者 / Security Reviewer)roles/bigquery.metadataViewer
(BigQuery メタデータ閲覧者 / BigQuery Metadata Viewer)roles/orgpolicy.policyViewer
(組織ポリシー閲覧者)roles/browser
(参照者)roles/accessapproval.viewer
(アクセス承認閲覧者)roles/firebaseauth.viewer
(Firebase Authentication 閲覧者)roles/serviceusage.serviceUsageConsumer
(Service Usage ユーザー)roles/compute.viewer
(Compute 閲覧者)
Shisho Cloud への情報の登録
ここまでのステップで、Shisho Cloud が検査時に利用するサービスアカウント、およびサービスアカウントのアクセス権の設定が完了しています。 最後に、「歯車マーク ⚙ > 連携(Integrations)」画面に表示されているカード「Google Cloud」の「設定」ボタンを押下し、画面の指示に従いながら必要事項を入力してください。 gcloud CLI (Cloud Shell 上で利用した場合を含む)でセットアップした場合、スクリプト実行後に出力された (1) - (4) の値が主に必要になります。
入力が完了すると、設定ページに、以下のようなチェックマークと共にサービスアカウントが表示されるはずです:
この状態になれば Google Cloud 連携のセットアップは完了です。 Shisho Cloud は Google Cloud のアカウントにアクセスできるようになっています!
Google Cloud 側のキャッシュ仕様の兼ね合いで、連携後数分間は Shisho Cloud が Google Cloud にアクセスできない可能性があります。 直ちに設定が完了しない場合は、最大 5 分程度お待ちください。
もし上記の手順で 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 のリソースの設定を読み取ることができるようになります。