Membuat token data pemegang kartu yang sensitif untuk PCI DSS

Last reviewed 2023-05-05 UTC

Tutorial ini menunjukkan cara menyiapkan layanan tokenisasi kartu kredit dan kartu debit yang dikontrol akses di Cloud Functions. Untuk menyiapkan layanan tersebut, artikel ini menggunakan layanan Google Cloud berikut: Identity and Access Management (IAM) dan Cloud Key Management Service (KMS).

Tokenisasi adalah proses penggantian nilai placeholder atau token yang tidak berbahaya untuk informasi sensitif seperti data kartu kredit. Bagian 3 Standar Keamanan Data Industri Kartu Pembayaran (PCI DSS) mewajibkan sebagian besar data yang disimpan di kartu kredit diperlakukan sebagai informasi sensitif.

Token itu sendiri tidak ada gunanya kecuali sebagai sarana untuk mencari data dengan token dalam konteks tertentu. Namun, Anda tetap harus memastikan bahwa token tidak berisi informasi spesifik per pengguna dan tidak dapat didekripsi secara langsung. Dengan demikian, jika Anda kehilangan kontrol atas token kartu pembayaran pelanggan, tidak ada yang dapat menggunakan token tersebut untuk membahayakan data pemegang kartu.

Layanan untuk menangani informasi sensitif

Anda memiliki banyak pilihan bagi platform atau layanan untuk menghosting lingkungan data pemegang kartu (CDE) Anda. Tutorial ini akan memandu Anda mempelajari contoh deployment menggunakan Cloud Functions dan membantu Anda mengambil langkah selanjutnya untuk mendapatkan solusi siap produksi.

Cloud Functions adalah platform serverless yang menghosting dan mengeksekusi kode, serta merupakan tempat yang nyaman untuk meluncurkan aplikasi yang diskalakan dengan cepat tanpa intervensi. Perlu diingat bahwa dalam CDE yang sesuai dengan PCI DSS, Anda harus membatasi semua traffic masuk dan keluar ke koneksi yang diizinkan. Kontrol terperinci tersebut saat ini tidak tersedia untuk Cloud Functions. Oleh karena itu, Anda harus mengimplementasikan kontrol kompensasi di tempat lain (seperti di aplikasi Anda) atau memilih platform yang berbeda. Layanan Tokenization yang sama dapat dijalankan dalam container seperti penskalaan otomatis grup instance terkelola atau cluster Kubernetes. Ini akan menjadi lingkungan produksi yang lebih baik dengan kontrol jaringan VPC yang lengkap.

Cloud KMS adalah layanan pengelolaan kunci Google Cloud. Cloud KMS menghosting kunci enkripsi Anda, merotasinya secara teratur, dan mengenkripsi atau mendekripsi data akun yang tersimpan.

IAM digunakan dalam tutorial ini untuk memberikan kontrol yang ketat pada semua resource yang digunakan dalam layanan tokenisasi. Anda memerlukan akun layanan khusus yang memiliki token yang sering habis masa berlakunya untuk memberikan akses ke Cloud KMS dan untuk menjalankan tokenizer.

Gambar berikut mengilustrasikan arsitektur aplikasi tokenisasi yang Anda buat dalam tutorial ini.

arsitektur aplikasi tokenisasi

Tujuan

  • Buat akun layanan.
  • Menyiapkan Cloud KMS.
  • Membuat dua Cloud Functions.
  • Membuat token autentikasi.
  • Memanggil tokenizer.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Di konsol Google Cloud, buka halaman Pemilih project.

    Buka pemilih project

  2. Untuk mulai membuat project Google Cloud, klik Buat project.

  3. Beri nama project Anda. Catat project ID yang dibuat.

  4. Edit kolom lain sesuai kebutuhan.

  5. Untuk membuat project, klik Buat.

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Enable the Cloud Build, Cloud Functions, and Cloud KMS APIs.

    Enable the APIs

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Membuat akun layanan

Akun layanan runtime default untuk Cloud Functions memiliki peran Editor, yang memungkinkan akses luas ke banyak layanan Google Cloud. Meskipun ini adalah cara tercepat untuk mengembangkan fungsi, Google merekomendasikan penggunaan akun layanan default hanya untuk pengujian dan pengembangan. Anda membuat akun layanan untuk membatasi API yang dapat digunakan fungsi tersebut sesuai dengan prinsip hak istimewa terendah. Untuk membuat akun layanan, lakukan langkah berikut:

  1. Di konsol Google Cloud, buka halaman Akun Layanan.

    Buka Akun Layanan

  2. Pilih project Anda.

  3. Klik Buat akun layanan.

  4. Di kolom Nama akun layanan, masukkan Tokenization Service User. Konsol Google Cloud akan mengisi kolom ID akun layanan berdasarkan nama ini.

  5. Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi akun layanan.

  6. Klik Buat dan lanjutkan.

  7. Klik Select a role, lalu pilih Cloud KMS Encrypter/Decrypter.

  8. Untuk menyelesaikan pembuatan akun layanan, klik Selesai.

    Anda sekarang memiliki pengguna akun layanan dengan alamat email berikut:

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

Menyiapkan Cloud KMS

  1. Di konsol Google Cloud, buka Key Management.

    Buka halaman Cryptographic Keys

  2. Klik **+ Create key ring **. Pada dialog yang muncul, lakukan hal berikut:

    1. Beri nama key ring tokenization-service-kr.
    2. Untuk Lokasi key ring, pilih global. Ini adalah pilihan umum yang sudah cukup untuk tutorial ini. Namun, sebelum membuat keputusan arsitektur produksi, pastikan Anda memahami perbedaan antara berbagai lokasi Cloud KMS.
    3. Periksa kembali pilihan Anda, karena Anda tidak dapat menghapus atau mengganti nama key ring setelah dibuat.
    4. Klik Create.

      Membuat key ring

    Sistem akan membuat key ring dan meneruskan Anda ke halaman pembuatan kunci.

  3. Pada dialog Create key, lakukan hal berikut:

    1. Beri nama kunci cc-tokenization.
    2. Untuk Tujuan, pilih Symmetric encrypt/decrypt.
    3. Tetapkan Periode rotasi ke nilai yang Anda pilih, lalu klik Buat.

    Informasi pelacakan tentang kunci Anda

Membuat Cloud Functions

Tutorial ini mengasumsikan bahwa Anda akan menggunakan Cloud Shell. Jika menggunakan terminal yang berbeda, pastikan Anda memiliki Google Cloud CLI versi terbaru.

  1. Di konsol Google Cloud, buka Cloud Shell:

    Buka Cloud Shell

  2. Clone repositori project GitHub dan pindahkan ke folder kerja:

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

    Folder gcs-cf-tokenizer berisi file index.js, yang merupakan sumber untuk dua Cloud Functions yang berbeda yang akan Anda buat. Class ini juga berisi package.json, yang memberi tahu Cloud Functions paket mana yang akan dijalankan.

  3. Terapkan konfigurasi KMS. Salin file template konfigurasi dan buka untuk diedit:

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

    Runtime Node.js mengharuskan Anda untuk secara eksplisit menentukan ID project Google Cloud:

    "project_id":              "YOUR_PROJECT_ID"
  4. Temukan konfigurasi KMS dan terapkan nilai KMS yang Anda buat di bagian sebelumnya:

    "location":                "global",
    "key_ring":                "tokenization-service-kr",
    "key_name":                "cc-tokenization"
    
  5. Deploy fungsi tokenize.

    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=.
    

    Fungsi ini mengubah informasi kartu kredit menjadi token.

  6. Cari nilai URL di bagian httpsTrigger dalam output perintah gcloud functions deploy. Simpan nilai URL dalam TOK_URL variabel lingkungan:

    TOK_URL="TOK_URL"

    Anda akan menggunakan variabel lingkungan TOK_URL untuk memanggil fungsi tokenize.

  7. Deploy fungsi detokenisasi dalam mode 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=.
    

    Fungsi ini membalikkan proses tokenisasi.

  8. Cari nilai URL di bagian httpsTrigger dalam output perintah gcloud functions deploy. Simpan nilai URL dalam variabel lingkungan DETOK_URL:

    DETOK_URL="DETOK_URL"

    Anda akan menggunakan variabel lingkungan DETOK_URL untuk memanggil fungsi detokenize.

    Anda telah membuat dua Cloud Functions yang terpisah: satu untuk mengubah nomor kartu menjadi token, dan satu lagi untuk membalikkan prosesnya. Titik entri yang berbeda akan mengarahkan eksekusi ke fungsi awal yang tepat dalam file index.js.

  9. Setelah fungsi di-deploy, buka konsol Cloud Functions.

    Buka konsol Cloud Functions

  10. Verifikasi bahwa fungsi telah dibuat. Jika semuanya berjalan lancar, Anda akan melihat dua {i>function<i} Anda dengan tanda centang di sebelahnya.

    Memverifikasi bahwa Cloud Functions Anda telah dibuat

Membuat token autentikasi

Opsi no-allow-unauthenticated dalam perintah gcloud functions deploy berarti pemanggil yang memanggil fungsi harus menampilkan token autentikasi untuk menyatakan identitas pemanggil. Pemanggil harus memiliki cloudfunctions.functions.invoke izin. Peran yang telah ditetapkan berikut memiliki izin ini: Invoker Cloud Functions, Admin Cloud Functions, dan Developer Cloud Functions.

  • Buat token autentikasi:

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

Perintah ini menghasilkan string token autentikasi, menyimpannya di variabel lingkungan $AUTH_TOKEN, lalu menampilkan tokennya. Kemudian, Anda akan memanggil Cloud Functions yang telah di-deploy dengan token.

Memanggil tokenizer

  1. Buat beberapa contoh data untuk diteruskan ke tokenizer:

    export TOK_CC=4000300020001000
    export TOK_MM=11
    export TOK_YYYY=2028
    export TOK_UID=543210
    
  2. Buat token autentikasi seperti yang dijelaskan di bagian sebelumnya, lalu panggil tokenizer:

    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
    

    String tokenisasi yang mewakili data kartu kredit akan ditampilkan. String ini telah disimpan dalam variabel lingkungan CC_TOK. Anda dapat mengambil informasi kartu dengan memanggil detokenizer.

  3. Balik tokenisasi dengan perintah berikut.

    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"
    

    Outputnya akan terlihat seperti berikut:

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

    Data ini adalah data yang awalnya dikirim ke tokenizer, didekripsi, dan diambil oleh aplikasi Anda.

Perluas tutorial ini

Kode contoh di GitHub adalah awal yang sangat baik, tetapi ada hal-hal lain yang harus dipertimbangkan sebelum beralih ke produksi.

Jika memilih menggunakan Cloud Functions untuk tokenisasi kartu pembayaran, Anda mungkin perlu melakukan lebih banyak hal untuk memenuhi Penilai Keamanan yang Memenuhi Syarat atau Kuesioner Penilaian Mandiri. Secara khusus, bagian 1.2 dan 1.3 PCI DSS memerlukan kontrol yang ketat pada traffic masuk dan keluar. Cloud Functions dan App Engine tidak menawarkan firewall dua arah yang dapat dikonfigurasi, sehingga Anda harus membuat kontrol kompensasi atau men-deploy layanan tokenisasi di Compute Engine atau Google Kubernetes Engine. Jika Anda ingin mempelajari containerization, kode GitHub harus kompatibel dengan Docker dan berisi dokumentasi pendukung.

Kode contoh ini juga menarik dependensi npm (pengelola paket Node.js) saat deployment. Di lingkungan produksi Anda, selalu sematkan dependensi ke versi yang telah diperiksa tertentu. Kemudian, paketkan versi tersebut dengan aplikasi itu sendiri atau tayangkan dari lokasi pribadi dan tepercaya. Salah satu pendekatan tersebut membantu Anda menghindari periode nonaktif yang disebabkan oleh pemadaman layanan di repositori npm publik atau dari serangan supply-chain yang menginfeksi paket yang Anda anggap aman. Jika Anda melakukan pra-build dan memaketkan aplikasi yang sudah selesai, waktu deployment Anda biasanya akan berkurang, yang berarti peluncuran lebih cepat dan penskalaan yang lebih lancar.

Pembersihan

Untuk membersihkan setiap resource yang digunakan dalam tutorial ini, Anda dapat menghapus project.

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya