PCI DSS に準拠した、機密性の高いカード所有者データのトークン化

Last reviewed 2025-04-28 UTC

このドキュメントでは、Cloud Run functions 上で、クレジット カードおよびデビットカードのアクセス制御されたトークン化サービスを設定する方法について説明します。このサービスを設定するために、このドキュメントのデプロイ では、次の Google Cloud サービスを使用します。 Identity and Access Management(IAM)Cloud Key Management Service(KMS)

トークン化とは、クレジット カードデータなどの機密情報を安全なプレースホルダの値、つまりトークンで置き換えるプロセスを指します。 Payment Card Industry データセキュリティ基準(PCI DSS)のパート 3 では、クレジット カード上に保管されているデータの大部分を機密情報として扱うことを要件としています。

トークン自体は、特定のコンテキストで トークン化されたデータ を検索する手段として以外は意味がありません。それでも、トークンにユーザー固有の情報が一切含まれていないこと、そしてトークンを直接復号できないことを確認する必要があります。そうすることで、顧客の支払いカードのトークンを管理できなくなった場合でも、トークンによるカード所有者データの不正使用を回避できます。

機密情報を扱うサービス

カード所有者データ環境(CDE)をホストするプラットフォームやサービスにはさまざまな選択肢があります。このドキュメントでは、Cloud Run functions を使用したデプロイの例を紹介し、プロダクション レディ ソリューションに向けた次の手順に進めるようお手伝いします。

Cloud Run functions は、コードをホストして実行するサーバーレス プラットフォームです。このプラットフォームでは、自動的にスケールするアプリケーションを迅速に起動できます。注意する点として、PCI DSS 準拠の CDE では受信トラフィックと送信トラフィックのすべてを認証済みの接続に制限する必要がありますが、 現在のところ、こうしたきめ細かい制御を Cloud Run functions で行うことはできません。したがって、代替コントロールを別の場所(アプリケーションなど)に実装するか、別のプラットフォームを選択する必要があります。このチュートリアルで説明するトークン化サービスは、 自動スケーリング可能な マネージド インスタンス グループや Kubernetes クラスタといったコンテナ環境で実行することもできます。コンテナ環境は VPC ネットワークを完全に制御できるため、本番環境として適切です。

Cloud KMS は Google Cloudの鍵管理サービスです。 Cloud KMS は暗号鍵をホストして 定期的な鍵のローテーションを行い 保管されたアカウントデータを暗号化または復号します。

このドキュメントでは IAM を使用して、トークン化サービスで使用されるすべてのリソースを厳格に制御します。Cloud KMS へのアクセス権を付与し、トークナイザを実行するために、短時間で期限切れとなるトークンを持つ特別なサービス アカウントが必要です。

次の図は、このドキュメントで作成するトークン化アプリのアーキテクチャを示しています。

トークン化アプリのアーキテクチャ

目標

  • サービス アカウントを作成します。
  • Cloud KMS を設定する。
  • 2 つの Cloud Run functions を作成する。
  • 認証トークンを作成する。
  • トークナイザを呼び出す。

費用

このドキュメントでは、課金対象である次のコンポーネントを使用します。 Google Cloud

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

新規の Google Cloud ユーザーの方は、無料トライアルをご利用いただける場合があります。

始める前に

  1. プロジェクト作成者 IAM ロール (roles/resourcemanager.projectCreator)があることを確認します。ロールを付与する方法を確認する
  2. コンソール Google Cloud で、プロジェクトの選択ページに移動します。

    プロジェクト セレクタに移動

  3. [プロジェクトの作成] をクリックします。

  4. プロジェクトに名前を付けます。生成されたプロジェクト ID をメモしておきます。

  5. 必要に応じて他のフィールドを編集します。

  6. [作成] をクリックします。

  7. プロジェクトで課金が有効になっていることを確認します Google Cloud 。

  8. Cloud Build、Cloud Run functions、Cloud KMS の各 API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法を確認する

    API を有効にする

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、 それ以上の請求は発生しません。詳細については、 クリーンアップをご覧ください。

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

Cloud Run functions のデフォルトのランタイム サービス アカウントには編集者のロールがあり、 多くの Google Cloud サービスに幅広くアクセスできます。 これは関数を開発する最も速い方法ですが、デフォルトのサービス アカウントはテストと開発でのみ使用することをおすすめします。最小権限の 原則に従って、関数で使用できる API を制限するサービス アカウントを作成します。 サービス アカウントを作成するには、次のようにします。

  1. コンソール Google Cloud で、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。

  3. [ サービス アカウントを作成] をクリックします。

  4. [サービス アカウント名] フィールドに Tokenization Service User と入力します。 Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドの値が設定されます。

  5. 省略可: [サービス アカウントの説明] 欄に、サービス アカウントの説明を入力します。

  6. [作成して続行] をクリックします。

  7. [ロールを選択] をクリックし、[Cloud KMS CryptoKey の暗号化/復号] を選択します。

  8. サービス アカウントの作成を完了するには、[完了] をクリックします。

    作成されたサービス アカウント ユーザーには、次のメールアドレスが設定されています。

    tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com

Cloud KMS を設定する

  1. コンソール Google Cloud で [**鍵管理**] を開きます。

    [暗号鍵] ページに移動

  2. [+ キーリングを作成する] をクリックします。表示されるダイアログで、次の操作を行います。

    1. キーリングに tokenization-service-kr という名前を付けます。
    2. [**キーリングのロケーション**] で [**グローバル**] を選択します。この選択は一般的であり、このデプロイ例では十分です。本番環境のアーキテクチャ では、 Cloud KMS のさまざまなロケーション間の違いを理解してから決定する必要があります。
    3. キーリングを作成した後は名前を変更できないため、選択内容を再確認してください。
    4. [作成] をクリックします。

    キーリングが作成されて、[鍵を作成] ページが表示されます。

  3. [鍵を作成する] ダイアログで、次の操作を行います。

    1. 鍵に cc-tokenization という名前を付けます。
    2. [目的] で [Symmetric encrypt/decrypt] を選択します。
    3. [ローテーション期間] を任意の値に設定し、[作成] をクリックします。

Cloud Run 関数を作成する

このドキュメントでは、Cloud Shell を使用していることを前提としています。別の ターミナルを使用している場合は、 最新バージョンの Google Cloud CLI を使用していることを確認してください。

  1. コンソール Google Cloud で Cloud Shell を開きます。

    Cloud Shell に移動

  2. GitHub プロジェクト リポジトリのクローンを作成し、作業フォルダに移動します。

    git clone https://github.com/GoogleCloudPlatform/community gcp-community
    cd gcp-community/tutorials/pci-tokenizer/
    

    gcs-cf-tokenizer フォルダには、ファイル index.js が格納されています。これは、これから作成する 2 つの異なる Cloud Run functions のソースです。また、実行するパッケージを Cloud Run functions に指示する package.json も格納されています。

  3. KMS 構成を適用し、構成テンプレート ファイルをコピーして、編集用に開きます。

    cp config/default.json config/local.json
    nano config/local.json
    

    Node.js ランタイム では、プロジェクト ID を明示的に定義する 必要があり Google Cloud ます。

    "project_id":              "YOUR_PROJECT_ID"
  4. KMS 構成を確認して、前のセクションで作成した KMS 値を適用します。

    "location":                "global",
    "key_ring":                "tokenization-service-kr",
    "key_name":                "cc-tokenization"
    
  5. トークン化関数をデプロイします。

    gcloud functions deploy tokenize --runtime=nodejs18 --trigger-http \
        --entry-point=kms_crypto_tokenize --memory=256MB \
        --service-account=tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com \
        --no-allow-unauthenticated --source=.
    

    この関数は、クレジット カード情報をトークンに変換します。

  6. gcloud functions deploy コマンドの出力で、httpsTrigger の下の URL の値を探します。URL の値を TOK_URL 環境変数に格納します。

    TOK_URL="TOK_URL"

    TOK_URL 環境変数を使用して tokenize 関数を呼び出します。

  7. トークン化解除関数を KMS モードでデプロイします。

    gcloud functions deploy detokenize --runtime=nodejs18 --trigger-http \
        --entry-point=kms_crypto_detokenize --memory=256MB \
        --service-account=tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com \
        --no-allow-unauthenticated --source=.
    

    この関数はトークン化プロセスを逆の状態にします。

  8. gcloud functions deploy コマンドの出力で、httpsTrigger の下の URL の値を探します。URL の値を DETOK_URL 環境変数に格納します。

    DETOK_URL="DETOK_URL"

    DETOK_URL 環境変数を使用してトークン化解除関数を呼び出します。

    ここでは、カード番号をトークンに変換するための関数と、プロセスを逆の状態にする関数という 2 つの個別の Cloud Run functions の関数を作成しました。それぞれ異なるエントリ ポイントにより、index.js ファイル内の適切な開始関数に実行が指示されます。

  9. 関数がデプロイされたら、Cloud Run functions コンソールを開きます。

    Cloud Run functions コンソールを開く

  10. 関数が作成されたことを確認します。正常に処理されていれば、それぞれ横にチェックマークが付いた 2 つの関数が表示されます。

認証トークンを作成する

gcloud functions deploy コマンドの no-allow-unauthenticated オプションを使用すると、関数を呼び出す呼び出し元は、呼び出し元の ID を表明するための認証トークンを提示する必要があります。呼び出し元には cloudfunctions.functions.invoke 権限が必要です。この権限は、 Cloud Functions 起動元、Cloud Functions 管理者、Cloud Functions 開発者の事前定義ロールに含まれています。

  • 認証トークンを作成します。

    AUTH_TOKEN=$(gcloud auth print-identity-token)
    echo $AUTH_TOKEN
    

これらのコマンドにより、認証トークンの文字列が生成され、環境変数 $AUTH_TOKEN に格納されて、トークンが表示されます。後で、トークンを使用してデプロイした Cloud Run functions の関数を呼び出します。

トークナイザを呼び出す

  1. トークナイザに渡すサンプルデータを作成します。

    export TOK_CC=4000300020001000
    export TOK_MM=11
    export TOK_YYYY=2028
    export TOK_UID=543210
    
  2. 前のセクションで説明したように認証トークンを生成し、トークナイザを呼び出します。

    CC_TOKEN=$(curl -s \
    -X POST "$TOK_URL" \
    -H "Content-Type:application/json" \
    -H "Authorization: Bearer $AUTH_TOKEN" \
    --data '{"cc": "'$TOK_CC'", "mm": "'$TOK_MM'", "yyyy": "'$TOK_YYYY'", "user_id": "'$TOK_UID'"}' \
    )
    echo $CC_TOKEN
    

    クレジット カード データを表すトークナイザ文字列が表示されます。この文字列は環境変数 CC_TOK に格納されています。カード情報を取得するには、デトークナイザを呼び出します。

  3. 次のコマンドを使用して、トークン化を元に戻します。

    DETOK_DATA=$(curl -s \
    -X POST "$DETOK_URL" \
    -H  "Content-Type:application/json" \
    -H "Authorization: Bearer $AUTH_TOKEN" \
    --data '{"user_id": "'$TOK_UID'", "token": "'$CC_TOKEN'"}' \
    )
    echo -e "$DETOK_DATA\n"
    

    出力は次のようになります。

    {"cc":"4000300020001000","mm":"11","yyyy":"2028","userid":"543210"}
    

    上記のデータは、最初にトークナイザに送信されて復号された後、アプリで取得したものです。

この例を拡張する

GitHub 上のサンプルコード は出発点として最適ですが、本番環境に移行する前には他にも 考慮事項があります。

支払いカードのトークン化に Cloud Run functions を使用する場合、認定セキュリティ評価機関の審査や自己問診に合格するための追加作業が必要になることがあります。具体的には、PCI DSS のセクション 1.2 と 1.3 では受信トラフィックと送信トラフィックに対する厳格な管理を要件としています。Cloud Run functions と App Engine には双方向で構成可能なファイアウォールがないため、代替コントロールを作成するか、Compute Engine または Google Kubernetes Engine にトークン化サービスをデプロイする必要があります。コンテナ化を検討される方のために、GitHub のコードには Docker との互換性があり、補足のドキュメントも含まれています。

また、このサンプルコードは、デプロイ時に npm(Node.js パッケージ マネージャー)依存関係を pull します。本番環境では常に、検査済みの特定バージョンに依存関係を固定する必要があります。その上で、それらのバージョンをアプリ自体にバンドルするか、限定公開された信頼できる場所から提供します。いずれのアプローチを取っても、公開 npm リポジトリでのサービス停止によるダウンタイムや、安全だと見込んでいたパッケージを感染させるサプライチェーン攻撃によるダウンタイムを回避するのに役立ちます。アプリ全体をあらかじめビルドしてバンドルすると、通常はデプロイ時間が短縮されます。つまり、アプリの起動が高速化され、よりスムーズにスケールできます。

クリーンアップ

このデプロイ例で使用したリソースについて Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除します。

  1. コンソール Google Cloud で、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、 [Shut down] をクリックしてプロジェクトを削除します。

次のステップ