Mã hoá Cloud Functions bằng Khoá mã hoá do khách hàng quản lý (CMEK)

1. Giới thiệu

Tổng quan

Chức năng đám mây là một giải pháp điện toán gọn nhẹ dành cho nhà phát triển để tạo các hàm độc lập, dùng một mục đích duy nhất nhằm phản hồi các sự kiện trên đám mây mà không cần quản lý môi trường máy chủ hoặc thời gian chạy.

Bạn có thể sử dụng khoá mã hoá do khách hàng quản lý (CMEK) của Dịch vụ quản lý khoá Cloud để bảo vệ Cloud Functions và dữ liệu liên quan trong trạng thái tĩnh. Việc triển khai hàm bằng CMEK sẽ bảo vệ dữ liệu liên kết với hàm đó bằng cách sử dụng khoá mã hoá thuộc toàn quyền kiểm soát của bạn. Loại mã hoá này cho phép bạn đáp ứng các yêu cầu về tuân thủ trong một số ngành, chẳng hạn như dịch vụ tài chính. Vì khoá thuộc quyền sở hữu của bạn và không thuộc quyền kiểm soát của Google nên không ai (kể cả bạn) có thể truy cập vào dữ liệu được bảo vệ bằng các khoá mã hoá này khi bạn vô hiệu hoá hoặc huỷ khoá đó.

Đối với Cloud Functions, CMEK mã hoá những nội dung sau:

  • Mã nguồn hàm được tải lên để triển khai và được Google lưu trữ trong Cloud Storage. Mã này được dùng trong quá trình xây dựng.
  • Kết quả của quá trình tạo hàm, bao gồm cả hình ảnh vùng chứa được tạo từ mã nguồn hàm, mỗi thực thể của hàm được triển khai.
  • Dữ liệu tĩnh dành cho các kênh truyền tải sự kiện nội bộ (chỉ dành cho thế hệ thứ 1).

Bạn có thể xem thêm thông tin về loại dữ liệu được mã hoá trong tài liệu về CMEK của Hàm đám mây.

Sản phẩm bạn sẽ tạo ra

Lớp học lập trình này cho biết cách triển khai Hàm đám mây (thế hệ 1 hoặc thế hệ 2) được mã hoá bằng CMEK. Lớp học lập trình này sử dụng một hàm đám mây công khai (tức là hàm không yêu cầu xác thực) cho mục đích minh hoạ. Bạn có thể gọi một hàm hỗ trợ CMEK đã xác thực giống như mọi Hàm đám mây khác có yêu cầu xác thực.

Kiến thức bạn sẽ học được

  • Cách tạo khoá CMEK trên vòng khoá đối xứng hiện có
  • Cách tạo kho lưu trữ Artifact Registry
  • Cách định cấu hình CMEK trên Hàm đám mây cho cả thế hệ 1 và 2

2. Thiết lập và yêu cầu

Điều kiện tiên quyết

  • Bạn đã đăng nhập vào Cloud Console
  • Trước đây, bạn đã triển khai một Hàm đám mây được kích hoạt HTTP (để xác minh rằng bạn đã bật các vai trò và API thích hợp)

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

55efc1aaa7a4d3ad.pngS

Nếu đây là lần đầu tiên khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.pngs

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Tạo vòng khoá và khoá mới cho Cloud Functions

Đảm bảo bạn đã bật Cloud KMS API bằng cách chạy lệnh sau:

gcloud services enable cloudkms.googleapis.com

Trước tiên, hãy tạo các biến môi trường để chứa tên vòng khoá, tên khoá, khu vực và các biến khác sẽ dùng trong lớp học lập trình này.

KEYRING_NAME="keyring-functions"
REGION="us-central1"
KEY_NAME="key-encrypted-function"
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER="$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')"
USER_EMAIL="$(gcloud config list account --format "value(core.account)")"

Tiếp theo, hãy tạo một vòng khoá là tài nguyên gốc cho các khoá và phiên bản khoá của Cloud KMS.

gcloud kms keyrings create $KEYRING_NAME --location $REGION

Cuối cùng, bạn hiện có thể tạo khoá đối xứng trong vòng khoá mới trên Cloud KMS.

gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"

4. Tạo kho lưu trữ Artifact Registry có định dạng của Docker hỗ trợ CMEK

Trong phần này, bạn sẽ tạo một kho lưu trữ theo định dạng của Docker trong Artifact Registry đã bật CMEK. Khoá này cũng chính là khoá dùng để triển khai Chức năng đám mây của bạn.

Trước tiên, bạn cần có tài khoản dịch vụ cho Artifact Registry. Bạn có thể tạo tập lệnh này bằng cách chạy lệnh sau:

gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID

Sử dụng lệnh sau để cấp vai trò IAM CryptoKey Encrypter/decrypter IAM (roles/cloudkms.cryptoKeyEncrypterDecrypter) cho tài khoản dịch vụ Artifact Registry để có quyền truy cập vào khoá:

gcloud kms keys add-iam-policy-binding \
  $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \
  --role roles/cloudkms.cryptoKeyEncrypterDecrypter

Đồng thời, cấp vai trò cho nguyên tắc sẽ tạo kho lưu trữ trong sổ đăng ký cấu phần phần mềm, ví dụ: tài khoản đang hoạt động của bạn. Bạn có thể xác minh tài khoản đang hoạt động của mình bằng cách chạy danh sách xác thực gcloud.

gcloud kms keys add-iam-policy-binding \
       $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \
       --member user:$USER_EMAIL \
       --role roles/cloudkms.cryptoKeyEncrypterDecrypter

Giờ đây, bạn có thể tạo một kho lưu trữ theo định dạng Docker và hỗ trợ CMEK.

Lưu ý: khu vực phải giống với khoá CMEK.

REPO_NAME=my-cmek-encrypted-repo 

KEY_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/keyRings/"$KEYRING_NAME"/cryptoKeys/"$KEY_NAME" 

gcloud artifacts repositories create $REPO_NAME \
    --repository-format=docker \
    --location=$REGION \
    --kms-key=$KEY_FULLPATH \
    --async

Bạn có thể xem kho lưu trữ Artifact Registry mới của mình bằng cách chạy lệnh sau:

gcloud artifacts repositories describe $REPO_NAME --location=$REGION

5. Cấp quyền truy cập vào khoá cho Tài khoản dịch vụ (thế hệ thứ 2)

Phần này đề cập đến việc tạo tài khoản dịch vụ cho các hàm thế hệ 2. Nếu bạn đang tạo hàm thế hệ 1, vui lòng chuyển sang phần tiếp theo.

Bạn phải cấp cho một số tác nhân dịch vụ quyền truy cập vào khoá này bằng cách cấp vai trò IAM về Trình mã hoá/Trình giải mã CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter). Các tác nhân dịch vụ này được dùng để truy cập vào mã nguồn lưu trữ trong Cloud Storage, lưu trữ hình ảnh hàm trong kho lưu trữ được bảo vệ bằng CMEK trong Artifact Registry và để triển khai Hàm đám mây được mã hoá CMEK.

Các bước cho Hàm thế hệ 2

  1. Cấp quyền truy cập vào khoá cho tác nhân dịch vụ Cloud Run:
CLOUDRUN_SA=service-$PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$CLOUDRUN_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. Cấp quyền truy cập vào khoá này cho tác nhân dịch vụ Eventarc:
EVENTARC_SA=service-$PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$EVENTARC_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. Cấp quyền truy cập vào khoá cho tác nhân dịch vụ của Artifact Registry:
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$AR_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. Cấp cho nhân viên hỗ trợ dịch vụ của Cloud Storage quyền truy cập vào khoá:
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$STORAGE_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter

Trong phần tiếp theo, bạn sẽ tìm hiểu cách tạo và triển khai hàm được mã hoá CMEK.

6. Cấp quyền truy cập vào khoá cho Tài khoản dịch vụ (thế hệ 1)

Phần này đề cập đến việc tạo tài khoản dịch vụ cho các hàm thế hệ 1. Nếu bạn từng tạo tài khoản dịch vụ cho hàm thế hệ 2, vui lòng chuyển sang phần tiếp theo.

Bạn phải cấp cho một số tác nhân dịch vụ quyền truy cập vào khoá này bằng cách cấp vai trò IAM về Trình mã hoá/Trình giải mã CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter). Các tác nhân dịch vụ này được dùng để truy cập vào mã nguồn lưu trữ trong Cloud Storage, lưu trữ hình ảnh hàm trong kho lưu trữ được bảo vệ bằng CMEK trong Artifact Registry và để triển khai Hàm đám mây được mã hoá CMEK.

Các bước cho Hàm thế hệ 1

  1. Cấp quyền truy cập vào khoá cho tác nhân dịch vụ Cloud Functions:
FUNCTION_SA=service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$FUNCTION_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. Cấp quyền truy cập vào khoá cho tác nhân dịch vụ của Artifact Registry:
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$AR_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. Cấp cho nhân viên hỗ trợ dịch vụ của Cloud Storage quyền truy cập vào khoá:
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$STORAGE_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter

Trong phần tiếp theo, bạn sẽ tìm hiểu cách tạo và triển khai hàm được mã hoá CMEK.

7. Tạo một hàm được mã hoá CMEK (thế hệ thứ 2)

Phần này đề cập đến cách tạo hàm thế hệ 2. Bạn có thể chuyển sang phần tiếp theo để biết hướng dẫn dành cho thế hệ 1.

Giờ đây, bạn đã định cấu hình kho lưu trữ Artifact Registry bằng CMEK và cấp quyền truy cập Cloud Functions vào khoá của bạn. Bây giờ, bạn có thể triển khai một hàm được mã hoá bằng khoá CMEK.

Các bước thực hiện Hàm thế hệ 2:

Tạo mã nguồn cho hàm

Mặc dù lớp học lập trình này sử dụng Node.js, nhưng bạn có thể dùng bất kỳ môi trường thời gian chạy được hỗ trợ nào.

Trước tiên, hãy tạo một thư mục và cd vào thư mục đó.

mkdir ~/cmek-function-2ndgen && cd $_

Sau đó, hãy tạo tệp package.json.

touch package.json

echo '{
  "dependencies": {
    "@google-cloud/functions-framework": "^2.1.0"
  }
}
' > package.json

Tiếp theo, hãy tạo tệp nguồnindex.js.

touch index.js

echo 'const functions = require("@google-cloud/functions-framework");

functions.http("helloWorld", (req, res) => {
 res.send(`Hello ${req.query.name || req.body.name || "World"}!`);
});' > index.js

Triển khai Hàm đám mây thế hệ thứ 2 bằng phương thức mã hoá CMEK

Lưu ý: Ví dụ bên dưới cho biết cách triển khai hàm bằng các nguồn trong thư mục hiện tại của bạn. Đảm bảo bạn đang ở trong cùng thư mục với mã nguồn cho hàm.

FUNCTION_NAME=protect-me-cmek-2ndgen
ENTRY_POINT=helloWorld

REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME

gcloud beta functions deploy $FUNCTION_NAME  \
--gen2 \
--region $REGION \
--kms-key $KEY_FULLPATH \
--docker-repository $REPO_FULLPATH \
--source . \
--trigger-http \
--allow-unauthenticated \
--runtime nodejs16 \
--entry-point $ENTRY_POINT

Bạn có thể xem khoá CMEK trong kết quả đầu ra bằng cách chạy lệnh này

Các hàm gcloud mô tả $FUNCTION_NAME –region $REGION | grep kmsKeyName

Kiểm thử hàm thế hệ 2

Bạn có thể kiểm thử hàm bằng cách cuộn tròn:

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')"

curl $FUNCTION_URL

dẫn đến các kết quả sau:

Hello World!

Miễn là khoá mã hoá được bật, hàm sẽ trả về kết quả thành công cho phương thức gọi. Tuy nhiên, sau khi khoá mã hoá bị tắt, phương thức gọi sẽ nhận được thông báo lỗi.

Trong phần tiếp theo, bạn sẽ xem điều gì xảy ra khi gọi Hàm sau khi tắt khoá.

8. Tạo một hàm được mã hoá CMEK (thế hệ 1)

Phần này đề cập đến cách tạo hàm thế hệ 1. Nếu bạn từng tạo một hàm thế hệ 2, vui lòng chuyển sang phần tiếp theo.

Giờ đây, bạn đã định cấu hình kho lưu trữ Artifact Registry bằng CMEK và cấp quyền truy cập Cloud Functions vào khoá của bạn. Bây giờ, bạn có thể triển khai một hàm được mã hoá bằng khoá CMEK.

Các bước thực hiện Hàm thế hệ 1:

Tạo mã nguồn cho hàm thế hệ 1

Mặc dù lớp học lập trình này sử dụng Node.js, nhưng bạn có thể dùng bất kỳ môi trường thời gian chạy được hỗ trợ nào.

Trước tiên, hãy tạo một thư mục và cd vào thư mục đó.

mkdir ~/cmek-function-1stgen && cd $_

Tiếp theo, hãy tạo tệp package.json.

touch package.json

echo '{
    "name": "function-cmek-codelab",
    "version": "0.0.1"
}' > package.json

Sau đó, tạo tệp nguồnindex.js.

touch index.js

echo "exports.helloWorld = (req, res) => {
    let message = req.query.message || req.body.message || 'Hello World!';
    res.status(200).send(message);
};" > index.js

Triển khai Hàm đám mây thế hệ 1 bằng phương thức mã hoá CMEK

Lưu ý: Ví dụ bên dưới cho biết cách triển khai hàm bằng các nguồn trong thư mục hiện tại của bạn. Đảm bảo bạn đang ở trong cùng thư mục với mã nguồn cho hàm.

FUNCTION_NAME=protect-me-cmek-1stgen
ENTRY_POINT=helloWorld

REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME

gcloud functions deploy $FUNCTION_NAME  \
--region $REGION \
--kms-key $KEY_FULLPATH \
--docker-repository $REPO_FULLPATH \
--source . \
--trigger-http \
--allow-unauthenticated \
--runtime nodejs16 \
--entry-point $ENTRY_POINT

Bạn có thể xem khoá CMEK trong kết quả đầu ra bằng cách chạy lệnh này

Các hàm gcloud mô tả $FUNCTION_NAME –region $REGION | grep kmsKeyName

Kiểm thử hàm thế hệ 1

Bạn có thể kiểm thử hàm bằng cách cuộn tròn:

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')"

curl $FUNCTION_URL

dẫn đến các kết quả sau:

Hello World!

Miễn là khoá mã hoá được bật, hàm sẽ trả về kết quả thành công cho phương thức gọi. Tuy nhiên, sau khi khoá mã hoá bị tắt, phương thức gọi sẽ nhận được thông báo lỗi.

Trong phần tiếp theo, bạn sẽ xem điều gì xảy ra khi gọi Hàm sau khi tắt khoá.

9. Gọi một Hàm đã mã hoá CMEK trong đó khoá mã hoá đã bị tắt

Trong phần cuối cùng này, bạn sẽ vô hiệu hoá khoá rồi gọi lại Hàm để xem lỗi phát sinh.

Tắt khoá mã hoá

Bạn có thể chạy lệnh này để tắt khoá. Vì lớp học lập trình này chỉ tạo một phiên bản của khoá nên bạn sẽ vô hiệu hoá phiên bản 1.

gcloud kms keys versions disable 1 \
    --key=$KEY_NAME \
    --keyring=$KEYRING_NAME \
    --location=$REGION

và bạn sẽ thấy thông tin kết quả:

algorithm: GOOGLE_SYMMETRIC_ENCRYPTION
createTime: '2023-04-11T03:30:49.111832653Z'
generateTime: '2023-04-11T03:30:49.111832653Z'
name: projects/dogfood-gcf-saraford/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function/cryptoKeyVersions/1
protectionLevel: SOFTWARE
state: DISABLED

Gọi Hàm bằng một phím đã tắt

Bây giờ, hãy curl lại hàm này.

curl $FUNCTION_URL

và bạn sẽ không nhận được phản hồi Hello World (Xin chào thế giới) lần này.

Trong nhật ký của Cloud Function, bạn sẽ thấy

User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function

Thử xem tài nguyên khi khoá CMEK bị tắt

Trong phần này, bạn sẽ thấy các tài nguyên sau không còn hoạt động khi khoá CMEK bị tắt:

  • Mã nguồn hàm
  • Bản dựng hình ảnh vùng chứa từ mã nguồn của bạn

Ví dụ: khi truy cập vào thẻ Nguồn của Hàm đám mây, bạn sẽ thấy lỗi khi tìm nạp bản lưu trữ. Bạn sẽ gặp lỗi tương tự nếu cố xem tệp .zip có chứa mã nguồn trực tiếp trong Cloud Storage.

ac3307bb05d30e19.png

Ngoài ra, bạn sẽ không có quyền truy cập để sử dụng hình ảnh vùng chứa cho hàm từ Artifact Registry. Ví dụ: nếu cố gắng triển khai hình ảnh vùng chứa đó cho Cloud Run, bạn sẽ gặp lỗi cho biết không tìm thấy hình ảnh.

Vui lòng tham khảo tài liệu về Hàm CMEK để biết danh sách đầy đủ các tài nguyên đã mã hoá.

10. Xin chúc mừng

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!

Nội dung đã đề cập

  • Cách tạo khoá CMEK trên vòng khoá đối xứng hiện có
  • Cách tạo kho lưu trữ Artifact Registry
  • Cách định cấu hình CMEK trên Hàm đám mây

Để biết thêm thông tin

Bạn có thể tìm hiểu thêm thông tin về Cloud Functions và CMEK trong các đường liên kết sau: