1. Giới thiệu
Tổng quan
Cloud Functions là một giải pháp điện toán gọn nhẹ để nhà phát triển tạo các hàm độc lập, dùng cho một mục đích duy nhất, phản hồi các sự kiện trên đám mây mà không cần quản lý máy chủ hoặc môi trường thời gian chạy.
Bạn có thể sử dụng khoá mã hoá do khách hàng quản lý (CMEK) trong Dịch vụ quản lý khoá trên đám mây để bảo vệ các Hàm trên đám mây và dữ liệu liên quan ở trạng thái tĩnh. Việc triển khai một 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á mà bạn có toàn quyền kiểm soát. Kiểu mã hoá này cho phép bạn đáp ứng các yêu cầu tuân thủ trong một số ngành, chẳng hạn như dịch vụ tài chính. Vì khoá này thuộc quyền sở hữu của bạn và không do Google kiểm soát, 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 khoá bị vô hiệu hoá hoặc bị huỷ bỏ.
Đố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à do Google lưu trữ trong Cloud Storage, được dùng trong quá trình xây dựng.
- Kết quả của quy 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 cho các kênh truyền sự kiện nội bộ (chỉ dành cho thế hệ 1).
Bạn có thể tìm thêm thông tin về dữ liệu được mã hoá trong tài liệu về CMEK của Hàm trên đá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 một Hàm trên đám mây (thế hệ 1 hoặc 2) được mã hoá bằng CMEK. Lớp học lập trình này sử dụng một Hàm trên đám mây công khai, tức là một 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 một Hàm trên đám mây cho cả thế hệ 1 và 2
2. Cách thiết lập và các yêu cầu
Điều kiện tiên quyết
- Bạn đã đăng nhập vào Cloud Console
- Bạn đã triển khai một Hàm trên đám mây được kích hoạt bằng 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
- Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell .
Nếu đây là lần đầu tiên bạ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 thấy một màn hình trung gian, hãy nhấp vào Tiếp tục.
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
Máy ảo này được tải sẵn tất cả các công cụ phát triển cần thiết. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp cải thiện đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết (nếu không phải tất cả) công việc trong lớp học lập trình này 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 của bạn.
- 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ả của lệnh
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- 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ả của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt giá trị này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả của lệnh
Updated property [core/project].
3. Tạo một khoá và vòng khoá mới cho Cloud Functions
Đảm bảo bạn đã bật API Cloud KMS 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 được 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 bộ khoá. Đây 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 có thể tạo khoá đối xứng trong vòng khoá mới của mình trong Cloud KMS.
gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"
4. Tạo kho lưu trữ Artifact Registry định dạng 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 sẽ giống với khoá dùng để triển khai Hàm trên đám mây.
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 Trình mã hoá/Trình giải mã CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter
) cho tài khoản dịch vụ CSDL Cấu phần phần mềm để 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 hiện tại 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ữ định dạng Docker 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ữ mới của Cấu phần phần mềm 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 trình bày cách 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á bằng cách cấp vai trò IAM Trình mã hoá/giải mã khoá mã hoá (roles/cloudkms.cryptoKeyEncrypterDecrypter
). Các tác nhân dịch vụ này được dùng để lấy quyền truy cập vào mã nguồn được 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 Cấu phần phần mềm đăng ký và triển khai Hàm trên đám mây được mã hoá bằng CMEK.
Các bước cho Hàm thế hệ 2
- Cấp cho tác nhân dịch vụ Cloud Run quyền truy cập vào khoá:
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
- Cấp cho tác nhân dịch vụ Eventarc quyền truy cập vào khoá:
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
- Cấp cho tác nhân dịch vụ Artifact Registry quyền truy cập vào khoá:
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
- 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á bằng 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 trước đây bạn đã tạo tài khoản dịch vụ cho một 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á bằng cách cấp vai trò IAM Trình mã hoá/Trình giải mã khoá mã hoá (roles/cloudkms.cryptoKeyEncrypterDecrypter
). Các tác nhân dịch vụ này được dùng để lấy quyền truy cập vào mã nguồn được 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 Cấu phần phần mềm đăng ký và để triển khai một Hàm trên đám mây được mã hoá bằng CMEK.
Các bước cho Hàm thế hệ 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
- Cấp cho tác nhân dịch vụ Artifact Registry quyền truy cập vào khoá:
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
- 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á bằng CMEK.
7. Tạo Hàm được mã hoá bằng CMEK (thế hệ 2)
Phần này trình bày cách tạo hàm thế hệ 2. Bạn có thể chuyển sang phần tiếp theo để xem hướng dẫn về thế hệ 1.
Giờ đây, khi đã định cấu hình kho lưu trữ Cấu phần phần mềm với CMEK và cấp quyền truy cập vào khoá cho Cloud Functions, bạn có thể triển khai một hàm được mã hoá bằng khoá CMEK.
Các bước cho 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ể sử dụng bất kỳ thời gian chạy được hỗ trợ nào.
Trước tiên, hãy tạo một thư mục và chuyển 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 trên đám mây thế hệ 2 bằng phương thức mã hoá CMEK
Lưu ý: Ví dụ bên dưới cho thấy cách triển khai một hàm bằng cách sử dụng các nguồn từ thư mục hiện tại của bạn. Đảm bảo bạn đang ở cùng thư mục với mã nguồn cho hàm của mình.
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 từ kết quả bằng cách chạy lệnh sau
gcloud functions describe $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ẽ thấy điều gì xảy ra khi gọi Hàm sau khi khoá đã bị vô hiệu hoá.
8. Tạo Hàm được mã hoá bằng CMEK (thế hệ 1)
Phần này trình bày cách tạo hàm thế hệ 1. Nếu bạn đã tạo 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 cho các Hàm đám mây quyền truy cập 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 cho 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ể sử dụng bất kỳ thời gian chạy được hỗ trợ nào.
Trước tiên, hãy tạo một thư mục và chuyển 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 đó, hãy tạo tệp nguồn index.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 trên đám mây thế hệ 1 bằng phương thức mã hoá CMEK
Lưu ý: Ví dụ bên dưới cho thấy cách triển khai một hàm bằng cách sử dụng các nguồn từ thư mục hiện tại của bạn. Đảm bảo bạn đang ở cùng thư mục với mã nguồn cho hàm của mình.
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 từ kết quả bằng cách chạy lệnh sau
gcloud functions describe $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 hàm đó:
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ẽ thấy điều gì xảy ra khi gọi Hàm sau khi khoá đã bị vô hiệu hoá.
9. Gọi một Hàm được mã hoá bằng CMEK mà khoá mã hoá đã bị tắt
Trong phần cuối cùng này, bạn sẽ vô hiệu hoá khoá và gọi lại Hàm để xem lỗi xảy ra.
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 khoá bị 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 lần này.
Trong nhật ký của Hàm trên đám mây, 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
Cố gắng 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 cho Hàm trên đám mây, bạn sẽ thấy lỗi trong 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.
Ngoài ra, bạn sẽ không có quyền sử dụng hình ảnh vùng chứa cho hàm từ Cấu phần phần mềm. Ví dụ: nếu cố gắng triển khai hình ảnh vùng chứa đó cho Cloud Run, bạn sẽ nhận được thông báo lỗi 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 được 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 một Hàm trên đám mây
Để biết thêm thông tin
Bạn có thể xem thêm thông tin về Hàm trên đám mây và CMEK trong các đường liên kết sau:
- Bài viết Bảo mật Hàm trên đám mây bằng CMEK
- Tài liệu về khoá mã hoá do khách hàng quản lý