1. Genel Bakış
Cloud Data Loss Prevention (DLP), hassas bilgileri keşfetmenize, sınıflandırmanıza ve korumaya yardımcı olmak amacıyla tasarlanmış, tümüyle yönetilen bir hizmettir. Bu codelab'de, Cloud DLP API'nin bazı temel özellikleri tanıtılıp verileri korumak için kullanılabilecek çeşitli yöntemler açıklanmaktadır.
Yapacaklarınız
- Eşleşen bilgi türlerini bulmak için dizeleri ve dosyaları incelemek üzere Veri Kaybını Önleme özelliğini kullanın.
- Kimlik gizleme teknikleri hakkında bilgi edinme ve verilerin kimliğini gizlemek için Veri Kaybını Önleme'yi kullanma
- Biçim koruyan şifreleme (FPE) kullanılarak kimliği gizlenmiş verilerin nasıl yeniden tanımlanacağını öğrenin
- Dizelerden ve görüntülerden bilgi türlerini çıkartmak için Veri Kaybını Önleme özelliğini kullanma
Gerekenler
- Faturalandırma ayarları yapılmış bir Google Cloud projesi. Hesabınız yoksa bir hesap oluşturmanız gerekir.
2. Kurulum
Bu codelab, herhangi bir yerel yükleme veya yapılandırma gerekmeden tamamen Google Cloud Platform'da çalışabilir.
Cloud Shell
Bu codelab'de, Cloud Shell üzerinden komut satırını kullanarak farklı bulut kaynakları ve hizmetleri sağlayıp yöneteceğiz.
Tamamlayıcı proje deposunu indirin:
git clone https://github.com/googleapis/nodejs-dlp
Proje kodu indirildikten sonra samples dizinine geçin ve gerekli Node.js paketlerini yükleyin:
cd samples && npm install
Aşağıdaki gcloud komutuyla projeyi ayarlayarak doğru projeyi kullandığınızdan emin olun:
gcloud config set project [PROJECT_ID]
API'leri etkinleştirin
Projemizde etkinleştirmemiz gereken API'ler şunlardır:
- Cloud Data Loss Prevention API: Metin, görüntü ve Google Cloud Platform depolama depolarındaki gizliliğe duyarlı parçaların tespiti, risk analizi ve kimliğinin gizlenmesine yönelik yöntemler sunar
- Cloud Key Management Service (KMS) API'si: Google Cloud KMS, müşterilerin şifreleme anahtarlarını yönetmesine ve bu anahtarlarla şifreleme işlemleri gerçekleştirmesine olanak tanır.
Aşağıdaki gcloud komutuyla gerekli API'leri etkinleştirin:
gcloud services enable dlp.googleapis.com cloudkms.googleapis.com \ --project ${GOOGLE_CLOUD_PROJECT}
3. Dizeleri ve dosyaları inceleme
Önceki adımda indirilen projenin samples dizini, Cloud Veri Kaybını Önleme'nin farklı işlevlerinden yararlanan birkaç JavaScript dosyası içerir. inspect.js
, sağlanan dizede veya dosyada hassas bilgi türlerini inceler.
Bunu test etmek için string
seçeneğini ve hassas olabilecek bazı bilgileri içeren örnek bir dize sağlayabilirsiniz:
node inspect.js -c $GOOGLE_CLOUD_PROJECT \ string 'My email address is jenny@somedomain.com and you can call me at 555-867-5309'
Çıkış, eşleşen her bilgi türüyle ilgili bulguları bize bildirmelidir. Örneğin:
Alıntı: Şablon,
InfoType: Dizenin o bölümü için algılanan bilgi türü. Olası bilgi türlerinin tam listesini burada bulabilirsiniz. Varsayılan olarak inspect.js
yalnızca CREDIT_CARD_NUMBER
, PHONE_NUMBER
ve EMAIL_ADDRESS
bilgi türlerini inceler
Olasılık: Sonuçlar, her birinin bir eşleşmeyi temsil etme olasılıklarına göre kategorize edilir. Olasılık VERY_UNLIKELY
ile VERY_LIKELY
arasında değişebilir.
Yukarıdaki komut isteğine ilişkin bulgular:
Findings: Quote: jenny@somedomain.com Info type: EMAIL_ADDRESS Likelihood: LIKELY Quote: 555-867-5309 Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
Benzer şekilde, dosyalarda bilgi türlerini inceleyebiliriz. Örnek accounts.txt
dosyasını inceleyin:
resources/accounts.txt
My credit card number is 1234 5678 9012 3456, and my CVV is 789.
Bu sefer dosya seçeneğini kullanarak inspect.js
dosyasını tekrar çalıştırın:
node inspect.js -c $GOOGLE_CLOUD_PROJECT file resources/accounts.txt
Sonuçlar:
Findings: Quote: 5678 9012 3456 Info type: CREDIT_CARD_NUMBER Likelihood: VERY_LIKELY
Her iki sorgu türünde de sonuçları olasılığa veya bilgi türüne göre sınırlandırabiliriz. Örneğin:
node inspect.js -c $GOOGLE_CLOUD_PROJECT \ string 'Call 900-649-2568 or email me at anthony@somedomain.com' \ -m VERY_LIKELY
Minimum olasılık olarak VERY_LIKELY
belirtildiğinde, VERY_LIKELY
değerinden düşük olan tüm eşleşmeler hariç tutulur:
Findings: Quote: 900-649-2568 Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
Sınırlama olmaksızın tam sonuçlar aşağıdaki gibi olur:
Findings: Quote: 900-649-2568 Info type: PHONE_NUMBER Likelihood: VERY_LIKELY Quote: anthony@somedomain.com Info type: EMAIL_ADDRESS Likelihood: LIKELY
Benzer şekilde, kontrol ettiğimiz bilgi türünü de belirtebiliriz:
node inspect.js -c $GOOGLE_CLOUD_PROJECT \ string 'Call 900-649-2568 or email me at anthony@somedomain.com' \ -t EMAIL_ADDRESS
Yalnızca belirtilen bilgi türü bulunursa döndürülür:
Findings: Quote: anthony@somedomain.com Info type: EMAIL_ADDRESS Likelihood: LIKELY
Aşağıda, girişi incelemek için API'yi kullanan eşzamansız işlev verilmiştir:
inspect.js
async function inspectString(
callingProjectId,
string,
minLikelihood,
maxFindings,
infoTypes,
customInfoTypes,
includeQuote
) {
...
}
Yukarıdaki parametreler için sağlanan bağımsız değişkenler, istek nesnesi oluşturmak için kullanılır. Daha sonra bu istek, çıkışımızla sonuçlanan bir yanıt almak için inspectContent
işlevine sağlanır:
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. Kimlik gizleme
Cloud DLP, hassas verileri inceleyip tespit etmenin ötesinde kimlik gizleme de gerçekleştirebilir. Kimlik gizleme, verilerden kimlik bilgilerini kaldırma işlemidir. API, hassas verileri bilgi türlerine göre tanımlandığı şekilde algılar ve ardından verileri maskelemek, silmek veya başka bir şekilde gizlemek için kimlik gizleme dönüşümünden yararlanır.
deid.js
, kimlik gizlemeyi çeşitli şekillerde gösterir. En basit kimlik gizleme yöntemi maske kullanmaktır:
node deid.js deidMask -c $GOOGLE_CLOUD_PROJECT \ "My order number is F12312399. Email me at anthony@somedomain.com"
Maske kullanıldığında API, eşleşen bilgi türündeki karakterleri varsayılan olarak farklı bir karakterle * değiştirir. Çıkış şu şekilde olur:
My order number is F12312399. Email me at *****************************
Rastgele sipariş numarası değişmeden dizedeki e-posta adresinin kod karartma yöntemiyle saklandığına dikkat edin. (Özel bilgi türleri kullanılabilir ancak bu Codelab'in kapsamı dışındadır).
Bir maskeyle kimliği gizlemek için DLP API'yi kullanan işlevi inceleyelim:
deid.js
async function deidentifyWithMask(
callingProjectId,
string,
maskingCharacter,
numberToMask
) {
...
}
Bu bağımsız değişkenler bir kez daha istek nesnesi oluşturmak için kullanılır. Bu kez, deidentifyContent
işlevine sağlanır:
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);
Biçimi Koruyan Şifreleme ile Kimliği Gizleme
DLP API, hassas veri değerlerini şifreleme anahtarı kullanarak şifreleme özelliği de sunar.
Bir anahtarlık oluşturmak için Cloud KMS'yi kullanarak başlayacağız:
gcloud kms keyrings create dlp-keyring --location global
Şimdi verileri şifrelemek için kullanacağımız bir anahtar oluşturabiliriz:
gcloud kms keys create dlp-key \ --purpose='encryption' \ --location=global \ --keyring=dlp-keyring
DLP API, oluşturduğumuz KMS anahtarıyla şifrelenmiş sarmalanmış anahtarı kabul eder. Sarmalanacak rastgele bir dize oluşturabiliriz. Aşağıdaki bilgileri yeniden tanımlamak için buna ihtiyacımız olacaktır:
export AES_KEY=`head -c16 < /dev/random | base64 -w 0`
Şimdi dizeyi KMS anahtarımızla şifreleyebiliriz. Bu işlem, şifrelenmiş dizeyi şifrelenmiş metin olarak içeren bir ikili dosya oluşturur:
echo -n $AES_KEY | gcloud kms encrypt \ --location global \ --keyring dlp-keyring \ --key dlp-key \ --plaintext-file - \ --ciphertext-file ./ciphertext.bin
Artık deid.js
kullanarak aşağıdaki örnek dizede bulunan telefon numarasının kimliğini şifreleme ile gizleyebiliriz:
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
Çıkış, eşleşen bilgi türlerini şifrelenmiş bir dizeyle ve öncesinde -s işaretiyle belirtilen bilgi türüyle değiştirerek dizeyi döndürür:
My client's cell is PHONE_NUMBER(10):vSt55z79nR
Dizenin kimliğini gizlemek için kullandığımız işleve göz atalım:
deid.js
async function deidentifyWithFpe(
callingProjectId,
string,
alphabet,
surrogateType,
keyName,
wrappedKey
) {
...
}
Bağımsız değişkenler, bir cryptoReplaceFfxFpeConfig
nesnesi oluşturmak için kullanılır:
deid.js
const cryptoReplaceFfxFpeConfig = {
cryptoKey: {
kmsWrapped: {
wrappedKey: wrappedKey,
cryptoKeyName: keyName,
},
},
commonAlphabet: alphabet,
};
if (surrogateType) {
cryptoReplaceFfxFpeConfig.surrogateInfoType = {
name: surrogateType,
};
}
cryptoReplaceFfxFpeConfig
nesnesi, deidentifyContent
işlevi aracılığıyla API'ye yapılan istekte kullanılır:
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);
Verileri yeniden tanımlama
DLP API, verileri yeniden tanımlamak için önceki adımda oluşturduğumuz şifrelenmiş metni kullanır:
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
Çıkış, çıkartma veya vekil türü belirtilmeden orijinal dize olur:
My client's cell is 9006492568
Verileri yeniden tanımlamak için kullanılan işlev, verilerin kimliğini gizlemek için kullanılan işleve benzer:
deid.js
async function reidentifyWithFpe(
callingProjectId,
string,
alphabet,
surrogateType,
keyName,
wrappedKey
) {
...
}
Bu bağımsız değişken bir kez daha API'ye yapılan bir istekte kullanılır. Bu kez reidentifyContent
işlevine yönelik bir istekte bulunur:
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);
Tarih Kaydırarak Tarihlerin Kimliğini Gizleme
Bazı bağlamlarda tarihler, karartmak istediğimiz hassas veriler olarak değerlendirilebilir. Tarih kaydırma, belirli bir zaman aralığının ve süresinin korunmasını sağlarken tarihleri rastgele bir artışla değiştirmemizi sağlar. Bir kümedeki her tarih, söz konusu girişe özgü bir zaman miktarı kadar kaydırılır. Tarih değiştirme yoluyla kimlik gizlemeyi göstermek için önce tarih verilerini içeren örnek CSV dosyasına göz atın:
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
Veriler, tarih kaydırma uygulayabileceğimiz iki alan içerir: birth_date
ve register_date
. deid.js, tarihlerin değiştirileceği rastgele bir gün sayısı seçmek üzere bir aralık tanımlamak için alt sınır değeri ve üst sınır değeri kabul eder:
node deid.js deidDateShift -c $GOOGLE_CLOUD_PROJECT resources/dates.csv datesShifted.csv 30 90 birth_date
Tarihler 30 ile 90 arasında bir sayıda gün şeklinde rastgele kaydırılacak şekilde datesShifted.csv
adında bir dosya oluşturulur. Oluşturulan çıkışın bir örneğini aşağıda bulabilirsiniz:
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
Ayrıca, CSV dosyasındaki hangi tarih sütununu değiştirmek istediğimizi de belirtebildiğimize dikkat edin. birth_date
alanı register_date
alanı değişmez.
Şimdi, tarih kaydırma ile kimlik gizleme işlemini yürüten bir işleve göz atalım:
deid.js
async function deidentifyWithDateShift(
callingProjectId,
inputCsvFile,
outputCsvFile,
dateFields,
lowerBoundDays,
upperBoundDays,
contextFieldId,
wrappedKey,
keyName
) {
...
}
Bu işlevin, FPE'deki kimlik gizlemeye benzer şekilde sarmalanmış bir anahtarı ve bir anahtar adını kabul edebileceğine dikkat edin. Böylece, tarih kaymasını yeniden tanımlamak için şifreleme anahtarı sağlayabiliriz. Sağladığımız bağımsız değişkenler bir dateShiftConfig nesnesi oluşturur:
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. Dizeleri ve görüntüleri çıkartma
Hassas bilgileri gizlemenin diğer bir yöntemi de reddetme yöntemidir. Çıkarma işlemi, bir eşleşmenin yerini, eşleştirmeye uygun olduğu bilgi türüyle değiştirir. redact.js
, çıkartıldığını gösterir:
node redact.js -c $GOOGLE_CLOUD_PROJECT \ string "Please refund the purchase to my credit card 4012888888881881" \ -t 'CREDIT_CARD_NUMBER'
Çıkış, örnek kredi kartı numarasını CREDIT_CARD_NUMBER
bilgi türüyle değiştirir:
Please refund the purchase on my credit card [CREDIT_CARD_NUMBER]
Hassas bilgileri gizlemek, ancak yine de kaldırılmakta olan bilginin türünü tanımlamak istiyorsanız bu özellikten yararlanabilirsiniz. DLP API benzer şekilde metin içeren görüntülerdeki bilgileri çıkartabilir. Göstermek için örnek bir resme bakalım:
resources/test.png
Yukarıdaki resimden telefon numarasını ve e-posta adresini çıkartmak için:
node redact.js -c $GOOGLE_CLOUD_PROJECT \ image resources/test.png ./redacted.png \ -t PHONE_NUMBER -t EMAIL_ADDRESS
Belirtildiği gibi, istenen bilgiler karartılmış olarak redacted.png adlı yeni bir görüntü oluşturulacak:
Bir dizeden çıkartmak için kullanılan işlev şu şekildedir:
redact.js
async function redactText(
callingProjectId,
string,
minLikelihood,
infoTypes
) {
...}
deidentifyContent
işlevine sağlanan istek şu şekildedir:
redact.js
const request = {
parent: dlp.projectPath(callingProjectId),
item: {
value: string,
},
deidentifyConfig: {
infoTypeTransformations: {
transformations: [replaceWithInfoTypeTransformation],
},
},
inspectConfig: {
minLikelihood: minLikelihood,
infoTypes: infoTypes,
},
};
Benzer şekilde, bir görüntüyü çıkartma işlevi de şu şekildedir:
redact.js
async function redactImage(
callingProjectId,
filepath,
minLikelihood,
infoTypes,
outputPath
) {
...}
redactImage
işlevine sağlanan istek şu şekildedir:
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. Temizleme
Verilerimizdeki hassas bilgileri maskelemek, kimliğini gizlemek ve çıkartmak için DLP API'yi nasıl kullanabileceğimizi inceledik. Şimdi sıra, projemizi oluşturduğumuz tüm kaynaklardan arındırmaya geldi.
Projeyi silme
GCP Console'da Cloud Resource Manager sayfasına gidin:
Proje listesinde, üzerinde çalıştığımız projeyi seçin ve Sil'i tıklayın. Proje kimliğini yazmanız istenir. Kodu girip Kapat'ı tıklayın.
Alternatif olarak, gcloud ile projenin tamamını doğrudan Cloud Shell'den silebilirsiniz:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
7. Tebrikler!
Mükemmel! Başardınız! Cloud DLP; güçlü bir hassas veri inceleme, sınıflandırma ve kimlik gizleme platformuna erişim sağlayan güçlü bir araçtır.
İşlediğimiz konular
- Cloud DLP API'nin birden fazla bilgi türüne ilişkin dize ve dosyaları incelemek için nasıl kullanılabileceğini gördük.
- DLP API'nin, veri eşleştirme bilgi türlerini gizlemek için bir maske kullanarak dizelerin kimliğini nasıl gizleyebileceğini öğrendik.
- Veri kimliğini gizlemek ve ardından verileri yeniden tanımlamak amacıyla bir şifreleme anahtarı kullanmak için DLP API'den yararlandık
- Hem bir dize hem de görüntüden verileri çıkartmak için DLP API'yi kullandık