Cloud Data Loss Prevention'a Genel Bakış

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

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

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

ce023dd95cccc40f.png

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