1. Tổng quan
Cloud Data Loss Prevention (DLP) là một dịch vụ được quản lý hoàn toàn, được thiết kế để giúp bạn 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ạ nhiều cách sử dụng API này để bảo vệ dữ liệu.
Bạn sẽ thực hiện
- Sử dụng DLP để kiểm tra các chuỗi và tệp nhằm 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 DLP để loại bỏ thông tin nhận dạng trong dữ liệu
- Tìm hiểu cách xác định lại dữ liệu đã được gỡ bỏ thông tin nhận dạng bằng phương pháp mã hoá giữ nguyên định dạng (FPE)
- Sử dụng DLP để chỉnh sửa các loại thông tin trong chuỗi và hình ảnh
Bạn cần có
- Một dự án trên Google Cloud có thông tin thanh toán. Nếu chưa có, bạn sẽ phải tạo một tài khoản.
2. Thiết lập
Bạn có thể chạy hoàn toàn lớp học lập trình này trên Google Cloud Platform mà không cần cài đặt hoặc định cấu hình cục bộ.
Cloud Shell
Trong suốt lớp học lập trình này, chúng ta sẽ cung cấp và quản lý nhiều tài nguyên và dịch vụ đám mây bằng dòng lệnh thông 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 chuyển sang thư mục mẫu và cài đặt các gói Node.js cần thiết:
cd samples && npm install
Đả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:
gcloud config set project [PROJECT_ID]
Bật API
Dưới đây là các API mà chúng ta cần bật cho dự án:
- Cloud Data Loss Prevention API – Cung cấp các phương thức 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 đoạn nhạy cảm về quyền riêng tư trong văn bản, hình ảnh và kho lưu trữ của Google Cloud Platform
- API Cloud Key Management Service (KMS) – Google Cloud KMS cho phép khách hàng quản lý khoá mã hoá và thực hiện các thao tác mã hoá bằng những khoá đó.
Bật các API bắt buộc bằng lệnh gcloud sau:
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 được tải xuống ở bước trước chứa một số tệp javascript tận 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 tra điều này, bạn có thể cung cấp lựa chọn string và một chuỗi mẫu có chứa một số thông tin có thể 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ả đầu ra sẽ cho biết thông tin tìm được cho từng loại thông tin trùng khớp, bao gồm:
Báo giá: Mẫu này chỉ định
InfoType: loại thông tin được phát hiện cho phần đó của chuỗi. Bạn có thể xem 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_NUMBER VÀ EMAIL_ADDRESS
Mức độ trùng khớp: kết quả được phân loại dựa trên mức độ trùng khớp của từng kết quả. Khả năng có thể dao động từ VERY_UNLIKELY đến VERY_LIKELY.
Sau đây là kết quả cho yêu cầu lệnh ở trên:
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ự, chúng ta có thể kiểm tra các tệp để tìm loại thông tin. Hãy 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 lựa 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 cả hai loại truy vấn, chúng tôi có thể giới hạn kết quả theo mức độ phù hợp 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 mức độ tương đồng tối thiểu, mọi kết quả khớp có mức độ tương đồng dưới 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 có 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 mà chúng ta đang 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
Hệ thống chỉ trả về loại thông tin đã chỉ định 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 một đố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 đầu ra 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òn có thể thực hiện quy trình xoá thông tin nhận dạng. Khử nhận dạng là quá trình xoá thông tin nhận dạng khỏi dữ liệu. API này phát hiện dữ liệu nhạy cảm theo định nghĩa của các loại thông tin, sau đó sử dụng một phép biến đổi để loại bỏ thông tin nhận dạng nhằm che giấu, xoá hoặc làm mờ dữ liệu.
deid.js sẽ minh hoạ quy trình loại bỏ thông tin nhận dạng theo nhiều 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"
Với 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 là *. Kết quả sẽ là:
My order number is F12312399. Email me at *****************************
Xin lưu ý rằng địa chỉ email trong chuỗi này đã bị làm rối mã nguồn trong khi số đơn đặt hàng tuỳ ý vẫn còn nguyên vẹn. (Bạn có thể 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 được dùng để tạo một đối tượng yêu cầu. Lần này, nó đượ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 tính năng Mã hoá giữ nguyên định dạng
API DLP cũng cung cấp khả năng 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 một bộ khoá:
gcloud kms keyrings create dlp-keyring --location global
Bây giờ, chúng ta có thể tạo một khoá để 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 khoá được bao bọ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 bao bọc. Sau này, chúng tôi sẽ cần thông tin này để 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ã hoá:
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, giờ đây, chúng ta 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 cách 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
Đầu ra sẽ trả về chuỗi có các loại thông tin trùng khớp được thay thế bằng một chuỗi được mã hoá và đứng trước loại thông tin được chỉ định bằng cờ -s:
My client's cell is PHONE_NUMBER(10):vSt55z79nR
Hãy xem hàm mà chúng ta đang dùng để xoá thông tin nhận dạng khỏi chuỗi:
deid.js
async function deidentifyWithFpe(
callingProjectId,
string,
alphabet,
surrogateType,
keyName,
wrappedKey
) {
...
}
Các đối số được dùng để tạo một đố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 đượ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, API DLP sẽ sử dụng văn bản mã hoá mà chúng ta đã tạo ở 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
Đầu ra sẽ là chuỗi ban đầu mà không có nội dung bị che khuất hoặc loại thay thế nào được chỉ định:
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ỏ thông tin nhận dạng dữ liệu:
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 một yêu cầu gửi đến API, lần này là 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ỏ thông tin nhận dạng ngày bằng tính năng chuyển đổi ngày
Trong một số ngữ cảnh nhất định, ngày có thể được coi là dữ liệu nhạy cảm mà chúng ta có thể muốn làm rối. Tính năng thay đổi ngày cho phép chúng tôi thay đổi ngày theo một mức tăng ngẫu nhiên trong khi vẫn giữ nguyên trình tự và thời lượng của một khoảng thời gian. Mỗi ngày trong một tập hợp được chuyển đi một khoảng thời gian riêng biệt cho mục đó. Để minh hoạ quy trình loại bỏ thông tin nhận dạng thông qua phương pháp thay đổi ngày, trước tiên, hãy xem tệp CSV mẫu có chứa dữ liệu 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 này chứa 2 trường mà chúng ta có thể áp dụng phương pháp dịch chuyển ngày: birth_date và register_date. deid.js sẽ chấp nhận một giá trị cận dưới và một giá trị cận trên để xác định một phạm vi nhằm chọn một số ngày ngẫu nhiên để thay đổi 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 datesShifted.csv sẽ được tạo với ngày được chuyển ngẫu nhiên trong khoảng từ 30 đến 90 ngày. Sau đây là ví dụ về kết quả được 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
Xin lưu ý rằng chúng ta cũng có thể chỉ định cột ngày nào trong tệp CSV mà chúng ta muốn chuyển. Trường birth_date Trường register_date vẫn không thay đổi.
Hãy xem hàm xử lý việc xoá thông tin nhận dạng bằng cách thay đổi ngày:
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 một khoá được bao bọc và một tên khoá, tương tự như việc loại bỏ thông tin nhận dạng bằng FPE, để chúng ta có thể cung cấp một khoá mã hoá để xác định lại mức độ thay đổi ngày. Các đối số mà chúng ta cung cấp sẽ tạo ra 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. Chỉnh sửa chuỗi văn bản và hình ảnh
Một phương pháp khác để làm rối thông tin nhạy cảm là che giấu. Tính năng che giấu sẽ thay thế một kết quả trùng khớp bằng loại thông tin mà kết quả đó được xác định là trùng khớp. redact.js minh hoạ tính năng che khuất:
node redact.js -c $GOOGLE_CLOUD_PROJECT \ string "Please refund the purchase to my credit card 4012888888881881" \ -t 'CREDIT_CARD_NUMBER'
Đầu ra 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 rất 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ự, DLP API 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

Cách che đi số điện thoại và địa chỉ email trong 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, một hình ảnh mới có tên redacted.png sẽ được tạo ra với thông tin được yêu cầu đã bị che đi:

Sau đây là hàm dùng để biên tập nội dung trong 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ự, đây là hàm để chỉnh sửa 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 tôi đã tìm hiểu cách sử 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. Bây giờ là lúc dọn dẹp dự án của chúng ta khỏi mọi tài nguyên mà chúng ta đã tạo.
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 thực hiện rồi nhấp vào Xoá. Bạn sẽ được nhắc nhập mã dự án. Nhập mật khẩu rồi nhấp vào Tắt.
Ngoài ra, bạn có thể xoá toàn bộ dự án ngay trong Cloud Shell bằng gcloud:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
7. Xin chúc mừng!
Tuyệt vời! Thật tuyệt! 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 ta đã thấy cách sử 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 tôi đã tìm hiểu cách API DLP có thể loại bỏ thông tin nhận dạng các chuỗi bằng một mặt nạ để ẩn thông tin về kiểu dữ liệu trùng khớp
- 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 rồi 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