Cloud Data Loss Prevention'a Genel Bakış

1. Genel Bakış

Cloud Data Loss Prevention (DLP), hassas bilgilerin keşfedilmesine, sınıflandırılmasına ve korunmasına yardımcı olmak için tasarlanmış, tümüyle yönetilen bir hizmettir. Bu codelab'de Cloud DLP API'nin temel özelliklerinden bazıları tanıtılacak ve verileri korumak için kullanılabileceği çeşitli yöntemler gösterilecektir.

Yapacaklarınız

  • Dizeleri ve dosyaları eşleşen bilgi türleri açısından incelemek için Veri Kaybını Önleme'yi kullanma
  • Kimlik gizleme teknikleri hakkında bilgi edinme ve verilerin kimliğini gizlemek için DLP'yi kullanma
  • Biçim koruyan şifreleme (FPE) kullanılarak kimliği gizlenmiş verileri nasıl yeniden tanımlayacağınızı öğrenin.
  • DLP'yi kullanarak dizelerdeki ve resimlerdeki bilgi türlerini çıkartma

Gerekenler

  • Faturalandırmanın ayarlandığı bir Google Cloud projesi. Hesabınız yoksa hesap oluşturmanız gerekir.

2. Hazırlanma

Bu codelab, yerel kurulum veya yapılandırma olmadan tamamen Google Cloud Platform'da çalıştırılabilir.

Cloud Shell

Bu codelab boyunca, Cloud Shell üzerinden komut satırını kullanarak farklı bulut kaynaklarını ve hizmetlerini 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 doğru projeyi kullandığınızdan emin olun:

gcloud config set project [PROJECT_ID]

API'leri etkinleştirme

Projemizde etkinleştirmemiz gereken API'ler şunlardır:

  • Cloud Data Loss Prevention API: Metin, resim ve Google Cloud Platform depolama depolarındaki gizliliğe duyarlı parçaların algılanması, risk analizi ve kimlik gizleme için yöntemler sağlar.
  • Cloud Key Management Service (KMS) API: Google Cloud KMS, müşterilerin şifreleme anahtarlarını yönetmesine ve bu anahtarlarla kriptografik işlemler 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 DLP'nin farklı işlevlerinden yararlanan çeşitli JavaScript dosyaları içerir. inspect.js, sağlanan bir dizeyi veya dosyayı hassas bilgi türleri açısından 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'

Çıktı, eşleşen her bilgi türüyle ilgili bulguları bize bildirmelidir. Bu bulgular şunları içerir:

Fiyat teklifi: Şablon,

InfoType: Dizenin ilgili 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 eşleşmeyi temsil etme olasılığına göre kategorize edilir. Olasılık VERY_UNLIKELY ile VERY_LIKELY arasında değişebilir.

Yukarıdaki komut isteğiyle ilgili 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, dosyaları bilgi türleri açısından inceleyebiliriz. Örnek accounts.txt dosyasına göz atın:

resources/accounts.txt

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

inspect.js komutunu bu kez dosya seçeneğiyle 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ırlayabiliriz. Ö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 değerini belirttiğinizde 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 olmadan tam sonuçlar şu şekilde olurdu:

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

Belirtilen bilgi türü bulunursa yalnızca bu tür 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, bir istek nesnesi oluşturmak için kullanılır. Bu istek daha sonra inspectContent işlevine sağlanarak çıkışımızı oluşturan bir yanıt alını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 yanı sıra kimliksizleştirme işlemi de gerçekleştirebilir. Kimlik gizleme, verilerden kişisel verilerin kaldırılması işlemidir. API, bilgi türleriyle tanımlanan hassas verileri algılar ve ardından verileri maskelemek, silmek veya başka bir şekilde gizlemek için kimlik gizleme dönüşümü kullanır.

deid.js, kimliksizleştirme işlemini çeşitli şekillerde gösterir. Kimliksizleştirmenin en basit yöntemi maskelemedir:

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

API, maske kullanarak eşleşen bilgi türünün karakterlerini farklı bir karakterle (varsayılan olarak *) değiştirir. Çıkış şöyle olur:

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

Dizideki e-posta adresinin karartıldığını, rastgele sipariş numarasının ise değişmediğini unutmayın. (Özel bilgi türleri mümkündür ancak bu kod laboratuvarının kapsamı dışındadır.)

Maske kullanarak 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, istek nesnesi oluşturmak için tekrar kullanılır. Bu kez deidentifyContent işlevine sağlanıyor:

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çim koruyan şifrelemeyle kimliği gizleme

DLP API, hassas veri değerlerini şifreleme anahtarı kullanarak şifreleme olanağı da sunar.

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ış bir anahtarı kabul eder. Sarmalanacak rastgele bir dize oluşturabiliriz. Daha sonra yeniden tanımlama yapmak için bu bilgiye ihtiyacımız olacak:

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

Artık dizeyi KMS anahtarımızla şifreleyebiliriz. Bu işlem, şifrelenmiş dizeyi şifreli metin olarak içeren bir ikili program dosyası oluşturur:

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

deid.js kullanarak aşağıdaki örnek dizedeki telefon numarasını artık şifreleme yoluyla kimlik 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ürlerinin şifrelenmiş bir dizeyle değiştirildiği ve -s işaretiyle belirtilen bilgi türüyle başlayan dizeyi döndürür:

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

Dizeyi kimlik 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, 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 de 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 şifreli 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

Çıktı, hiçbir redaksiyon veya yedek türü belirtilmeden orijinal dize olacaktır:

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

Yine bağımsız değişkenler, bu kez reidentifyContent işlevi için API'ye yapılan bir istekte kullanılır:

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ırma ile tarihlerin kimliğini gizleme

Tarihler, belirli bağlamlarda gizlemek isteyebileceğimiz hassas veriler olarak kabul edilebilir. Tarih kaydırma, tarihleri rastgele bir artışla kaydırmamıza olanak tanırken bir zaman aralığının sırasını ve süresini korur. Bir gruptaki her tarih, o girişe özgü bir süre kadar kaydırılır. Tarih kaydırma yoluyla kimliksizleştirme işlemini göstermek için öncelikle 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çeriyor: birth_date ve register_date. deid.js, tarihlerin kaydırılacağı rastgele gün sayısını belirlemek için bir aralık tanımlamak üzere 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

datesShifted.csv adlı bir dosya oluşturulur. Bu dosyada tarihler, 30 ile 90 gün arasında rastgele bir gün sayısı kadar kaydırılır. Oluşturulan çıkışın bir örneğini aşağıda görebilirsiniz:

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

CSV dosyasında hangi tarih sütununu kaydırmak istediğimizi de belirtebildiğimizi unutmayın. birth_date alanı register_date alanı değişmez.

Tarih kaydırma ile kimliksizleştirme işlemini gerçekleştiren işlevi inceleyelim:

deid.js

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

Bu işlevin, FPE ile kimlik gizleme işlemine benzer şekilde, sarmalanmış bir anahtarı ve anahtar adını kabul edebileceğini unutmayın. Böylece, tarih kaydırmayı yeniden tanımlamak için bir şifreleme anahtarı sağlama seçeneğimiz olur. 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 resimleri çıkartma

Hassas bilgileri karartmanın bir diğer yöntemi de belgelerden çıkartma işlemidir. Redaksiyon, eşleşmeyi, eşleştiği belirlenen bilgi türüyle değiştirir. redact.js, karartma işlemini gösterir:

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

Çıkışta, örnek kredi kartı numarası CREDIT_CARD_NUMBER bilgi türüyle değiştirilir:

Please refund the purchase on my credit card [CREDIT_CARD_NUMBER]

Hassas bilgileri gizlemek ancak kaldırılan bilgilerin türünü tanımlamak istiyorsanız bu özellikten yararlanabilirsiniz. DLP API, metin içeren resimlerdeki bilgileri de benzer şekilde kaldırabilir. Bunu göstermek için örnek bir resme bakalım:

resources/test.png

bf3719cfeb5676ff.png

Yukarıdaki resimde telefon numarasını ve e-posta adresini çıkarmak 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 bilgilerin karartıldığı redacted.png adlı yeni bir resim oluşturulur:

ce023dd95cccc40f.png

Bir dizeden bilgi çıkarmak için kullanılan işlev aşağıda verilmiştir:

redact.js

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

deidentifyContent işlevine gönderilecek istek aşağıda verilmiştir:

redact.js

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

Benzer şekilde, resimlerdeki bilgileri çıkarma işlevini aşağıda bulabilirsiniz:

redact.js

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

redactImage işlevine gönderilecek istek aşağıda verilmiştir:

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, kimliksizleştirmek ve çıkartmak için DLP API'yi nasıl kullanabileceğimizi inceledik. Şimdi projemizi oluşturduğumuz kaynaklardan temizleme zamanı.

Projeyi silme

GCP Console'da Cloud Resource Manager sayfasına gidin:

Proje listesinde, üzerinde çalıştığımız projeyi seçip Sil'i tıklayın. Proje kimliğini girmeniz istenir. Girip Kapat'ı tıklayın.

Alternatif olarak, projenin tamamını doğrudan Cloud Shell'den gcloud ile silebilirsiniz:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

7. Tebrikler!

Mükemmel! Başardınız! Cloud DLP, hassas verileri inceleme, sınıflandırma ve tanımlama kaldırma platformuna erişim sağlayan güçlü bir araçtır.

İşlediğimiz konular

  • Cloud DLP API'nin, dizeleri ve dosyaları birden fazla bilgi türü için incelemek üzere nasıl kullanılabileceğini gördük.
  • DLP API'nin, bilgi türleriyle eşleşen verileri gizlemek için dizeleri maskeyle nasıl anonimleştirebileceğini öğrendik.
  • Verilerin kimliğini gizlemek ve ardından yeniden tanımlamak için şifreleme anahtarı kullanmak üzere DLP API'yi kullandık.
  • Bir dizedeki ve resimdeki verileri çıkartmak için DLP API'yi kullandık.