Ringkasan Pencegahan Kebocoran Data Cloud

1. Ringkasan

Cloud Data Loss Prevention (DLP) adalah layanan terkelola sepenuhnya yang dirancang untuk membantu menemukan, mengklasifikasi, dan melindungi informasi sensitif. Codelab ini akan memperkenalkan beberapa kemampuan dasar Cloud DLP API dan menunjukkan berbagai cara penggunaannya untuk melindungi data.

Yang akan Anda lakukan

  • Gunakan DLP untuk memeriksa string dan file untuk mencocokkan jenis info
  • Mempelajari teknik deidentifikasi dan menggunakan DLP untuk melakukan de-identifikasi data
  • Pelajari cara mengidentifikasi ulang data yang telah dideidentifikasi menggunakan enkripsi penyimpan format (FPE)
  • Gunakan DLP untuk menyamarkan jenis info dari string dan gambar

Yang Anda butuhkan

  • Project Google Cloud dengan penyiapan penagihan. Jika belum memilikinya, Anda harus membuatnya.

2. Mempersiapkan

Codelab ini dapat berjalan sepenuhnya di Google Cloud Platform tanpa penginstalan atau konfigurasi lokal apa pun.

Cloud Shell

Di codelab ini, kita akan menyediakan dan mengelola berbagai resource dan layanan cloud menggunakan command line melalui Cloud Shell.

Download repositori project pendamping:

git clone https://github.com/googleapis/nodejs-dlp

Setelah kode project didownload, beralihlah ke direktori contoh dan instal paket Node.js yang diperlukan:

cd samples && npm install

Pastikan Anda menggunakan project yang benar dengan menetapkannya menggunakan perintah gcloud berikut:

gcloud config set project [PROJECT_ID]

Aktifkan API

Berikut adalah API yang harus diaktifkan di project kita:

  • Cloud Data Loss Prevention API - Menyediakan metode untuk deteksi, analisis risiko, dan de-identifikasi fragmen yang sensitif privasi dalam teks, gambar, dan repositori penyimpanan Google Cloud Platform
  • Cloud Key Management Service (KMS) API - Google Cloud KMS memungkinkan pelanggan mengelola kunci enkripsi dan melakukan operasi kriptografis dengan kunci tersebut.

Aktifkan API yang diperlukan dengan perintah gcloud berikut:

gcloud services enable dlp.googleapis.com cloudkms.googleapis.com \
--project ${GOOGLE_CLOUD_PROJECT}

3. Memeriksa string dan file

Direktori sampel project yang didownload pada langkah sebelumnya berisi beberapa file JavaScript yang menggunakan berbagai fungsi Cloud DLP. inspect.js akan memeriksa string atau file yang diberikan untuk mendeteksi jenis info sensitif.

Untuk mengujinya, Anda dapat memberikan opsi string dan string contoh dengan beberapa informasi yang berpotensi sensitif:

node inspect.js -c $GOOGLE_CLOUD_PROJECT \
string 'My email address is jenny@somedomain.com and you can call me at 555-867-5309'

Output harus memberi tahu kita temuan untuk setiap jenis info yang cocok, yang meliputi:

Kutipan: Template menentukan

InfoType: jenis informasi yang terdeteksi untuk bagian string tersebut. Anda akan menemukan daftar lengkap tentang kemungkinan jenis info di sini. Secara default, inspect.js hanya akan memeriksa jenis info CREDIT_CARD_NUMBER, PHONE_NUMBER, DAN EMAIL_ADDRESS

Kemungkinan: hasil dikategorikan berdasarkan seberapa besar kemungkinannya masing-masing mewakili kecocokan. Kemungkinan dapat berkisar dari VERY_UNLIKELY hingga VERY_LIKELY.

Temuan untuk permintaan perintah di atas adalah:

Findings:
        Quote: jenny@somedomain.com
        Info type: EMAIL_ADDRESS
        Likelihood: LIKELY
        Quote: 555-867-5309
        Info type: PHONE_NUMBER
        Likelihood: VERY_LIKELY

Demikian pula, kita dapat memeriksa file untuk mencari jenis info. Lihat contoh file accounts.txt:

resources/accounts.txt

My credit card number is 1234 5678 9012 3456, and my CVV is 789.

Jalankan inspect.js lagi, kali ini dengan opsi file:

node inspect.js -c $GOOGLE_CLOUD_PROJECT file resources/accounts.txt

Hasilnya:

Findings:
        Quote: 5678 9012 3456
        Info type: CREDIT_CARD_NUMBER
        Likelihood: VERY_LIKELY

Untuk kedua jenis kueri, kita dapat membatasi hasil berdasarkan kemungkinan atau jenis info. Contoh:

node inspect.js -c $GOOGLE_CLOUD_PROJECT \
string 'Call 900-649-2568 or email me at anthony@somedomain.com' \
-m VERY_LIKELY

Dengan menentukan VERY_LIKELY sebagai kemungkinan minimum, semua kecocokan yang kurang dari VERY_LIKELY akan dikecualikan:

Findings:
        Quote: 900-649-2568
        Info type: PHONE_NUMBER
        Likelihood: VERY_LIKELY

Hasil lengkap tanpa batasan adalah:

Findings:
        Quote: 900-649-2568
        Info type: PHONE_NUMBER
        Likelihood: VERY_LIKELY
        Quote: anthony@somedomain.com
        Info type: EMAIL_ADDRESS
        Likelihood: LIKELY

Demikian pula, kita dapat menentukan jenis info yang akan kita periksa:

node inspect.js -c $GOOGLE_CLOUD_PROJECT \
string 'Call 900-649-2568 or email me at anthony@somedomain.com' \
-t EMAIL_ADDRESS

Hanya jenis info yang ditentukan yang ditampilkan jika ditemukan:

Findings:
        Quote: anthony@somedomain.com
        Info type: EMAIL_ADDRESS
        Likelihood: LIKELY

Di bawah ini adalah fungsi asinkron yang menggunakan API untuk memeriksa input:

inspect.js

async function inspectString(
  callingProjectId,
  string,
  minLikelihood,
  maxFindings,
  infoTypes,
  customInfoTypes,
  includeQuote
) {
...
}

Argumen yang diberikan untuk parameter di atas digunakan untuk membuat objek permintaan. Permintaan tersebut kemudian diberikan ke fungsi inspectContent untuk mendapatkan respons yang menghasilkan output:

inspect.js

  // Construct item to inspect
  const item = {value: string};

  // Construct request
  const request = {
    parent: dlp.projectPath(callingProjectId),
    inspectConfig: {
      infoTypes: infoTypes,
      customInfoTypes: customInfoTypes,
      minLikelihood: minLikelihood,
      includeQuote: includeQuote,
      limits: {
        maxFindingsPerRequest: maxFindings,
      },
    },
    item: item,
  };
...
...
 const [response] = await dlp.inspectContent(request);

4. Deidentifikasi

Selain memeriksa dan mendeteksi data sensitif, Cloud DLP dapat melakukan deidentifikasi. Deidentifikasi adalah proses penghapusan informasi identitas dari data. API akan mendeteksi data sensitif seperti yang ditentukan oleh jenis info, lalu menggunakan transformasi de-identifikasi untuk menyamarkan, menghapus, atau mengaburkan data tersebut.

deid.js akan menunjukkan deidentifikasi dalam beberapa cara. Metode deidentifikasi paling sederhana adalah dengan mask:

node deid.js deidMask -c $GOOGLE_CLOUD_PROJECT \
"My order number is F12312399. Email me at anthony@somedomain.com"

Dengan mask, API akan mengganti karakter dari jenis info yang cocok dengan karakter yang berbeda, * secara default. Output-nya adalah:

My order number is F12312399. Email me at *****************************

Perhatikan bahwa alamat email dalam string di-obfuscate saat nomor pesanan arbitrer tidak berubah. (Jenis info kustom dimungkinkan, tetapi di luar cakupan Codelab ini).

Mari kita lihat fungsi yang menggunakan DLP API untuk melakukan deidentifikasi dengan mask:

deid.js

async function deidentifyWithMask(
  callingProjectId,
  string,
  maskingCharacter,
  numberToMask
) {
...
}

Sekali lagi, argumen ini digunakan untuk membuat objek permintaan. Kali ini diberikan ke fungsi deidentifyContent:

deid.js

  // Construct deidentification request
  const item = {value: string};
  const request = {
    parent: dlp.projectPath(callingProjectId),
    deidentifyConfig: {
      infoTypeTransformations: {
        transformations: [
          {
            primitiveTransformation: {
              characterMaskConfig: {
                maskingCharacter: maskingCharacter,
                numberToMask: numberToMask,
              },
            },
          },
        ],
      },
    },
    item: item,
  };
... 
... 
const [response] = await dlp.deidentifyContent(request);

Melakukan de-identifikasi dengan Enkripsi yang Mempertahankan Format

DLP API juga menawarkan kemampuan untuk mengenkripsi nilai data sensitif menggunakan kunci kriptografis.

Kita akan mulai dengan menggunakan Cloud KMS untuk membuat key ring:

gcloud kms keyrings create dlp-keyring --location global

Sekarang kita dapat membuat kunci yang akan digunakan untuk mengenkripsi data:

gcloud kms keys create dlp-key \
--purpose='encryption' \
--location=global \
--keyring=dlp-keyring

DLP API akan menerima kunci gabungan yang dienkripsi dengan kunci KMS yang kita buat. Kita dapat menghasilkan string acak yang akan digabungkan. Kita akan membutuhkannya nanti untuk mengidentifikasi ulang:

export AES_KEY=`head -c16 < /dev/random | base64 -w 0`

Sekarang kita dapat mengenkripsi string dengan kunci KMS. Tindakan ini akan menghasilkan file biner yang berisi string terenkripsi sebagai teks tersandi:

echo -n $AES_KEY | gcloud kms encrypt \
--location global \
--keyring dlp-keyring  \
--key dlp-key \
--plaintext-file - \
--ciphertext-file ./ciphertext.bin 

Dengan menggunakan deid.js, sekarang kita dapat melakukan de-identifikasi nomor telepon dalam string contoh di bawah menggunakan enkripsi:

node deid.js deidFpe -c $GOOGLE_CLOUD_PROJECT \
"My client's cell is 9006492568" `base64 -w 0 ciphertext.bin` \
projects/${GOOGLE_CLOUD_PROJECT}/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key \
-s PHONE_NUMBER

Output akan menampilkan string dengan jenis info yang cocok dan diganti dengan string terenkripsi dan didahului oleh jenis info yang ditunjukkan oleh flag -s:

My client's cell is PHONE_NUMBER(10):vSt55z79nR

Mari kita lihat fungsi yang kita gunakan untuk melakukan deidentifikasi string:

deid.js

async function deidentifyWithFpe(
  callingProjectId,
  string,
  alphabet,
  surrogateType,
  keyName,
  wrappedKey
) {
...
}

Argumen digunakan untuk membuat objek cryptoReplaceFfxFpeConfig:

deid.js

  const cryptoReplaceFfxFpeConfig = {
    cryptoKey: {
      kmsWrapped: {
        wrappedKey: wrappedKey,
        cryptoKeyName: keyName,
      },
    },
    commonAlphabet: alphabet,
  };
  if (surrogateType) {
    cryptoReplaceFfxFpeConfig.surrogateInfoType = {
      name: surrogateType,
    };
  }

Objek cryptoReplaceFfxFpeConfig kemudian digunakan dalam permintaan ke API melalui fungsi deidentifyContent:

deid.js

  // Construct deidentification request
  const item = {value: string};
  const request = {
    parent: dlp.projectPath(callingProjectId),
    deidentifyConfig: {
      infoTypeTransformations: {
        transformations: [
          {
            primitiveTransformation: {
              cryptoReplaceFfxFpeConfig: cryptoReplaceFfxFpeConfig,
            },
          },
        ],
      },
    },
    item: item,
  };

  try {
    // Run deidentification request
    const [response] = await dlp.deidentifyContent(request);

Mengidentifikasi ulang data

Untuk mengidentifikasi ulang data, DLP API akan menggunakan teks tersandi yang kita buat di langkah sebelumnya:

node deid.js reidFpe -c $GOOGLE_CLOUD_PROJECT \
"<YOUR_DEID_OUTPUT>" \
PHONE_NUMBER `base64 -w 0 ciphertext.bin`  \
projects/${GOOGLE_CLOUD_PROJECT}/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key

Output-nya akan berupa string asli tanpa menunjukkan jenis surrogate atau penyamaran:

My client's cell is 9006492568

Fungsi yang digunakan untuk mengidentifikasi ulang data mirip dengan yang digunakan untuk melakukan deidentifikasi:

deid.js

async function reidentifyWithFpe(
  callingProjectId,
  string,
  alphabet,
  surrogateType,
  keyName,
  wrappedKey
) {
...
}

Dan sekali lagi, argumen digunakan dalam permintaan ke API, kali ini untuk fungsi reidentifyContent:

deid.js

  // Construct deidentification request
  const item = {value: string};
  const request = {
    parent: dlp.projectPath(callingProjectId),
    reidentifyConfig: {
      infoTypeTransformations: {
        transformations: [
          {
            primitiveTransformation: {
              cryptoReplaceFfxFpeConfig: {
                cryptoKey: {
                  kmsWrapped: {
                    wrappedKey: wrappedKey,
                    cryptoKeyName: keyName,
                  },
                },
                commonAlphabet: alphabet,
                surrogateInfoType: {
                  name: surrogateType,
                },
              },
            },
          },
        ],
      },
    },
    inspectConfig: {
      customInfoTypes: [
        {
          infoType: {
            name: surrogateType,
          },
          surrogateType: {},
        },
      ],
    },
    item: item,
  };

  try {
    // Run reidentification request
    const [response] = await dlp.reidentifyContent(request);

Melakukan De-identifikasi Tanggal dengan Perubahan Tanggal

Dalam konteks tertentu, tanggal dapat dianggap sebagai data sensitif yang mungkin ingin kita obfuscate. Pergeseran tanggal memungkinkan kita mengubah tanggal dengan penambahan acak sekaligus mempertahankan urutan dan durasi jangka waktu. Setiap tanggal dalam kumpulan digeser oleh jangka waktu unik untuk entri tersebut. Untuk menunjukkan deidentifikasi melalui pergeseran tanggal, pertama-tama lihat contoh file CSV yang berisi data tanggal:

resources/dates.csv

name,birth_date,register_date,credit_card
Ann,01/01/1980,07/21/1996,4532908762519852
James,03/06/1988,04/09/2001,4301261899725540
Dan,08/14/1945,11/15/2011,4620761856015295
Laura,11/03/1992,01/04/2017,4564981067258901

Data berisi dua kolom tempat kita dapat menerapkan pergeseran tanggal: birth_date dan register_date. deid.js akan menerima nilai batas bawah dan nilai batas atas untuk menentukan rentang guna memilih jumlah hari acak untuk menggeser tanggal:

node deid.js deidDateShift -c $GOOGLE_CLOUD_PROJECT resources/dates.csv datesShifted.csv 30 90 birth_date

File bernama datesShifted.csv akan dibuat dengan tanggal yang digeser secara acak sebesar jumlah hari antara 30 dan 90. Berikut adalah contoh output yang dihasilkan:

name,birth_date,register_date,credit_card
Ann,2/6/1980,7/21/1996,4532908762519852
James,5/18/1988,4/9/2001,4301261899725540
Dan,9/16/1945,11/15/2011,4620761856015295
Laura,12/16/1992,1/4/2017,4564981067258901

Perhatikan bahwa kita juga dapat menentukan kolom tanggal mana dalam {i>file<i} CSV yang ingin kita ubah. Kolom birth_date Kolom register_date tetap tidak berubah.

Mari kita lihat fungsi yang menangani deidentifikasi dengan pergeseran tanggal:

deid.js

async function deidentifyWithDateShift(
  callingProjectId,
  inputCsvFile,
  outputCsvFile,
  dateFields,
  lowerBoundDays,
  upperBoundDays,
  contextFieldId,
  wrappedKey,
  keyName
) {
...
}

Perhatikan bahwa fungsi ini dapat menerima kunci yang digabungkan dan nama kunci, mirip dengan deidentifikasi dengan FPE, sehingga kita memiliki opsi untuk menyediakan kunci enkripsi guna mengidentifikasi ulang pergeseran tanggal. Argumen yang kita sediakan membangun objek dateShiftConfig:

deid.js

  // Construct DateShiftConfig
  const dateShiftConfig = {
    lowerBoundDays: lowerBoundDays,
    upperBoundDays: upperBoundDays,
  };

  if (contextFieldId && keyName && wrappedKey) {
    dateShiftConfig.context = {name: contextFieldId};
    dateShiftConfig.cryptoKey = {
      kmsWrapped: {
        wrappedKey: wrappedKey,
        cryptoKeyName: keyName,
      },
    };
  } else if (contextFieldId || keyName || wrappedKey) {
    throw new Error(
      'You must set either ALL or NONE of {contextFieldId, keyName, wrappedKey}!'
    );
  }

  // Construct deidentification request
  const request = {
    parent: dlp.projectPath(callingProjectId),
    deidentifyConfig: {
      recordTransformations: {
        fieldTransformations: [
          {
            fields: dateFields,
            primitiveTransformation: {
              dateShiftConfig: dateShiftConfig,
            },
          },
        ],
      },
    },
    item: tableItem,
  };

5. Menyamarkan string dan gambar

Metode lain untuk mengaburkan informasi sensitif adalah penyamaran. Penyamaran akan mengganti kecocokan dengan jenis info yang diidentifikasi untuk dicocokkan. redact.js menunjukkan penyamaran:

node redact.js -c $GOOGLE_CLOUD_PROJECT \
string "Please refund the purchase to my credit card 4012888888881881" \
-t 'CREDIT_CARD_NUMBER'

Outputnya mengganti contoh nomor kartu kredit dengan jenis info CREDIT_CARD_NUMBER:

Please refund the purchase on my credit card [CREDIT_CARD_NUMBER]

Hal ini berguna jika Anda ingin menyembunyikan informasi sensitif, tetapi masih mengidentifikasi jenis informasi yang dihapus. DLP API juga dapat menyamarkan informasi dari gambar yang berisi teks. Untuk mendemonstrasikan, mari kita lihat gambar contoh:

resources/test.png

bf3719cfeb5676ff.png

Untuk menyamarkan nomor telepon dan alamat email dari gambar di atas:

node redact.js -c $GOOGLE_CLOUD_PROJECT \
image resources/test.png ./redacted.png \
-t PHONE_NUMBER -t EMAIL_ADDRESS

Seperti yang ditentukan, gambar baru bernama redacted.png akan dibuat dengan informasi yang diminta disamarkan:

ce023dd95cccc40f.png

Berikut adalah fungsi yang digunakan untuk menyamarkan dari string:

redact.js

async function redactText(
  callingProjectId, 
  string,
  minLikelihood,
  infoTypes
) {
...}

Dan berikut adalah permintaan yang akan diberikan ke fungsi deidentifyContent:

redact.js

const request = {
    parent: dlp.projectPath(callingProjectId),
    item: {
      value: string,
    },
    deidentifyConfig: {
      infoTypeTransformations: {
        transformations: [replaceWithInfoTypeTransformation],
      },
    },
    inspectConfig: {
      minLikelihood: minLikelihood,
      infoTypes: infoTypes,
    },
  };

Demikian pula, berikut adalah fungsi untuk menyamarkan gambar:

redact.js

async function redactImage(
  callingProjectId,
  filepath,
  minLikelihood,
  infoTypes,
  outputPath
) {
...}

Dan berikut adalah permintaan yang akan diberikan ke fungsi redactImage:

redact.js

// Construct image redaction request
  const request = {
    parent: dlp.projectPath(callingProjectId),
    byteItem: {
      type: fileTypeConstant,
      data: fileBytes,
    },
    inspectConfig: {
      minLikelihood: minLikelihood,
      infoTypes: infoTypes,
    },
    imageRedactionConfigs: imageRedactionConfigs,
  };

6. Pembersihan

Kita telah mempelajari cara menggunakan DLP API untuk menyamarkan, mende-identifikasi, dan menyamarkan informasi sensitif dari data. Sekarang saatnya membersihkan project dari resource apa pun yang telah kita buat.

Menghapus Project

Di GCP Console, buka halaman Cloud Resource Manager:

Dalam daftar project, pilih project yang sedang kita kerjakan lalu klik Delete. Anda akan diminta untuk mengetikkan ID project. Masukkan dan klik Shut Down.

Atau, Anda dapat menghapus seluruh project langsung dari Cloud Shell dengan gcloud:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

7. Selamat!

Asyik! Anda berhasil! Cloud DLP adalah alat canggih yang menyediakan akses ke platform pemeriksaan, klasifikasi, dan de-identifikasi data sensitif yang canggih.

Yang telah kita bahas

  • Kita melihat bagaimana Cloud DLP API dapat digunakan untuk memeriksa string dan file untuk berbagai jenis info
  • Kita mempelajari cara DLP API dapat mendeidentifikasi string dengan mask untuk menyembunyikan jenis info pencocokan data
  • Kami menggunakan DLP API untuk menggunakan kunci enkripsi guna melakukan de-identifikasi lalu mengidentifikasi ulang data
  • Kita menggunakan DLP API untuk menyamarkan data dari string