Ringkasan Pencegahan Kebocoran Data Cloud

1. Ringkasan

Cloud Data Loss Prevention (DLP) adalah layanan terkelola sepenuhnya yang dirancang untuk membantu menemukan, mengklasifikasikan, 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

  • Menggunakan DLP untuk memeriksa string dan file untuk menemukan jenis info yang cocok
  • Mempelajari teknik de-identifikasi dan menggunakan DLP untuk melakukan de-identifikasi data
  • Mempelajari cara mengidentifikasi ulang data yang telah dianonimkan menggunakan enkripsi yang mempertahankan format (FPE)
  • Menggunakan DLP untuk menyamarkan jenis info dari string dan gambar

Yang Anda butuhkan

  • Project Google Cloud dengan penagihan yang telah disiapkan. Jika belum memilikinya, Anda harus membuatnya.

2. Mempersiapkan

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

Cloud Shell

Selama 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, ubah ke direktori samples dan instal paket Node.js yang diperlukan:

cd samples && npm install

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

gcloud config set project [PROJECT_ID]

Mengaktifkan API

Berikut adalah API yang perlu kita aktifkan di project:

  • Cloud Data Loss Prevention API - Menyediakan metode untuk deteksi, analisis risiko, dan de-identifikasi fragmen 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 menjalankan 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 samples dari project yang didownload pada langkah sebelumnya berisi beberapa file javascript yang memanfaatkan berbagai fungsi Cloud DLP. inspect.js akan memeriksa string atau file yang disediakan untuk jenis info sensitif.

Untuk mengujinya, Anda dapat memberikan opsi string dan contoh string 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 akan memberi tahu kita temuan untuk setiap jenis info yang cocok, yang mencakup:

Kutipan: Template menentukan

InfoType: jenis informasi yang terdeteksi untuk bagian string tersebut. Anda akan menemukan daftar lengkap jenis info yang mungkin 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 kemungkinan setiap hasil 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 jenis info. Lihat file accounts.txt contoh:

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 tersebut, kami 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 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

Berikut adalah fungsi asinkron yang menggunakan API untuk memeriksa input:

inspect.js

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

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

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 de-identifikasi. De-identifikasi adalah proses penghapusan informasi identitas dari data. API mendeteksi data sensitif sebagaimana ditentukan oleh jenis info, lalu menggunakan transformasi de-identifikasi untuk menyamarkan, menghapus, atau mengaburkan data.

deid.js akan mendemonstrasikan penghapusan identitas dengan beberapa cara. Metode anonimisasi paling sederhana adalah dengan menerapkan masker:

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 jenis info yang cocok dengan karakter lain, * secara default. Outputnya adalah:

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

Perhatikan bahwa alamat email dalam string di-obfuscate, sedangkan nomor pesanan arbitrer tetap utuh. (Jenis info kustom mungkin diperbolehkan, tetapi di luar cakupan Codelab ini).

Mari kita lihat fungsi yang menggunakan DLP API untuk melakukan de-identifikasi dengan mask:

deid.js

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

Sekali lagi, argumen ini digunakan untuk membuat objek permintaan. Kali ini, nilai tersebut disediakan untuk 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);

Menghilangkan identitas dengan Enkripsi yang Mempertahankan Format

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

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 kita gunakan 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 membuat string acak yang akan di-wrap. Kita akan memerlukannya nanti untuk mengidentifikasi ulang:

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

Sekarang kita dapat mengenkripsi string dengan kunci KMS kita. Perintah ini akan menghasilkan file biner yang berisi string terenkripsi sebagai ciphertext:

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, kita kini dapat menyamarkan 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 diganti dengan string terenkripsi dan diawali dengan jenis info yang ditunjukkan oleh tanda -s:

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

Mari kita lihat fungsi yang kita gunakan untuk menganonimkan 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 pada gilirannya 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 ciphertext yang kita buat pada 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

Outputnya akan berupa string asli tanpa redaksi atau jenis pengganti yang ditunjukkan:

My client's cell is 9006492568

Fungsi yang digunakan untuk mengidentifikasi ulang data mirip dengan fungsi yang digunakan untuk menganonimkan data:

deid.js

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

Sekali lagi, argumen digunakan dalam permintaan ke API, kali ini ke 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);

Menghilangkan Identitas Tanggal dengan Perubahan Tanggal

Dalam konteks tertentu, tanggal dapat dianggap sebagai data sensitif yang mungkin ingin kita samarkan. Penggeseran tanggal memungkinkan kami menggeser tanggal dengan inkremental acak sambil mempertahankan urutan dan durasi jangka waktu. Setiap tanggal dalam kumpulan data diubah dengan jumlah waktu yang unik untuk entri tersebut. Untuk mendemonstrasikan penghilangan identitas melalui pengubahan tanggal, pertama-tama lihat file CSV sampel 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 yang dapat kita terapkan 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 diubah secara acak sebanyak 30 hingga 90 hari. 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 file CSV yang ingin kita ubah. Kolom birth_date Kolom register_date tidak berubah.

Mari kita lihat fungsi yang menangani penghapusan identitas dengan penggeseran tanggal:

deid.js

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

Perhatikan bahwa fungsi ini dapat menerima kunci yang dienkapsulasi dan nama kunci, mirip dengan de-identifikasi dengan FPE, sehingga kita memiliki opsi untuk memberikan kunci enkripsi guna mengidentifikasi ulang pergeseran tanggal. Argumen yang kita berikan 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 meng-obfuscate informasi sensitif adalah penyamaran. Penyamaran akan mengganti kecocokan dengan jenis info yang diidentifikasi cocok. redact.js menunjukkan penyuntingan:

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

Output 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 tetap mengidentifikasi jenis informasi yang dihapus. DLP API juga dapat menyamarkan informasi dari gambar yang berisi teks. Untuk mendemonstrasikan, mari kita lihat contoh gambar:

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 disembunyikan:

ce023dd95cccc40f.png

Berikut adalah fungsi yang digunakan untuk menyamarkan dari sebuah string:

redact.js

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

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
) {
...}

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, menghapus identifikasi, dan mengedit informasi sensitif dari data kita. Sekarang saatnya membersihkan project dari semua resource 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 menggunakan gcloud:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

7. Selamat!

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

Yang telah kita bahas

  • Kita telah melihat cara Cloud DLP API dapat digunakan untuk memeriksa string dan file untuk berbagai jenis info
  • Kita telah mempelajari cara DLP API dapat melakukan de-identifikasi string dengan mask untuk menyembunyikan data yang cocok dengan jenis info
  • Kami menggunakan DLP API untuk menggunakan kunci enkripsi guna menyamarkan dan kemudian mengidentifikasi ulang data
  • Kita telah menggunakan DLP API untuk menyamarkan data dari string dan gambar