根據 PCI DSS 的規定,將機密性質的持卡人資料代碼化

Last reviewed 2025-04-28 UTC

本文說明如何在 Cloud Run 函式中,設定存取權受到控管的信用卡和簽帳金融卡代碼化服務。如要設定這項服務,本文中的部署作業會使用以下 Google Cloud 服務:Identity and Access Management (IAM)Cloud Key Management Service (KMS)

「代碼化」是將信用卡資料等機密資訊替換成良性預留位置值 (或代碼) 的過程。根據支付卡產業資料安全標準 (PCI DSS) 第 3 部分的規定,信用卡上儲存的大部分資料都應視為機密資訊。

代碼本身沒有任何意義,但可用來在特定情境下查詢代碼化資料。不過,您還是得確保代碼未包含任何使用者專屬資訊,且無法直接解密。這樣一來,即使您無法控管客戶的付款卡代碼,也沒有人能夠使用代碼盜用持卡人的資料。

用來處理機密資訊的服務

您有許多選擇來透過平台或服務託管持卡人資料環境 (CDE)。本文件將逐步說明使用 Cloud Run 函式的部署範例,並協助您進行後續步驟,實作可用於實際工作環境的解決方案。

Cloud Run 函式是一個用於託管及執行程式碼的無伺服器平台,可方便您快速啟動能自動調度資源的應用程式。請注意,在符合 PCI DSS 的 CDE 中,您必須限制授權連線的所有傳入和傳出流量。Cloud Run 函式目前不提供這類精細控制項,因此您必須在其他地方 (例如您的應用程式內) 實作補償性的控管措施,或選擇其他平台。相同的代碼化服務能夠以容器化的方式運作,例如可自動調度資源的代管執行個體群組或 Kubernetes 叢集。這類環境具有完整虛擬私人雲端網路控制項,是較理想的實際工作環境。

Cloud KMS 是 Google Cloud的金鑰管理服務。可託管您的加密密鑰、定期輪替加密密鑰,以及加密或解密所儲存的帳戶資料。

本文使用 IAM,針對代碼化服務中所用的所有資源提供嚴密控管機制。您需要一個代碼經常過期的特殊服務帳戶來授予 Cloud KMS 的存取權,以及執行代碼化工具。

下圖說明您將在本文件中建立的代碼化應用程式架構。

代碼化應用程式架構

目標

  • 建立服務帳戶。
  • 設定 Cloud KMS。
  • 建立兩個 Cloud Run 函式。
  • 建立驗證權杖。
  • 呼叫代碼化工具。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

事前準備

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Click Create project.

  3. Name your project. Make a note of your generated project ID.

  4. Edit the other fields as needed.

  5. Click Create.

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Build, Cloud Run functions, and Cloud KMS APIs.

    Enable the APIs

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

建立服務帳戶

Cloud Run 函式的預設執行階段服務帳戶具有「編輯者」角色,可廣泛存取許多 Google Cloud 服務。雖然這是開發函式的最快方式,但 Google 建議只將預設服務帳戶用於測試和開發。您建立服務帳戶,根據最低權限原則限制函式可使用的 API。如要建立服務帳戶,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。

    前往「Service Accounts」(服務帳戶)

  2. 選取專案。

  3. 按一下「建立服務帳戶」

  4. 在「Service account name」(服務帳戶名稱) 欄位中輸入 Tokenization Service User。 Google Cloud 控制台會根據這個名稱填入「服務帳戶 ID」欄位。

  5. 選用:在「服務帳戶說明」欄位中,輸入服務帳戶的說明。

  6. 按一下「建立並繼續」

  7. 按一下「選取角色」,然後選取「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS 加密編譯金鑰加密者/解密者)

  8. 如要完成建立服務帳戶,請按一下「完成」

    您現在已擁有具備以下電子郵件地址的服務帳戶使用者:

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

設定 Cloud KMS

  1. 在 Google Cloud 控制台中開啟「Key Management」

    前往「Cryptographic Keys」(加密編譯金鑰) 頁面

  2. 按一下 [+ Create key ring] (+ 建立金鑰環),然後在隨即顯示的對話方塊中,執行以下操作:

    1. 將金鑰環命名為 tokenization-service-kr
    2. 針對「Key ring location」(金鑰環位置),選取 [global] (全域)。這個選項很常用,足以應付這個範例部署作業的需求。不過,在做出任何實際工作環境架構方面的決策之前,請務必瞭解不同 Cloud KMS 位置之間的差異
    3. 再次檢查您的選擇,因為金鑰環經建立後即無法刪除或重新命名
    4. 點選「建立」

    系統會建立金鑰環,並將您轉送到金鑰建立頁面。

  3. 在「Create key」(建立金鑰) 對話方塊中,執行以下操作:

    1. 將金鑰命名為 cc-tokenization
    2. 在「Purpose」(用途) 部分,選取 Symmetric encrypt/decrypt
    3. 將「Rotation period」(輪替週期) 設為您選擇的值,然後按一下 [Create] (建立)。

建立 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 檔案,您將建立的兩個不同 Cloud Run 函式會以此檔案做為來源。這個檔案也包含 package.json,用於指示 Cloud Run 函式要執行的套件。

  3. 套用 KMS 設定:複製設定範本檔案並開啟以進行編輯:

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

    Node.js 執行階段需要您明確定義 Google Cloud 專案 ID:

    "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 下方的網址值。將網址的值儲存在 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 下方的網址值。將網址的值儲存在 DETOK_URL 環境變數中:

    DETOK_URL="DETOK_URL"

    您將使用 DETOK_URL 環境變數呼叫 detokenize 函式。

    您已建立兩個獨立的 Cloud Run 函式:一個用於將卡號轉換成代碼,另一個則用來反轉這項程序。不同的進入點會將執行作業導向 index.js 檔案中適當的起始函式。

  9. 部署函式後,開啟 Cloud Run 函式主控台。

    開啟 Cloud Run functions 主控台

  10. 確認函式已建立。如果一切順利,您會看到兩個函式,旁邊各有一個勾號。

建立驗證權杖

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 函式進行付款卡代碼化作業,則可能需要花費額外心力才能滿足您的合格安全性評估人員或自我評估調查問卷的要求。具體來說,PCI DSS 的第 1.2 和 1.3 節要求您嚴格控管傳入和傳出流量。Cloud Run 函式和 App Engine 不提供雙向的可設定防火牆,因此您必須建立補償性控制項,或在 Compute Engine 或 Google Kubernetes Engine 上部署代碼化服務。如要探索容器化做法,GitHub 程式碼與 Docker 相容,並且包含支援說明文件。

這個範例程式碼還會在部署時導入 npm (Node.js 套件管理員) 依附元件。在實際工作環境中,請一律將依附元件固定至通過審查的特定版本,然後將這些版本與應用程式本身組合在一起,或是透過信任的私人位置提供這些版本。採用任一種做法後,即使公用 npm 存放區服務中斷,或供應鏈攻擊影響到您認為安全的套件,也不會導致停機。如果您預先建構並組合完整應用程式,部署時間通常會較短,進而加快啟動速度及提升自動資源調度作業的順暢度。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取這個範例部署作業所用資源的費用,請刪除含有相關資源的專案。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

後續步驟