GSP920
概要
顧客管理の暗号鍵(CMEK)を使用すると、Cloud SQL 内の保存データに対して独自の暗号鍵を使用できます。顧客管理の暗号鍵を追加した後は、API が呼び出されるたびに Cloud SQL はその鍵を使用してデータにアクセスします。
このラボでは、Cloud SQL for PostgreSQL インスタンスを保護する方法に関する詳細なガイダンスを提供します。まず、CMEK を使用する新しい Cloud SQL インスタンスをデプロイします。Cloud SQL for PostgreSQL インスタンスを作成した後、そのインスタンスに対して実行された SQL オペレーションを選択的に記録して追跡するように pgAudit を構成し、最後に Cloud SQL IAM データベース認証を構成してテストします。
演習内容
- Cloud SQL for PostgreSQL 用に CMEK を設定する。
- Cloud SQL for PostgreSQL インスタンスに対して pgAudit を有効にして構成する。
- Cloud SQL for PostgreSQL IAM データベース認証を構成する。
対象者
このハンズオンラボの内容は、PostgreSQL データベース管理者に最も適しています。このラボは、PostgreSQL をサポートする Google Cloud リソースの設定と構成を実際に経験することを目的としています。
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モード(推奨)またはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
- ラボを完了するための時間(開始後は一時停止できません)
注: このラボでは、受講者アカウントのみを使用してください。別の Google Cloud アカウントを使用すると、そのアカウントに料金が発生する可能性があります。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。
左側の [ラボの詳細] ペインには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] ペインでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] ペインでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
タスク 1. CMEK を有効にした Cloud SQL for PostgreSQL インスタンスを作成する
このタスクでは、CMEK を有効にした Cloud SQL for PostgreSQL インスタンスを作成します。暗号鍵がなければデータベースを管理できないため、暗号鍵を安全に保管することが不可欠です。
Cloud SQL のプロダクトごと、プロジェクトごとのサービス アカウントを作成する
Cloud SQL CMEK に必要なサービス アカウントは、gcloud beta services identity create コマンドを使用して作成できます。
- Cloud Shell で次のコマンドを実行して、サービス アカウントを作成します。
export PROJECT_ID=$(gcloud config list --format 'value(core.project)')
gcloud beta services identity create \
--service=sqladmin.googleapis.com \
--project=$PROJECT_ID
- 承認を求められたら、[承認] ボタンをクリックします。
これにより、後のステップで CMEK にバインドするサービス アカウントが作成されます。
Cloud Key Management Service のキーリングと鍵を作成する
このセクションでは、CMEK で使用する Cloud KMS のキーリングと鍵を作成します。
- Cloud Shell で次のコマンドを実行して、Cloud KMS キーリングを作成します。
export KMS_KEYRING_ID=cloud-sql-keyring
export ZONE=$(gcloud compute instances list --filter="NAME=bastion-vm" --format=json | jq -r .[].zone | awk -F "/zones/" '{print $NF}')
export REGION=${ZONE::-2}
gcloud kms keyrings create $KMS_KEYRING_ID \
--location=$REGION
- Cloud Shell で次のコマンドを実行して、Cloud KMS 鍵を作成します。
export KMS_KEY_ID=cloud-sql-key
gcloud kms keys create $KMS_KEY_ID \
--location=$REGION \
--keyring=$KMS_KEYRING_ID \
--purpose=encryption
- 作成した鍵をサービス アカウントにバインドするために、Cloud Shell で次のコマンドを実行します。
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} \
--format 'value(projectNumber)')
gcloud kms keys add-iam-policy-binding $KMS_KEY_ID \
--location=$REGION \
--keyring=$KMS_KEYRING_ID \
--member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-cloud-sql.iam.gserviceaccount.com \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
サービス アカウント名は、前のサブタスクで gcloud beta services identity create コマンドから返された名前と同じです。
CMEK を有効にした Cloud SQL インスタンスを作成する
このセクションでは、CMEK を有効にした Cloud SQL for PostgreSQL インスタンスを作成します。既存のインスタンスにパッチを適用して CMEK を有効にすることはできません。CMEK を使用してデータを暗号化する場合は、この点に注意してください。
外部の開発環境またはアプリケーション環境から Cloud SQL インスタンスにアクセスするには、Cloud SQL インスタンスにパブリック IP アドレスを構成し、これらの環境でその IP アドレスを許可リストに登録してアクセスを制御します。これにより、パブリック インターフェースへのアクセスが、指定したアドレス範囲に制限されます。
このラボでは Compute Engine VM インスタンスを開発環境として扱うため、そのインスタンスの外部 IP アドレスを許可リストに登録する必要があります。また、Cloud Shell の外部 IP アドレスも許可リストに追加して、ラボの後半のタスクを実施しやすくします。
- Cloud Shell で次のコマンドを実行して、
bastion-vm VM インスタンスの外部 IP アドレスを確認します。
export AUTHORIZED_IP=$(gcloud compute instances describe bastion-vm \
--zone=$ZONE \
--format 'value(networkInterfaces[0].accessConfigs.natIP)')
echo Authorized IP: $AUTHORIZED_IP
- Cloud Shell で次のコマンドを実行して、Cloud Shell の外部 IP アドレスを確認します。
export CLOUD_SHELL_IP=$(curl ifconfig.me)
echo Cloud Shell IP: $CLOUD_SHELL_IP
- Cloud Shell で次のコマンドを実行して、次のように設定した Cloud SQL for PostgreSQL インスタンスを作成します。
export KEY_NAME=$(gcloud kms keys describe $KMS_KEY_ID \
--keyring=$KMS_KEYRING_ID --location=$REGION \
--format 'value(name)')
export CLOUDSQL_INSTANCE=postgres-orders
gcloud sql instances create $CLOUDSQL_INSTANCE \
--project=$PROJECT_ID \
--authorized-networks=${AUTHORIZED_IP}/32,$CLOUD_SHELL_IP/32 \
--disk-encryption-key=$KEY_NAME \
--database-version=POSTGRES_13 \
--cpu=1 \
--memory=3840MB \
--region=$REGION \
--root-password=supersecret!
- コマンドの入力後にプロンプトが表示されたら、「y」と入力します。
CMEK を有効にした Cloud SQL インスタンスを作成する
タスク 2. Cloud SQL for PostgreSQL データベースに対して pgAudit を有効にして構成する
このタスクでは、pgAudit データベース拡張機能を有効にして構成します。これにより、あらゆる種類のデータベース アクティビティのロギングをきめ細かく制御できるようになります。
- Cloud Shell で次のコマンドを実行して、pgAudit データベース フラグを Cloud SQL インスタンスに追加します。
gcloud sql instances patch $CLOUDSQL_INSTANCE \
--database-flags cloudsql.enable_pgaudit=on,pgaudit.log=all
- 確認して続行するよう求められたら、「y」と入力します。
注: パッチコマンドが完了するまで待ってから続行します。「Patching Cloud SQL instance...done」というメッセージが表示されたら、次のステップに進みます。
-
Cloud コンソールのナビゲーション メニュー(
)で [SQL] をクリックします。
-
postgres-orders という名前の Cloud SQL インスタンスをクリックします。
-
Cloud SQL の [概要] パネルのトップメニューで [再起動] をクリックして、ステップ 1 で実行したパッチ適用後のインスタンスを再起動します。
再度プロンプトが表示されたら、ポップアップ ダイアログで [再起動] をもう一度クリックします。
注: Cloud SQL for PostgreSQL インスタンスが再起動されるまでに数分かかることがあります。インスタンスが正常に再起動されたというメッセージ(Restarted postgres-orders)が表示されたら、次のステップに進みます。
- Cloud コンソールの [このインスタンスとの接続] セクションで [Cloud Shell を開く] をクリックします。
注: エラー メッセージが表示されて接続できない場合は、再起動後にインスタンスに再度アクセスできるようになるまで数分待ってから、ステップ 6 を繰り返します。
インスタンスに接続するためのコマンドが Cloud Shell に自動入力されます。
- コマンドをそのままの状態で実行し、パスワードの入力を求められたら「
supersecret!」と入力します。
Cloud Shell で psql セッションが開始されます。
-
psql で次のコマンドを実行して、
orders データベースを作成し、pgAudit 拡張機能を有効にして、すべての読み取りと書き込みがログに記録されるようにします。
CREATE DATABASE orders;
\c orders;
-
パスワード「supersecret!」をもう一度入力します。
-
psql で次のコマンドを実行して、データベース拡張機能を作成し、構成します。
CREATE EXTENSION pgaudit;
ALTER DATABASE orders SET pgaudit.log = 'read,write';
Cloud コンソールで監査ロギングを有効にする
このセクションでは、Cloud コンソールで監査ロギングを有効にします。
- Cloud コンソールのナビゲーション メニュー(
)で、[IAM と管理] > [監査ログ] をクリックします。
注: ページの上部に「1 つ以上の親リソースに関して、継承される監査ログの構成データを表示する権限がありません」というメッセージが表示された場合は、無視して次のステップに進んでください。
-
[データアクセス監査ログの構成] の [フィルタ] ボックスに「Cloud SQL」と入力し、プルダウン リストのエントリを選択します。
-
左側の [Cloud SQL] のチェックボックスをオンにしてから、右側の [情報パネル] で次のチェックボックスをオンにします。
- [情報パネル] で [保存] をクリックします。
Cloud SQL for PostgreSQL のデータベースにデータを入力する
このセクションでは、提供されているデータを orders データベースに入力します。
-
Cloud Shell のタイトルバーの + アイコンをクリックして、Cloud Shell で新しいタブを開きます。
-
新しいタブで、次のコマンドを実行して、データとデータベースの入力スクリプトをダウンロードします。
export SOURCE_BUCKET=gs://spls/gsp920
gsutil -m cp ${SOURCE_BUCKET}/create_orders_db.sql .
gsutil -m cp ${SOURCE_BUCKET}/DDL/distribution_centers_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/inventory_items_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/order_items_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/products_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/users_data.csv .
- 引き続き新しいタブで次のコマンドを実行して、データベースを作成し、データを入力します。
export CLOUDSQL_INSTANCE=postgres-orders
export POSTGRESQL_IP=$(gcloud sql instances describe $CLOUDSQL_INSTANCE --format="value(ipAddresses[0].ipAddress)")
export PGPASSWORD=supersecret!
psql "sslmode=disable user=postgres hostaddr=${POSTGRESQL_IP}" \
-c "\i create_orders_db.sql"
- 新しいタブでのターミナル セッションを終了します。
exit
- 元の Cloud Shell タブの psql セッションに戻り、次のコマンドを実行して、さらに特定のリレーション(
order_items テーブルなど)に対するすべての SELECT オペレーションもログに記録されるようにします。
CREATE ROLE auditor WITH NOLOGIN;
ALTER DATABASE orders SET pgaudit.role = 'auditor';
GRANT SELECT ON order_items TO auditor;
- 以下に示されている最初の
SELECT クエリを実行します。
SELECT
users.id AS users_id,
users.first_name AS users_first_name,
users.last_name AS users_last_name,
COUNT(DISTINCT order_items.order_id ) AS order_items_order_count,
COALESCE(SUM(order_items.sale_price ), 0) AS order_items_total_revenue
FROM order_items
LEFT JOIN users ON order_items.user_id = users.id
GROUP BY 1, 2, 3
ORDER BY 4 DESC
LIMIT 500;
SELECT
products.id AS products_id,
products.name AS products_name,
products.sku AS products_sku,
products.cost AS products_cost,
products.retail_price AS products_retail_price,
products.distribution_center_id AS products_distribution_center_id,
COUNT(DISTINCT order_items.order_id ) AS order_items_order_count,
COALESCE(SUM(order_items.sale_price ), 0) AS order_items_total_revenue
FROM order_items
LEFT JOIN inventory_items ON order_items.inventory_item_id = inventory_items.id
LEFT JOIN products ON inventory_items.product_id = products.id
GROUP BY 1, 2, 3, 4, 5, 6
ORDER BY 7 DESC
LIMIT 500;
SELECT
order_items.order_id AS order_id,
distribution_centers.id AS distribution_centers_id,
distribution_centers.name AS distribution_centers_name,
distribution_centers.latitude AS distribution_centers_latitude,
distribution_centers.longitude AS distribution_centers_longitude
FROM order_items
LEFT JOIN inventory_items ON order_items.inventory_item_id = inventory_items.id
LEFT JOIN products ON inventory_items.product_id = products.id
LEFT JOIN distribution_centers ON products.distribution_center_id = distribution_centers.id
GROUP BY 1, 2, 3, 4, 5
ORDER BY 2
LIMIT 500;
-
出力は 500 行になるため、q と入力して結果を閉じ、orders=> プロンプトに戻ります。
-
コードブロック内の他の 2 つのクエリタブについて、ステップ 5 と 6 を繰り返します。
-
psql を終了するには、次のコマンドを実行します。
\q
pgAudit ログを表示する
このステップでは、pgAudit ログでデータベースの更新とクエリのロギングを確認します。
-
Cloud コンソールのナビゲーション メニュー(
)で、[すべてのプロダクトを表示] をクリックします。[オブザーバビリティ] で [ロギング] をクリックして、[ログ エクスプローラ] ページを開きます。
-
[ログ エクスプローラ] の [クエリ] タブに次のコードを貼り付けて、[クエリを実行] をクリックします。
resource.type="cloudsql_database"
logName="projects/{{{project_0.project_id|(GCP Project)}}}/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
- 表示されたヒストグラムで、DDL 挿入に関連付けられた監査アクティビティと、先ほど実行した
SELECT クエリを確認できます。

- ヒストグラムの最後のバーをクリックします。これは、先ほど実行した
SELECT クエリに対応しています。
ヒストグラムの下にある [クエリ結果] パネルに、ログエントリが一覧表示されます。
- ログエントリを開くと、
protoPayload.request の下に SELECT クエリが表示されます。
Cloud SQL for PostgreSQL データベースに対して pgAudit を有効にして構成する
タスク 3. Cloud SQL IAM データベース認証を構成する
このタスクでは、Cloud SQL IAM データベース認証を構成します。これまでに行ったデータベース アクセスおよび更新タスクでは、いずれも、組み込みの PostgreSQL ユーザー アカウントが使用されていました。Cloud IAM アカウントを使用して Cloud SQL for PostgreSQL ユーザーを作成することもできます。データベース ユーザーは、組み込みのデータベース アカウントを使用する代わりに Cloud IAM を使用して Cloud SQL に対する認証を行うことができます。これらのユーザーには、データベース レベルできめ細かい権限を付与できます。
このタスクでは、ラボのユーザー アカウントを Cloud SQL IAM ユーザーとして構成し、postgres 管理者アカウントを使用してそのユーザーに orders.order_items データベース テーブルへのアクセス権を付与します。次に、psql コマンドライン ユーティリティを使用して、コマンドラインから orders.order_items データベース テーブルへのアクセスをテストします。
このタスクで使用される認証プロセスについては、Cloud SQL for PostgreSQL IAM 認証に関するドキュメントで詳しく説明しています。
Cloud SQL IAM 認証を構成する前に、Cloud IAM ユーザーを使用してデータベースへのアクセスをテストします。
Cloud SQL IAM 認証が有効になる前に、Cloud IAM ユーザーが最初はデータにアクセスできないことを確認するために、Cloud IAM ユーザーを使用してデータベースへのアクセスを試行します。接続試行が失敗することを確認してから、次のセクションに進んでこの問題を解決します。
- Cloud Shell で、ラボの受講者アカウントをユーザー名として使用して、
orders データベースへのアクセスをテストします。
export USERNAME=$(gcloud config list --format="value(core.account)")
export CLOUDSQL_INSTANCE=postgres-orders
export POSTGRESQL_IP=$(gcloud sql instances describe $CLOUDSQL_INSTANCE --format="value(ipAddresses[0].ipAddress)")
export PGPASSWORD=$(gcloud auth print-access-token)
psql --host=$POSTGRESQL_IP $USERNAME --dbname=orders
Cloud SQL IAM ユーザーがまだ作成されていないため、この接続試行は失敗し、次のような認証失敗メッセージが表示されます。
psql --host=$POSTGRESQL_IP $USERNAME --dbname=orders
psql: error: connection to server at "35.226.251.234", port 5432 failed: FATAL: password authentication failed for user "student-01-22fa974575e4@qwiklabs.net"
connection to server at "35.226.251.234", port 5432 failed: FATAL: password authentication failed for user "student-01-22fa974575e4@qwiklabs.net"
Cloud SQL IAM データベース認証では、Cloud IAM ユーザー パスワードとして OAuth 2.0 アクセス トークンを使用します。このアクセス トークンは有効期間が短く、1 時間のみ有効です。そのため、認証が必要になるたびにトークンを再生成する必要があります。psql パスワード パラメータのバッファは OAuth 2.0 トークン文字列を保持するには小さすぎるため、アクセス トークンを psql コマンドに渡すには、常に PGPASSWORD 環境変数を使用する必要があります。
Cloud SQL IAM ユーザーを作成する
このセクションでは、Cloud SQL IAM ユーザーを作成し、Cloud SQL IAM ユーザー認証が有効になっていることを確認します。
-
Cloud コンソールのナビゲーション メニュー(
)で [SQL] をクリックします。
-
postgres-orders という名前の Cloud SQL インスタンスをクリックします。
右側の [構成] パネルで、[データベース フラグとパラメータ] リストに pgAudit.log と cloudsql.enable_pgaudit のみが含まれていることを確認します。
-
[プライマリ インスタンス] の [SQL メニュー](左側のパネル)で、[ユーザー] をクリックして [ユーザー] パネルを開きます。
-
[ユーザー アカウントを追加] をクリックします。
-
[Cloud IAM] を選択します。
-
[プリンシパル] ボックスに、ラボの受講者名()を入力します。
-
[追加] をクリックします。
新しいユーザーが正常に追加されるまで待ちます。
インスタンスのメインの概要ページで、右側の [構成] パネルの [データベース フラグとパラメータ] リストに cloudsql.iam_authentication が追加されていることを確認します。
Cloud IAM ユーザーに Cloud SQL データベース テーブルへのアクセス権を付与する
次は、組み込みの postgres 管理者アカウントを使用して postgres-orders インスタンスに接続し、Cloud IAM ユーザーに orders.order_items テーブルへのアクセス権を付与します。
- インスタンスのメインの概要ページで、[このインスタンスとの接続] セクションにある [Cloud Shell を開く] をクリックします。
インスタンスに接続するためのコマンドが Cloud Shell に自動入力されます。
-
コマンドをそのままの状態で実行し、パスワードの入力を求められたら「supersecret!」と入力します。
-
次の SQL コマンドを入力して、orders データベースに切り替えます。
\c orders
パスワードの入力を求められたら、「supersecret!」をもう一度入力します。
- 次の SQL コマンドを入力して、ラボユーザーに
order_items テーブルに対するすべての権限を付与します。このクエリには、あらかじめラボの Cloud IAM ユーザー名が挿入されています。
GRANT ALL PRIVILEGES ON TABLE order_items TO "{{{user_0.username|[IAM Username]}}}";
\q
Cloud SQL IAM 認証を構成した後、Cloud IAM ユーザーを使用してデータベースへのアクセスをテストする
Cloud SQL IAM 認証が有効になった後は、Cloud IAM ユーザーがデータにアクセスできることを確認するために、Cloud IAM ユーザーを使用してデータベースへのアクセス試行を繰り返します。
組み込みの postgres ユーザーではなく Cloud IAM ユーザーを使用して、データベースへのアクセスを再度テストできます。
- Cloud IAM データベース ユーザーを使用してデータベースに接続するには、Cloud Shell で次のコマンドを実行します。
export PGPASSWORD=$(gcloud auth print-access-token)
psql --host=$POSTGRESQL_IP $USERNAME --dbname=orders
この接続は成功し、Cloud IAM ユーザー認証を使用してインスタンスに接続された状態になります。
- 次のクエリを実行して、アクセス権限をテストします。
SELECT COUNT(*) FROM order_items;
これにより、成功の結果が返されます。
orders=> SELECT COUNT(*) FROM order_items;
count
--------
198553
(1 row)
- 次のクエリを実行して、他のテーブルのいずれかにアクセスできないことを確認します。
SELECT COUNT(*) FROM users;
このクエリからは成功の結果が返されません。
orders=> SELECT COUNT(*) FROM users;
ERROR: permission denied for table users
Cloud SQL IAM データベース認証を構成する
お疲れさまでした
このラボでは、顧客管理の暗号鍵を使用して Cloud SQL for PostgreSQL の保存データを保護し、pgAudit を有効にして、Cloud SQL IAM データベース ユーザー認証を構成しました。
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2025 年 9 月 3 日
ラボの最終テスト日: 2025 年 7 月 2 日
Copyright 2026 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。