AlloyDB Omni RPM で透過的データ暗号化(TDE)を有効にする

1. はじめに

この Codelab では、RPM パッケージを使用して AlloyDB Omni で透過的データ暗号化(TDE)を構成して有効にする方法について説明します。TDE は、データファイル、write-ahead log(WAL)、一時データファイルを保存時に暗号化し、基盤となる物理ストレージ メディアへの不正アクセスからデータを保護します。

この Codelab では、ストレージ ボリュームをプロビジョニングし、File KMS を使用して TDE 対応の AlloyDB Omni クラスタを初期化して実行し、ディスク ファイルの保存データの暗号化を確認する方法を学習します。

前提条件

  • Google Cloud コンソールから Google Cloud プロジェクトと Cloud Shell にアクセスできること。
  • Google Cloud SDK(gcloud)のインストールと構成。gcloud のインストールの詳細については、gcloud-install をご覧ください。

学習内容

  • 専用のデータベース ディスク、バックアップ ディスク、スワップ ディスクを使用して Compute Engine VM を作成する方法。
  • ストレージ ボリューム(XFS)のフォーマット、/etc/fstab の構成、データパスの準備を行う方法。
  • File KMS を使用して鍵暗号鍵(KEK)を生成して管理する方法。
  • AlloyDB Omni RPM パッケージと PostgreSQL クライアント ユーティリティをインストールする方法。
  • RPM 設定ツール(alloydbomni18-setup)と --tde-kek-url を使用して TDE 対応の AlloyDB Omni クラスタをブートストラップする方法。
  • 生ファイル検査(grep)を使用してディスク上の暗号化を検証する方法。

必要なもの

  • AlloyDB Omni RPM 登録フォームに記入するか、Linux 版 AlloyDB Omni の概要を参照して、AlloyDB Omni RPM の URL リンクを取得します。リポジトリの URL は、登録済みのメールアドレスに送信されます。
  • Google Cloud にアクセスできるターミナル(Cloud Shell を推奨)。

2. 設定と要件

プロジェクトのセットアップ

Google Cloud プロジェクトの作成

  1. Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにするアイコン

  1. Google Cloud コンソールを開き、右上のツールバーにある Cloud Shell アイコンをクリックします。Cloud Shell は、コンソールで G を押してから S を押すか、shell.cloud.google.com にアクセスして開くこともできます。
  2. 通常、環境のプロビジョニングと接続には数分かかります。完了すると、入力可能なターミナル プロンプトが表示されます。

接続された環境を示す Google Cloud Shell ターミナル

3. Compute Engine VM を作成する

このセクションでは、データベース データ(/data1)、バックアップ/オブザーバビリティ(/obs)、スワップ領域専用の永続ディスクを使用して Rocky Linux 9 を実行する Compute Engine(GCE)仮想マシン(VM)を作成します。

  1. プロジェクト ID、VM 名、ゾーン、リージョンの環境変数を定義します。
    export PROJECT="your-project-id"
    export INSTANCE_NAME="alloydb-omni-tde-vm"
    export ZONE="us-central1-c"
    export REGION="us-central1"
    
  2. デフォルト プロジェクトを構成します。
    gcloud config set project $PROJECT
    
  3. SSH トラフィックのネットワーク ファイアウォール ルールを作成します。
    gcloud compute firewall-rules create allow-ssh-alloydb-omni-tde \
        --project=$PROJECT \
        --direction=INGRESS \
        --action=allow \
        --rules=tcp:22 \
        --source-ranges="0.0.0.0/0"
    
  4. VM はパブリック IP アドレスなしで作成されるため、RPM パッケージをダウンロードするためのアウトバウンド インターネット アクセスを提供するように Cloud Router と Cloud NAT ゲートウェイを構成します。プロジェクト リージョンに Cloud NAT がすでに存在する場合は、続行できます。
    gcloud compute routers create alloydb-omni-tde-router \
        --project=$PROJECT \
        --network=default \
        --region=$REGION 2>/dev/null || true
    
    gcloud compute routers nats create alloydb-omni-tde-nat \
        --project=$PROJECT \
        --router=alloydb-omni-tde-router \
        --region=$REGION \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips 2>/dev/null || true
    
    注: リージョンに Cloud NAT ゲートウェイがすでに存在する場合、GCP は、すべてのサブネットに対して NAT がすでに構成されていることを示すメッセージを返します。このエラーは無視して続行してかまいません。
  5. データベースのデータ、バックアップ、スワップ領域用の追加の永続ディスクを作成します。
    gcloud compute disks create $INSTANCE_NAME-data \
        --project=$PROJECT --zone=$ZONE --size=50GB --type=pd-balanced
    
    gcloud compute disks create $INSTANCE_NAME-obs \
        --project=$PROJECT --zone=$ZONE --size=50GB --type=pd-balanced
    
    gcloud compute disks create $INSTANCE_NAME-swap \
        --project=$PROJECT --zone=$ZONE --size=10GB --type=pd-balanced
    
  6. アタッチされたストレージ ボリュームを使用して、Rocky Linux 9 VM インスタンスをプロビジョニングします。
    gcloud compute instances create $INSTANCE_NAME \
        --project=$PROJECT \
        --zone=$ZONE \
        --machine-type=n2-highmem-16 \
        --image-family=rocky-linux-9 \
        --image-project=rocky-linux-cloud \
        --boot-disk-size=30GB \
        --boot-disk-type=pd-balanced \
        --disk=name=$INSTANCE_NAME-data,device-name=db-data,mode=rw \
        --disk=name=$INSTANCE_NAME-obs,device-name=obs,mode=rw \
        --disk=name=$INSTANCE_NAME-swap,device-name=swap,mode=rw \
        --no-address
    

4. ディスク、システム チューニング、ファイル KMS 鍵を準備する

このセクションでは、VM に接続し、永続ストレージ ボリュームのフォーマットとマウント、スワップの構成、SELinux の調整を行い、File KMS を使用して TDE 鍵暗号鍵(KEK)を生成します。

  1. Identity-Aware Proxy(IAP)を介して VM に SSH 接続します。
    gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap
    
  2. データ ボリューム(/data1)とオブザーバビリティ/バックアップ ボリューム(/obs)をフォーマットしてマウントします。
    sudo mkdir -p /data1 /obs
    
    sudo parted /dev/disk/by-id/google-db-data mklabel gpt
    sudo parted /dev/disk/by-id/google-db-data mkpart primary 0% 100%
    
    sudo parted /dev/disk/by-id/google-obs mklabel gpt
    sudo parted /dev/disk/by-id/google-obs mkpart primary 0% 100%
    
    sleep 3
    sudo mkfs.xfs -L data /dev/disk/by-id/google-db-data-part1
    sudo mkfs.xfs -L obs /dev/disk/by-id/google-obs-part1
    
    echo -e "LABEL=data\t/data1\txfs\tdefaults\t0 0" | sudo tee -a /etc/fstab
    echo -e "LABEL=obs\t/obs\txfs\tdefaults\t0 0" | sudo tee -a /etc/fstab
    
    sudo systemctl daemon-reload
    sudo mount /data1
    sudo mount /obs
    
  3. 専用のスワップ ディスクにスワップ領域を作成して有効にします。
    SWAP_UUID=$(sudo mkswap /dev/disk/by-id/google-swap 2>/dev/null | awk '$0 ~ "UUID" {print $NF}')
    echo -e "${SWAP_UUID}\tswap\tswap\tdefaults\t0 0" | sudo tee -a /etc/fstab
    sudo swapon -a
    
  4. データベース ディレクトリとファイル KMS 鍵ファイルの環境変数を定義します。
    export PGDATA="/data1/18"
    export KMS_DIR="/data1/kms"
    export KEK_FILE="$KMS_DIR/tde_key"
    export ALLOYDB_OMNI_REPOSITORY_URL="<your-repository-url>"
    
  5. データベースとファイル KMS 鍵ストレージ用のストレージ ディレクトリを作成します。
    sudo mkdir -p $PGDATA
    sudo mkdir -p $KMS_DIR
    
  6. File KMS 用に OpenSSL を使用して、暗号学的に安全な 32 バイトの鍵暗号鍵(KEK)を生成します。
    sudo openssl rand -base64 32 | sudo tee $KEK_FILE
    sudo chmod 700 $KMS_DIR
    sudo chmod 600 $KEK_FILE
    
  7. 必要な SELinux 管理ユーティリティをインストールします。
    sudo dnf install -y policycoreutils-python-utils
    

5. AlloyDB Omni RPM パッケージをインストールする

パッケージ リポジトリを構成し、標準の PostgreSQL 18 ツールとともに AlloyDB Omni データベース サーバーをインストールします。

注: AlloyDB Omni RPM 登録フォームの入力後にメールで送信されたリポジトリ URL を $ALLOYDB_OMNI_REPOSITORY_URL に置き換えます。詳細については、Linux 版 AlloyDB Omni の概要をご覧ください。

  1. AlloyDB Omni の YUM リポジトリ構成ファイルを作成します。
    sudo tee /etc/yum.repos.d/alloydbomni.repo << EOF
    [alloydbomni]
    name=alloydbomni
    baseurl=$ALLOYDB_OMNI_REPOSITORY_URL
    enabled=1
    repo_gpgcheck=0
    gpgcheck=1
    gpgkey=https://dl.google.com/linux/linux_signing_key.pub
    EOF
    
  2. YUM リポジトリのキャッシュを更新し、AlloyDB Omni 18 サーバーの RPM パッケージをインストールします。
    sudo yum makecache
    sudo dnf install -y alloydbomni18
    
  3. 公式の PostgreSQL PGDG RPM リポジトリをインストールし、標準の PostgreSQL 18 クライアント パッケージ(psql)をインストールします。
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf install -y postgresql18
    
  4. /data1 と KMS 鍵ディレクトリの所有権を postgres ユーザーに割り当てます。
    sudo chown -R postgres:postgres /data1 $KMS_DIR
    sudo chmod 755 /data1 $PGDATA
    

6. TDE 対応クラスタをブートストラップする

リソース割り当てを構成し、ホスト ファイアウォール ポートを開き、ファイル KMS 鍵(POSTGRES_INITDB_ARGS="--tde-kek-url=file://$KEK_FILE")を使用して透過的データ暗号化が有効になっている AlloyDB Omni クラスタを初期化します。

  1. SELinux を制限なしモードに設定し、PostgreSQL のホスト ファイアウォール ルールを構成します。
    sudo setenforce 0
    sudo firewall-cmd --add-port=5432/tcp --permanent
    sudo firewall-cmd --reload
    
  2. systemd サービス オーバーライド パラメータを構成して、メモリと CPU のリソース上限を割り当てます。
    sudo mkdir -p /etc/systemd/system/alloydbomni18.service.d
    sudo tee /etc/systemd/system/alloydbomni18.service.d/override.conf << EOF
    [Service]
    CPUQuota=90%
    MemoryMax=80%
    EOF
    sudo chown root:root /etc/systemd/system/alloydbomni18.service.d/override.conf
    sudo chmod 644 /etc/systemd/system/alloydbomni18.service.d/override.conf
    sudo systemctl daemon-reload
    
  3. 管理者環境変数を設定し、alloydbomni18-setup initdb を使用して TDE データベース クラスタを初期化します。
    export PGPASSWORD="YourStrongPassword123!"
    export POSTGRES_INITDB_ARGS="--tde-kek-url=file://$KEK_FILE"
    
    sudo POSTGRES_INITDB_ARGS="$POSTGRES_INITDB_ARGS" PGPASSWORD="$PGPASSWORD" PGDATA="$PGDATA" \
        /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  4. postgresql.conf でサーバーポート 5432 を構成します。
    sudo sed -i "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5432/" $PGDATA/postgresql.conf
    
  5. alloydbomni18-setup preparedb を使用してシステム カタログと拡張機能を準備します。
    sudo PGPORT=5432 PGPASSWORD="$PGPASSWORD" PGDATA="$PGDATA" \
        /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    
  6. alloydbomni18 systemd サービスを有効にして起動します。
    sudo systemctl enable alloydbomni18
    sudo systemctl start alloydbomni18
    sudo systemctl status alloydbomni18
    
    出力に Active: active (running) が表示されていることを確認します。

7. データベース オペレーションと TDE ディスク暗号化の検証

TDE データベースに接続し、サンプルレコードを挿入して、CHECKPOINT を実行してデータをディスクに強制的に書き込み、直接ディスク スキャン(grep)を実行して、保存データの暗号化を証明します。

  1. psql を使用して alloydbadmin データベースに接続します。
    PGPASSWORD="YourStrongPassword123!" /usr/lib/postgresql/18/bin/psql -h localhost -p 5432 -U postgres -d alloydbadmin
    
  2. テストテーブルを作成し、機密文字列を挿入して、チェックポイントをトリガーし、ダーティ バッファをストレージに書き込みます。
    CREATE TABLE customer_credentials (
        id SERIAL PRIMARY KEY,
        username TEXT,
        secret_passcode TEXT
    );
    
    INSERT INTO customer_credentials (username, secret_passcode)
    VALUES ('alice_user', 'UNENCRYPTED_DEMO_SECRET_98765');
    
    CHECKPOINT;
    
  3. 内部 AlloyDB TDE 統計情報ビュー pgsnap.g$tde_stats をクエリして、アクティブな暗号化ステータス、KEK の場所、ブロック指標を確認します。
    SELECT is_tde_enabled, tde_kek_url, tde_data_blocks_encrypted, tde_wal_blocks_encrypted
    FROM pgsnap.g$tde_stats;
    
    アクティブな TDE(is_tde_enabled = t)、KEK ファイルパス、暗号化されたブロック カウンタを確認する出力例:
     is_tde_enabled |        tde_kek_url        | tde_data_blocks_encrypted | tde_wal_blocks_encrypted 
    ----------------+---------------------------+---------------------------+--------------------------
     t              | file:///data1/kms/tde_key |                      2023 |                     2717
    (1 row)
    
  4. psql を終了します。
    \q
    
  5. /data1/18/base/ の下の未加工のデータベース ストレージ ファイルでパスコード文字列を検索し、TDE のディスク保護を確認します。
    sudo grep -a -rn "UNENCRYPTED_DEMO_SECRET_98765" /data1/18/base/
    

検証に関する重要なポイント:

  • Non-TDE データベース インスタンスで、テーブル関係ファイルに対して grep を実行すると、ディスクにプレーン テキスト文字列が表示されます。
  • TDE 対応データベース インスタンスでは、すべてのデータファイル、インデックス、ログ先行書き込み(WAL)、一時データが AES ブロック暗号で完全に暗号化されているため、grep は一致なしを返します。

8. クリーンアップ

演習を完了したら、不要なコンピューティング料金が発生しないようにリソースをクリーンアップします。

  1. VM の SSH セッションから切断します。
    exit
    
  2. GCE 仮想マシンとアタッチされた永続ディスクを削除します。
    gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet
    gcloud compute disks delete $INSTANCE_NAME-data $INSTANCE_NAME-obs $INSTANCE_NAME-swap --zone=$ZONE --project=$PROJECT --quiet
    
  3. ファイアウォール ルールと Cloud NAT ゲートウェイ リソースを削除します。
    gcloud compute firewall-rules delete allow-ssh-alloydb-omni-tde --project=$PROJECT --quiet
    gcloud compute routers nats delete alloydb-omni-tde-nat --router=alloydb-omni-tde-router --region=$REGION --project=$PROJECT --quiet
    gcloud compute routers delete alloydb-omni-tde-router --region=$REGION --project=$PROJECT --quiet
    

9. 完了

おめでとうございます!AlloyDB Omni RPM の TDE Codelab を完了しました。

学習した内容

  • ストレージ ディスク(/data1、/obs)のプロビジョニング、スワップの設定、XFS ファイルシステムのフォーマットを行う方法。
  • File KMS を使用して鍵暗号鍵を生成し、管理する方法。
  • RPM ツールを使用して TDE 対応の AlloyDB Omni クラスタを初期化して起動する方法。
  • 直接の RAW ディスク検査(grep)を使用して保存データの暗号化を検証する方法。

詳細については、AlloyDB Omni のドキュメントをご覧ください。

10. アンケート

このチュートリアルの利用方法をお選びください。

全体を通して読むだけ 内容を読んで演習をやり遂げる