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