このチュートリアルでは、Cloud Functions 上で、クレジット カードおよびデビットカードのアクセス制御されたトークン化サービスを設定する方法を説明します。このサービスを設定するために、この記事では Google Cloud サービスである、Identity and Access Management(IAM)および Cloud Key Management Service(KMS) を使用します。
トークン化とは、クレジット カードデータなどの機密情報を安全なプレースホルダの値、つまりトークンで置き換えるプロセスを指します。Payment Card Industry データセキュリティ基準(PCI DSS)のパート 3 では、クレジット カード上に保管されているデータの大部分を機密情報として扱うことを要件としています。
トークンは、特定のコンテキストでトークン化されたデータを検索する手段であるという点を除き、それ自体に意味はありません。それでも、トークンにユーザー固有の情報が一切含まれていないこと、そしてトークンを直接復号できないことを確認する必要があります。そうすることで、顧客の支払いカードのトークンを管理できなくなった場合でも、トークンによるカード所有者データの不正使用を回避できます。
機密情報を扱うサービス
カード所有者データ環境(CDE)をホストするプラットフォームやサービスにはさまざまな選択肢があります。このチュートリアルでは、Cloud Functions を使用したデプロイの例を紹介し、本番環境対応のソリューションに向けた次の手順に進めるようお手伝いします。
Cloud Functions は、コードをホストして実行するサーバーレス プラットフォームです。このプラットフォームでは、自動的にスケールするアプリケーションを迅速に起動できます。注意する点として、PCI DSS 準拠の CDE では受信トラフィックと送信トラフィックのすべてを認証済みの接続に制限する必要がありますが、現在のところ、こうしたきめ細かい制御を Cloud Functions で行うことはできません。したがって、代替コントロールを別の場所(アプリケーションなど)に実装するか、別のプラットフォームを選択する必要があります。このチュートリアルで説明するトークン化サービスは、自動スケーリング可能なマネージド インスタンス グループや Kubernetes クラスタといったコンテナ環境で実行することもできます。コンテナ環境は VPC ネットワークを完全に制御できるため、本番環境として適切です。
Cloud KMS は Google Cloud の鍵管理サービスです。Cloud KMS は暗号鍵をホストして定期的な鍵のローテーションを行い、保管されたアカウント データを暗号化または復号します。
このチュートリアルでは IAM を使用して、トークン化サービスで使用されるすべてのリソースを厳格に制御します。Cloud KMS へのアクセス権を付与し、トークナイザを実行するために、短時間で期限切れとなるトークンを持つ特別なサービス アカウントが必要です。
次の図は、このチュートリアルで作成するトークン化アプリのアーキテクチャを示しています。
目標
- サービス アカウントを作成する。
- Cloud KMS を設定する。
- 2 つの Cloud Functions を作成する。
- 認証トークンを作成する。
- トークナイザを呼び出す。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
-
Google Cloud コンソールでプロジェクトの選択ページに移動します。
-
Google Cloud プロジェクトの作成を開始するには、[プロジェクトを作成] をクリックします。
-
プロジェクトに名前を付けます。生成されたプロジェクト ID をメモしておきます。
-
必要に応じて他のフィールドを編集します。
-
プロジェクトを作成するには、[作成] をクリックします。
-
Cloud Build, Cloud Functions, and Cloud KMS API を有効にします。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
サービス アカウントを作成する
Cloud Functions のデフォルトのランタイム サービス アカウントには編集者のロールがあり、多くの Google Cloud サービスに幅広くアクセスできます。これは関数を開発する最も速い方法ですが、デフォルトのサービス アカウントはテストと開発でのみ使用することをおすすめします。最小権限の原則に従って、関数で使用できる API を制限するサービス アカウントを作成します。サービス アカウントを作成するには、次のようにします。
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
プロジェクトを選択します。
[
サービス アカウントを作成] をクリックします。[サービス アカウント名] フィールドに「
Tokenization Service User
」と入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。省略可: [サービス アカウントの説明] フィールドに、サービス アカウントの説明を入力します。
[作成して続行] をクリックします。
[ロールを選択] をクリックし、[Cloud KMS CryptoKey の暗号化/復号] を選択します。
サービス アカウントの作成を完了するには、[完了] をクリックします。
作成されたサービス アカウント ユーザーには、次のメールアドレスが設定されています。
tokenization-service-user@YOUR_PROJECT_ID.iam.gserviceaccount.com
Cloud KMS を設定する
Google Cloud コンソールで [鍵管理] を開きます。
[+ キーリングを作成] をクリックします。表示されたダイアログで、次の操作を行います。
- キーリングに
tokenization-service-kr
という名前を付けます。 - [キーリングのロケーション] で [グローバル] を選択します。このチュートリアルではこの選択で十分対応できますが、本番環境のアーキテクチャでは、Cloud KMS のさまざまなロケーション間の違いを理解してから決定する必要があります。
- 選択内容をダブルチェックします。キーリングを作成した後、キーリングを削除したり名前を変更したりすることはできません。
[作成] をクリックします。
キーリングが作成されて、[鍵の作成] ページが表示されます。
- キーリングに
[鍵を作成する] ダイアログで、次の操作を行います。
- 鍵に
cc-tokenization
という名前を付けます。 - [目的] で [
Symmetric encrypt/decrypt
] を選択します。 [ローテーション期間] を任意の値に設定し、[作成] をクリックします。
- 鍵に
Cloud Functions を作成する
このチュートリアルでは、Cloud Shell を使用していることを前提としています。別のターミナルを使用している場合は、最新バージョンの Google Cloud CLI を使用していることを確認してください。
Google Cloud コンソールで Cloud Shell を開きます。
GitHub プロジェクト リポジトリのクローンを作成し、作業フォルダに移動します。
git clone https://github.com/GoogleCloudPlatform/community gcp-community cd gcp-community/tutorials/pci-tokenizer/
gcs-cf-tokenizer
フォルダには、ファイルindex.js
が格納されています。これは、これから作成する 2 つの異なる Cloud Functions のソースです。また、実行するパッケージを Cloud Functions に指示するpackage.json
も格納されています。KMS 構成を適用し、構成テンプレート ファイルをコピーして、編集用に開きます。
cp config/default.json config/local.json nano config/local.json
Node.js ランタイムでは、Google Cloud プロジェクト ID を明示的に定義する必要があります。
"project_id": "YOUR_PROJECT_ID"
KMS 構成を確認して、前のセクションで作成した KMS 値を適用します。
"location": "global", "key_ring": "tokenization-service-kr", "key_name": "cc-tokenization"
トークン化関数をデプロイします。
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=.
この関数は、クレジット カード情報をトークンに変換します。
gcloud functions deploy
コマンドの出力で、httpsTrigger
の下にある URL の値を探します。URL の値をTOK_URL
環境変数に格納します。TOK_URL="TOK_URL"
TOK_URL
環境変数を使用して、tokenize
関数を呼び出します。トークン化解除関数を 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=.
この関数はトークン化プロセスを逆の状態にします。
gcloud functions deploy
コマンドの出力で、httpsTrigger
の下にある URL の値を探します。URL の値をDETOK_URL
環境変数に格納します。DETOK_URL="DETOK_URL"
DETOK_URL
環境変数を使用して、トークン化解除関数を呼び出します。ここでは、カード番号をトークンに変換するための関数と、プロセスを逆の状態にする関数という 2 つの個別の Cloud Functions の関数を作成しました。それぞれ異なるエントリ ポイントにより、
index.js
ファイル内の適切な開始関数に実行が指示されます。関数がデプロイされたら、Cloud Functions コンソールを開きます。
関数が作成されたことを確認します。正常に処理されていれば、それぞれ横にチェックマークが付いた 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 Functions の関数を呼び出します。
トークナイザを呼び出す
トークナイザに渡すサンプルデータを作成します。
export TOK_CC=4000300020001000 export TOK_MM=11 export TOK_YYYY=2028 export TOK_UID=543210
前のセクションで説明したように認証トークンを生成し、トークナイザを呼び出します。
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
に格納されています。カード情報を取得するには、デトークナイザを呼び出します。次のコマンドを使用して、トークン化を元に戻します。
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 Functions を使用する場合、認定セキュリティ評価機関の審査や自己問診に合格するための追加作業が必要になることがあります。具体的には、PCI DSS のセクション 1.2 と 1.3 では受信トラフィックと送信トラフィックに対する厳格な管理を要件としています。Cloud Functions と App Engine には双方向で構成可能なファイアウォールがないため、代替コントロールを作成するか、Compute Engine または Google Kubernetes Engine にトークン化サービスをデプロイする必要があります。コンテナ化を検討される方のために、GitHub のコードには Docker との互換性があり、補足のドキュメントも含まれています。
また、このサンプルコードは、デプロイ時に npm(Node.js パッケージ マネージャー)依存関係を pull します。本番環境では常に、検査済みの特定バージョンに依存関係を固定する必要があります。その上で、それらのバージョンをアプリ自体にバンドルするか、限定公開された信頼できる場所から提供します。いずれのアプローチを取っても、公開 npm リポジトリでのサービス停止によるダウンタイムや、安全だと見込んでいたパッケージを感染させるサプライチェーン攻撃によるダウンタイムを回避するのに役立ちます。アプリ全体をあらかじめビルドしてバンドルすると、通常はデプロイ時間が短縮されます。つまり、アプリの起動が高速化され、よりスムーズにスケールできます。
クリーンアップ
このチュートリアルで使用した個々のリソースをクリーンアップするには、プロジェクトを削除します。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- PCI データ セキュリティ基準の遵守
- OAuth 2.0 を使用した Google API へのアクセス
- PCI DSS の要件
- PCI DSS トークン化情報の補足
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センター をご覧ください。