Tổng quan về tính năng Ngăn chặn mất dữ liệu của Cloud

1. Tổng quan

Tính năng Ngăn chặn mất dữ liệu (DLP) của Cloud là dịch vụ được quản lý toàn diện, được thiết kế để giúp khám phá, phân loại và bảo vệ thông tin nhạy cảm. Lớp học lập trình này sẽ giới thiệu một số chức năng cơ bản của Cloud DLP API và minh hoạ những cách sử dụng API này để bảo vệ dữ liệu.

Bạn sẽ thực hiện

  • Sử dụng tính năng DLP (Ngăn chặn mất dữ liệu) để kiểm tra các chuỗi và tệp để tìm các loại thông tin trùng khớp
  • Tìm hiểu về các kỹ thuật loại bỏ thông tin nhận dạng và sử dụng tính năng DLP (Ngăn chặn mất dữ liệu) để loại bỏ thông tin nhận dạng cho dữ liệu
  • Tìm hiểu cách xác định lại dữ liệu đã bị loại bỏ thông tin nhận dạng bằng phương thức mã hoá bảo vệ định dạng (FPE)
  • Sử dụng tính năng DLP (Ngăn chặn mất dữ liệu) để loại bỏ các loại thông tin khỏi chuỗi và hình ảnh

Bạn cần có

  • Một dự án Google Cloud đã thiết lập thông tin thanh toán. Nếu chưa có tài khoản, bạn phải tạo một tài khoản.

2. Thiết lập

Lớp học lập trình này có thể chạy hoàn toàn trên Google Cloud Platform mà không cần cài đặt hay định cấu hình cục bộ.

Cloud Shell

Trong lớp học lập trình này, chúng ta sẽ cung cấp và quản lý nhiều dịch vụ cũng như tài nguyên đám mây bằng dòng lệnh qua Cloud Shell.

Tải kho lưu trữ dự án đồng hành xuống:

git clone https://github.com/googleapis/nodejs-dlp

Sau khi tải mã dự án xuống, hãy đổi sang thư mục mẫu rồi cài đặt các gói Node.js bắt buộc:

cd samples && npm install

Hãy đảm bảo bạn đang sử dụng đúng dự án bằng cách đặt dự án bằng lệnh gcloud sau đây:

gcloud config set project [PROJECT_ID]

Bật API

Dưới đây là các API chúng ta sẽ cần để bật trong dự án của mình:

  • API Ngăn chặn mất dữ liệu của Cloud – Cung cấp các phương pháp phát hiện, phân tích rủi ro và loại bỏ thông tin nhận dạng của các mảnh nhạy cảm về quyền riêng tư ở dạng văn bản, hình ảnh và kho lưu trữ bộ nhớ Google Cloud Platform
  • Cloud Key Management Service (KMS) API – Google Cloud KMS cho phép khách hàng quản lý khoá mã hoá và thực hiện thao tác mã hoá bằng các khoá đó.

Bật các API cần thiết bằng lệnh gcloud sau đây:

gcloud services enable dlp.googleapis.com cloudkms.googleapis.com \
--project ${GOOGLE_CLOUD_PROJECT}

3. Kiểm tra các chuỗi và tệp

Thư mục mẫu của dự án đã tải xuống ở bước trước chứa một số tệp JavaScript sử dụng các chức năng khác nhau của Cloud DLP. inspect.js sẽ kiểm tra một chuỗi hoặc tệp được cung cấp để tìm các loại thông tin nhạy cảm.

Để kiểm thử điều này, bạn có thể cung cấp tuỳ chọn string và một chuỗi mẫu chứa một số thông tin có thể mang tính nhạy cảm:

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ết quả sẽ cho chúng tôi biết kết quả của từng loại thông tin trùng khớp, bao gồm:

Trích dẫn: Mẫu chỉ định

InfoType: loại thông tin được phát hiện cho phần đó của chuỗi. Bạn sẽ tìm thấy danh sách đầy đủ các loại thông tin có thể có tại đây. Theo mặc định, inspect.js sẽ chỉ kiểm tra các loại thông tin CREDIT_CARD_NUMBER, PHONE_NUMBEREMAIL_ADDRESS

Khả năng thích hợp: các kết quả được phân loại dựa trên khả năng chúng phù hợp với kết quả. Khả năng có thể dao động trong khoảng từ VERY_UNLIKELY đến VERY_LIKELY.

Kết quả cho yêu cầu lệnh ở trên là:

Findings:
        Quote: jenny@somedomain.com
        Info type: EMAIL_ADDRESS
        Likelihood: LIKELY
        Quote: 555-867-5309
        Info type: PHONE_NUMBER
        Likelihood: VERY_LIKELY

Tương tự như vậy, chúng ta cũng có thể kiểm tra các loại thông tin trong tệp. Xem tệp accounts.txt mẫu:

resources/accounts.txt

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

Chạy lại inspect.js, lần này với tuỳ chọn tệp:

node inspect.js -c $GOOGLE_CLOUD_PROJECT file resources/accounts.txt

Kết quả:

Findings:
        Quote: 5678 9012 3456
        Info type: CREDIT_CARD_NUMBER
        Likelihood: VERY_LIKELY

Đối với một trong hai loại cụm từ tìm kiếm, chúng tôi có thể giới hạn kết quả theo khả năng hoặc loại thông tin. Ví dụ:

node inspect.js -c $GOOGLE_CLOUD_PROJECT \
string 'Call 900-649-2568 or email me at anthony@somedomain.com' \
-m VERY_LIKELY

Bằng cách chỉ định VERY_LIKELY làm khả năng tối thiểu, mọi kết quả khớp nhỏ hơn VERY_LIKELY sẽ bị loại trừ:

Findings:
        Quote: 900-649-2568
        Info type: PHONE_NUMBER
        Likelihood: VERY_LIKELY

Kết quả đầy đủ không giới hạn sẽ là:

Findings:
        Quote: 900-649-2568
        Info type: PHONE_NUMBER
        Likelihood: VERY_LIKELY
        Quote: anthony@somedomain.com
        Info type: EMAIL_ADDRESS
        Likelihood: LIKELY

Tương tự, chúng ta có thể chỉ định loại thông tin cần kiểm tra:

node inspect.js -c $GOOGLE_CLOUD_PROJECT \
string 'Call 900-649-2568 or email me at anthony@somedomain.com' \
-t EMAIL_ADDRESS

Chỉ loại thông tin đã chỉ định mới được trả về nếu tìm thấy:

Findings:
        Quote: anthony@somedomain.com
        Info type: EMAIL_ADDRESS
        Likelihood: LIKELY

Dưới đây là hàm không đồng bộ sử dụng API để kiểm tra dữ liệu đầu vào:

inspect.js

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

Các đối số được cung cấp cho các tham số ở trên được dùng để tạo đối tượng yêu cầu. Sau đó, yêu cầu đó được cung cấp cho hàm inspectContent để nhận được phản hồi dẫn đến kết quả của chúng ta:

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. Loại bỏ thông tin nhận dạng

Ngoài việc kiểm tra và phát hiện dữ liệu nhạy cảm, Cloud DLP có thể thực hiện việc loại bỏ thông tin nhận dạng. Loại bỏ thông tin nhận dạng là quá trình xoá thông tin nhận dạng khỏi dữ liệu. API phát hiện dữ liệu nhạy cảm được xác định theo loại thông tin, sau đó sử dụng quy trình biến đổi loại bỏ thông tin nhận dạng để che giấu, xoá hoặc che khuất dữ liệu.

deid.js sẽ minh hoạ việc loại bỏ thông tin nhận dạng theo một số cách. Phương pháp đơn giản nhất để loại bỏ thông tin nhận dạng là dùng mặt nạ:

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

Khi dùng mặt nạ, API sẽ thay thế các ký tự của loại thông tin trùng khớp bằng một ký tự khác, * theo mặc định. Kết quả sẽ là:

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

Lưu ý rằng địa chỉ email trong chuỗi bị làm rối mã nguồn trong khi số đơn đặt hàng tuỳ ý vẫn còn nguyên. (Có thể sử dụng các loại thông tin tuỳ chỉnh nhưng nằm ngoài phạm vi của Lớp học lập trình này).

Hãy xem hàm sử dụng API DLP để loại bỏ thông tin nhận dạng bằng mặt nạ:

deid.js

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

Một lần nữa, các đối số này sẽ được dùng để tạo đối tượng yêu cầu. Lần này, giá trị này được cung cấp cho hàm 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);

Loại bỏ thông tin nhận dạng bằng Mã hoá bảo tồn định dạng

API DLP cũng cho phép mã hoá các giá trị dữ liệu nhạy cảm bằng khoá mã hoá.

Chúng ta sẽ bắt đầu bằng cách sử dụng Cloud KMS để tạo vòng khoá:

gcloud kms keyrings create dlp-keyring --location global

Bây giờ, chúng ta có thể tạo khoá mà chúng ta sẽ dùng để mã hoá dữ liệu:

gcloud kms keys create dlp-key \
--purpose='encryption' \
--location=global \
--keyring=dlp-keyring

DLP API sẽ chấp nhận một khoá được mã hoá bằng khoá KMS mà chúng ta đã tạo. Chúng ta có thể tạo một chuỗi ngẫu nhiên sẽ được gói. Chúng tôi sẽ cần thông tin này vào lúc khác để xác định lại:

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

Bây giờ, chúng ta có thể mã hoá chuỗi bằng khoá KMS. Thao tác này sẽ tạo một tệp nhị phân chứa chuỗi đã mã hoá dưới dạng văn bản mật mã:

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

Bằng cách sử dụng deid.js, chúng ta hiện có thể loại bỏ thông tin nhận dạng số điện thoại trong chuỗi mẫu bên dưới bằng phương thức mã hoá:

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ết quả sẽ trả về chuỗi, trong đó các kiểu thông tin trùng khớp được thay thế bằng một chuỗi mã hoá và đứng trước là loại thông tin được biểu thị bằng cờ -s:

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

Hãy xem hàm mà chúng ta dùng để loại bỏ giá trị nhận dạng chuỗi:

deid.js

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

Các đối số được dùng để tạo đối tượng cryptoReplaceFfxFpeConfig:

deid.js

  const cryptoReplaceFfxFpeConfig = {
    cryptoKey: {
      kmsWrapped: {
        wrappedKey: wrappedKey,
        cryptoKeyName: keyName,
      },
    },
    commonAlphabet: alphabet,
  };
  if (surrogateType) {
    cryptoReplaceFfxFpeConfig.surrogateInfoType = {
      name: surrogateType,
    };
  }

Đối tượng cryptoReplaceFfxFpeConfig lần lượt được dùng trong yêu cầu gửi đến API thông qua hàm 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);

Xác định lại dữ liệu

Để xác định lại dữ liệu, DLP API sẽ sử dụng bản mã mà chúng ta đã tạo trong bước trước đó:

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ết quả sẽ là chuỗi ban đầu không có hoạt động loại bỏ hoặc loại thay thế được biểu thị:

My client's cell is 9006492568

Hàm dùng để xác định lại dữ liệu tương tự như hàm dùng để loại bỏ giá trị nhận dạng đó:

deid.js

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

Và một lần nữa, các đối số được dùng trong yêu cầu đến API, lần này cho hàm 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);

Loại bỏ xác định ngày bằng tính năng dịch chuyển ngày

Trong một số trường hợp nhất định, ngày có thể được xem là dữ liệu nhạy cảm mà chúng tôi có thể muốn làm rối mã nguồn. Tính năng Chuyển đổi ngày cho phép chúng ta chuyển ngày theo một gia số ngẫu nhiên trong khi vẫn duy trì trình tự và khoảng thời gian của một khoảng thời gian. Mỗi ngày trong một nhóm được dịch chuyển theo một khoảng thời gian duy nhất đối với mục nhập đó. Để chứng minh việc loại bỏ thông tin nhận dạng thông qua việc thay đổi ngày, trước tiên, hãy xem tệp CSV mẫu có chứa dữ liệu về ngày:

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

Dữ liệu chứa 2 trường mà chúng ta có thể áp dụng chế độ chuyển ngày sang: birth_dateregister_date. deid.js sẽ chấp nhận giá trị giới hạn dưới và giá trị giới hạn trên để xác định phạm vi nhằm chọn số ngày ngẫu nhiên dùng để chuyển ngày:

node deid.js deidDateShift -c $GOOGLE_CLOUD_PROJECT resources/dates.csv datesShifted.csv 30 90 birth_date

Một tệp có tên là datesShifted.csv sẽ được tạo với ngày được thay đổi ngẫu nhiên theo số ngày từ 30 đến 90. Dưới đây là ví dụ về kết quả đã tạo:

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

Lưu ý rằng chúng ta cũng có thể chỉ định cột ngày trong tệp CSV mà chúng ta muốn di chuyển. Trường birth_date Trường register_date vẫn không thay đổi.

Hãy cùng tìm hiểu một hàm xử lý việc loại bỏ thông tin nhận dạng bằng chế độ chuyển ngày (dateshift):

deid.js

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

Xin lưu ý rằng hàm này có thể chấp nhận khoá được gói và tên khoá, tương tự như việc loại bỏ thông tin nhận dạng bằng FPE. Nhờ đó, chúng ta có thể cung cấp khoá mã hoá để xác định lại sự kiện chuyển ngày. Các đối số mà chúng tôi cung cấp sẽ tạo một đối tượng 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. Loại bỏ các chuỗi và hình ảnh

Một phương pháp khác để làm rối thông tin nhạy cảm là loại bỏ. Thao tác loại bỏ sẽ thay thế thông tin trùng khớp bằng loại thông tin mà thông tin đó được xác định để so khớp. redact.js minh hoạ phương thức loại bỏ:

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

Kết quả này sẽ thay thế số thẻ tín dụng mẫu bằng loại thông tin CREDIT_CARD_NUMBER:

Please refund the purchase on my credit card [CREDIT_CARD_NUMBER]

Điều này sẽ hữu ích nếu bạn muốn ẩn thông tin nhạy cảm nhưng vẫn xác định được loại thông tin đang bị xoá. Tương tự như vậy, API DLP cũng có thể loại bỏ thông tin khỏi những hình ảnh có chứa văn bản. Để minh hoạ, hãy xem một hình ảnh mẫu:

resources/test.png

bf3719cfeb5676ff.png

Để che số điện thoại và địa chỉ email khỏi hình ảnh ở trên:

node redact.js -c $GOOGLE_CLOUD_PROJECT \
image resources/test.png ./redacted.png \
-t PHONE_NUMBER -t EMAIL_ADDRESS

Như đã chỉ định, hệ thống sẽ tạo một hình ảnh mới có tên tóm tắt.png và bôi đen thông tin yêu cầu:

ce023dd95cccc40f.png

Dưới đây là hàm dùng để loại bỏ khỏi một chuỗi:

redact.js

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

Và đây là yêu cầu sẽ được cung cấp cho hàm deidentifyContent:

redact.js

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

Tương tự, sau đây là hàm để loại bỏ hình ảnh:

redact.js

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

Và đây là yêu cầu sẽ được cung cấp cho hàm 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. Dọn dẹp

Chúng ta đã tìm hiểu cách dùng API DLP để che giấu, loại bỏ thông tin nhận dạng và loại bỏ thông tin nhạy cảm khỏi dữ liệu của mình. Giờ là lúc dọn dẹp mọi tài nguyên đã tạo trong dự án của chúng ta.

Xoá dự án

Trong Bảng điều khiển GCP, hãy chuyển đến trang Cloud Resource Manager (Trình quản lý tài nguyên trên đám mây):

Trong danh sách dự án, hãy chọn dự án mà chúng ta đang xử lý rồi nhấp vào Xoá. Bạn sẽ được nhắc nhập mã dự án. Nhập mật khẩu và nhấp vào Tắt.

Ngoài ra, bạn cũng có thể xoá toàn bộ dự án ngay trên Cloud Shell bằng gcloud:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

7. Xin chúc mừng!

Tuyệt vời! Các bạn đã làm được! Cloud DLP là một công cụ mạnh mẽ cung cấp quyền truy cập vào một nền tảng mạnh mẽ để kiểm tra, phân loại và loại bỏ thông tin nhận dạng dữ liệu nhạy cảm.

Nội dung đã đề cập

  • Chúng tôi đã tìm hiểu cách dùng Cloud DLP API để kiểm tra các chuỗi và tệp cho nhiều loại thông tin
  • Chúng ta đã tìm hiểu cách API DLP có thể loại bỏ thông tin nhận dạng cho các chuỗi bằng một mặt nạ để ẩn các loại thông tin so khớp dữ liệu
  • Chúng tôi sử dụng DLP API để dùng khoá mã hoá nhằm loại bỏ thông tin nhận dạng, sau đó xác định lại dữ liệu
  • Chúng tôi đã sử dụng API DLP để loại bỏ dữ liệu khỏi một chuỗi cũng như một hình ảnh