1. Tổng quan
Bạn đã sẵn sàng nâng cao tính bảo mật và quyền riêng tư cho các khối lượng công việc được tăng tốc bằng GPU chưa? Lớp học lập trình này sẽ hướng dẫn bạn tìm hiểu các chức năng của Không gian đáng tin cậy, một sản phẩm cung cấp khả năng cô lập mạnh mẽ cho nhà điều hành và hỗ trợ bộ tăng tốc cho các tải công việc AI/ML nhạy cảm của bạn.
Việc bảo vệ dữ liệu, mô hình và khoá có giá trị trở nên quan trọng hơn bao giờ hết. Trusted Space cung cấp một giải pháp bằng cách đảm bảo rằng các khối lượng công việc của bạn hoạt động trong một môi trường an toàn, đáng tin cậy, nơi ngay cả người vận hành khối lượng công việc cũng không có quyền truy cập.
Sau đây là những lợi ích của Không gian đáng tin cậy:
- Quyền riêng tư và bảo mật nâng cao: Trusted Space cung cấp một môi trường thực thi đáng tin cậy, nơi các tài sản nhạy cảm của bạn (ví dụ: mô hình, dữ liệu và khoá có giá trị) vẫn được bảo vệ, dựa trên bằng chứng mật mã.
- Cách ly nhà mạng: Loại bỏ lo ngại về sự can thiệp của nhà mạng. Với Không gian đáng tin cậy, ngay cả các nhân viên vận hành khối lượng công việc của bạn cũng không có quyền truy cập, ngăn họ SSH, truy cập dữ liệu, cài đặt phần mềm hoặc giả mạo mã của bạn.
- Hỗ trợ bộ tăng tốc: Trusted Space được thiết kế để hoạt động liền mạch với nhiều bộ tăng tốc phần cứng, bao gồm cả GPU như H100, A100, T4 và L4. Điều này giúp đảm bảo các ứng dụng AI/học máy quan trọng về hiệu suất của bạn chạy trơn tru.
Kiến thức bạn sẽ học được
- Tìm hiểu về các dịch vụ chính của Không gian tin cậy.
- Tìm hiểu cách triển khai và định cấu hình môi trường Không gian tin cậy để bảo mật các tài sản có giá trị của khối lượng công việc AI/ML.
Bạn cần có
- Một dự án trên Google Cloud Platform
- Kiến thức cơ bản về Google Compute Engine và Trình tăng tốc.
- Kiến thức cơ bản về Tài khoản dịch vụ, Quản lý khoá, Liên kết danh tính cho khối lượng công việc và điều kiện thuộc tính.
- Kiến thức cơ bản về Containers và Artifact Registry
Bảo vệ câu lệnh nhạy cảm để tạo mã bằng Primus Company
Trong lớp học lập trình này, chúng ta sẽ đóng vai Primus, một công ty ưu tiên quyền riêng tư và tính bảo mật cho dữ liệu của nhân viên. Primus muốn triển khai một mô hình tạo mã để hỗ trợ các nhà phát triển trong các tác vụ lập trình. Tuy nhiên, họ lo ngại về việc bảo vệ tính bảo mật của các câu lệnh mà nhân viên của họ gửi, vì những câu lệnh này thường chứa các đoạn mã nhạy cảm, thông tin chi tiết về dự án nội bộ hoặc các thuật toán độc quyền.
Tại sao Công ty Primus không tin tưởng Nhân viên vận hành?
Primus Corp hoạt động trong một thị trường có tính cạnh tranh cao. Cơ sở mã của họ chứa tài sản trí tuệ có giá trị, bao gồm các thuật toán độc quyền và đoạn mã nhạy cảm mang lại lợi thế cạnh tranh. Họ lo ngại về khả năng gián điệp doanh nghiệp của các nhà điều hành khối lượng công việc. Ngoài ra, câu lệnh dành cho nhân viên có thể bao gồm các phần mã "Chỉ cần biết" mang tính bảo mật mà Primus Corp muốn bảo vệ.
Để giải quyết mối lo ngại này, Primus Corp sẽ tận dụng Trusted Space để tách biệt máy chủ suy luận đang chạy mô hình tạo mã. Cách sử dụng như sau:
- Mã hoá câu lệnh: Trước khi gửi câu lệnh đến máy chủ suy luận, mỗi nhân viên sẽ mã hoá câu lệnh đó bằng khoá KMS do Primus Corp quản lý trong Google Cloud. Điều này đảm bảo rằng chỉ môi trường Không gian đáng tin cậy (nơi có sẵn khoá giải mã tương ứng) mới có thể giải mã và truy cập vào câu lệnh văn bản thuần tuý. Trong trường hợp thực tế, tính năng mã hoá phía máy khách có thể được xử lý bằng các thư viện hiện có (ví dụ: tink). Trong lớp học lập trình này, chúng ta sẽ sử dụng ứng dụng mẫu này với tính năng mã hoá phong bì.
- Cách ly toán tử: Chỉ máy chủ suy luận chạy trong môi trường Không gian tin cậy mới có quyền truy cập vào khoá dùng để mã hoá và có thể giải mã câu lệnh trong môi trường tin cậy. Quyền truy cập vào khoá mã hoá sẽ được bảo vệ bằng Workload Identity Pool. Do các đảm bảo về khả năng cô lập của Trusted Space, ngay cả người vận hành khối lượng công việc cũng không thể truy cập vào khoá dùng để mã hoá và nội dung đã giải mã.
- Suy luận an toàn bằng(các) Trình tăng tốc: Máy chủ suy luận sẽ được khởi chạy trên một VM được bảo vệ (trong quá trình thiết lập không gian đáng tin cậy). Điều này sẽ đảm bảo rằng phiên bản tải không bị xâm phạm bởi phần mềm độc hại hoặc rootkit ở cấp độ khởi động hoặc cấp độ hạt nhân. Máy chủ này giải mã câu lệnh trong môi trường Trusted Space, thực hiện suy luận bằng mô hình tạo mã và trả về mã đã tạo cho nhân viên.
2. Thiết lập tài nguyên trên đám mây
Trước khi bắt đầu
- Sao chép kho lưu trữ này bằng lệnh bên dưới để lấy các tập lệnh bắt buộc được dùng trong lớp học lập trình này.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- Thay đổi thư mục cho lớp học lập trình này.
cd confidential-space/codelabs/trusted_space_codelab/scripts
- Đảm bảo bạn đã thiết lập các biến môi trường dự án bắt buộc như minh hoạ bên dưới. Để biết thêm thông tin về cách thiết lập một dự án GCP, vui lòng tham khảo lớp học lập trình này. Bạn có thể tham khảo bài viết này để biết thông tin chi tiết về cách truy xuất mã dự án và mã này khác với tên dự án và số dự án như thế nào.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
- Bật tính năng Thanh toán cho các dự án của bạn.
- Bật API Điện toán bảo mật và các API sau cho cả hai dự án.
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudkms.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- Chỉ định giá trị cho các biến cho tên tài nguyên được chỉ định ở trên bằng cách sử dụng lệnh sau. Những biến này cho phép bạn tuỳ chỉnh tên tài nguyên khi cần và sử dụng các tài nguyên hiện có nếu chúng đã được tạo. (ví dụ:
export PRIMUS_SERVICE_ACCOUNT='my-service-account')
- Bạn có thể đặt các biến sau bằng tên tài nguyên đám mây hiện có trong dự án Primus. Nếu bạn đặt biến này, thì tài nguyên đám mây hiện có tương ứng trong dự án Primus sẽ được dùng. Nếu bạn chưa đặt biến này, tên tài nguyên đám mây sẽ được tạo từ tên dự án và một tài nguyên đám mây mới sẽ được tạo bằng tên đó. Sau đây là các biến được hỗ trợ cho tên tài nguyên:
| Khu vực mà các tài nguyên theo khu vực sẽ được tạo cho công ty Primus. |
| Vị trí tạo tài nguyên cho công ty Primus. |
| Vùng mà các tài nguyên theo vùng sẽ được tạo cho công ty Primus. |
| Nhóm danh tính tải của công ty Primus để bảo vệ các tài nguyên trên đám mây. |
| Nhà cung cấp Workload Identity Pool của công ty Primus, bao gồm cả điều kiện uỷ quyền để sử dụng cho các mã thông báo do Dịch vụ xác minh chứng thực ký. |
| Tài khoản dịch vụ của công ty Primus mà |
| Khoá KMS được dùng để mã hoá các câu lệnh do nhân viên của công ty Primus cung cấp. |
| Chuỗi khoá KMS sẽ được dùng để tạo khoá mã hoá |
| Phiên bản khoá KMS của khoá mã hoá |
| Kho lưu trữ cấu phần phần mềm nơi hình ảnh Docker của khối lượng công việc sẽ được chuyển. |
| Khu vực cho kho lưu trữ cấu phần phần mềm sẽ có hình ảnh Docker của khối lượng công việc đã xuất bản. |
| Tên của VM tải công việc. |
| Tên của hình ảnh Docker về khối lượng công việc. |
| Thẻ của hình ảnh vùng chứa khối lượng công việc. |
| Tài khoản dịch vụ có quyền truy cập vào Máy ảo bảo mật chạy khối lượng công việc. |
| Tên của VM ứng dụng sẽ chạy ứng dụng của máy chủ suy luận. |
| Tài khoản dịch vụ mà |
- Bạn sẽ cần có các vai trò Quản trị viên bộ nhớ, Quản trị viên Artifact Registry, Quản trị viên Cloud KMS, Quản trị viên tài khoản dịch vụ, Quản trị viên IAM Workload Identity Pool cho dự án
$PRIMUS_PROJECT_ID. Bạn có thể tham khảo hướng dẫn này để biết cách cấp vai trò IAM bằng bảng điều khiển GCP. - Đối với
$PRIMUS_PROJECT_ID, hãy chạy tập lệnh sau đây để đặt các tên biến còn lại thành giá trị dựa trên mã dự án cho tên tài nguyên.
source config_env.sh
Thiết lập tài nguyên của Công ty Primus
Trong bước này, bạn sẽ thiết lập các tài nguyên đám mây cần thiết cho Primus. Chạy tập lệnh sau đây để thiết lập các tài nguyên cho Primus. Các tài nguyên sau đây sẽ được tạo trong quá trình thực thi tập lệnh:
- Khoá mã hoá (
$PRIMUS_ENC_KEY) và khoá ($PRIMUS_ENC_KEYRING) trong KMS để mã hoá tệp dữ liệu khách hàng của công ty Primus. - Workload Identity Pool (
$PRIMUS_WORKLOAD_IDENTITY_POOL) để xác thực các yêu cầu dựa trên các điều kiện thuộc tính được định cấu hình trong nhà cung cấp của nhóm này. - Tài khoản dịch vụ (
$PRIMUS_SERVICE_ACCOUNT) được đính kèm vào nhóm danh tính tải nêu trên ($PRIMUS_WORKLOAD_IDENTITY_POOL) có quyền truy cập để giải mã dữ liệu bằng khoá KMS (sử dụng vai tròroles/cloudkms.cryptoKeyDecrypter), mã hoá dữ liệu bằng khoá KMS (sử dụng vai tròroles/cloudkms.cryptoKeyEncrypter), đọc dữ liệu từ vùng lưu trữ đám mây (sử dụng vai tròobjectViewer) và kết nối tài khoản dịch vụ với nhóm danh tính tải (sử dụngroles/iam.workloadIdentityUser).
./setup_primus_resources.sh
3. Tạo đơn vị công việc
Tạo tài khoản dịch vụ cho tải
Bây giờ, bạn sẽ tạo một tài khoản dịch vụ cho khối lượng công việc với các vai trò và quyền bắt buộc. Chạy tập lệnh sau đây để tạo tài khoản dịch vụ tải trong dự án Primus. Tài khoản dịch vụ này sẽ được VM dùng để chạy máy chủ suy luận.
Tài khoản dịch vụ tải này ($WORKLOAD_SERVICEACCOUNT) sẽ có các vai trò sau:
confidentialcomputing.workloadUserđể lấy mã thông báo chứng thựclogging.logWriterđể ghi nhật ký vào Cloud Logging.
./create_workload_service_account.sh
Tạo đơn vị công việc
Trong bước này, bạn sẽ tạo một hình ảnh Docker cho tải. Khối lượng công việc sẽ do công ty Primus tạo ra. Tải trọng được dùng trong lớp học lập trình này là mã Python sử dụng mô hình codegemma từ nhóm GCS có sẵn công khai (của vườn mô hình vertex). Tải sẽ tải mô hình codegemma và khởi chạy máy chủ suy luận để phân phát các yêu cầu tạo mã từ nhà phát triển của Primus.
Trong yêu cầu tạo mã, Workload sẽ nhận được DEK được bao bọc cùng với một câu lệnh được mã hoá. Sau đó, tải sẽ gọi API KMS để giải mã DEK, rồi giải mã câu lệnh bằng DEK này. Khoá mã hoá (cho DEK) sẽ được bảo vệ thông qua nhóm danh tính tải và quyền truy cập sẽ được cấp cho những tải đáp ứng các điều kiện về thuộc tính. Các điều kiện thuộc tính này được mô tả chi tiết hơn trong phần tiếp theo về việc uỷ quyền cho tải. Sau khi máy chủ suy luận có câu lệnh đã giải mã, máy chủ này sẽ tạo mã bằng cách sử dụng một mô hình đã tải và trả về phản hồi.
Chạy tập lệnh sau đây để tạo một khối lượng công việc trong đó các bước sau đang được thực hiện:
- Tạo Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY) do Primus sở hữu. - Cập nhật mã tải với tên tài nguyên bắt buộc.
- Tạo khối lượng công việc của máy chủ suy luận và tạo Dockerfile để tạo một hình ảnh Docker của mã khối lượng công việc. Đây là Dockerfile được dùng cho lớp học lập trình này.
- Tạo và xuất bản hình ảnh Docker lên Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY) do Primus sở hữu. - Cấp cho
$WORKLOAD_SERVICEACCOUNTquyền đọc đối với$PRIMUS_ARTIFACT_REGISTRY. Điều này là cần thiết để vùng chứa khối lượng công việc kéo hình ảnh Docker của khối lượng công việc từ Artifact Registry.
./create_workload.sh
Để tham khảo, đây là phương thức generate() của tải mà bạn đã tạo và sử dụng trong lớp học lập trình này (bạn có thể tìm thấy toàn bộ mã tải tại đây).
def generate():
try:
data = request.get_json()
ciphertext = base64.b64decode(data["ciphertext"])
wrapped_dek = base64.b64decode(data["wrapped_dek"])
unwrapped_dek_response = kms_client.decrypt(
request={"name": key_name, "ciphertext": wrapped_dek}
)
unwrapped_dek = unwrapped_dek_response.plaintext
f = Fernet(unwrapped_dek)
plaintext = f.decrypt(ciphertext)
prompt = plaintext.decode("utf-8")
tokens = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**tokens, max_new_tokens=128)
generated_code = tokenizer.decode(outputs[0])
generated_code_bytes = generated_code.encode("utf-8")
response = f.encrypt(generated_code_bytes)
ciphertext_base64 = base64.b64encode(response).decode("utf-8")
response = {"generated_code_ciphertext": ciphertext_base64}
return jsonify(response)
except (ValueError, TypeError, KeyError) as e:
return jsonify({"error": str(e)}), 500
4. Uỷ quyền và chạy khối lượng công việc
Uỷ quyền cho khối lượng công việc
Primus muốn uỷ quyền cho các tải công việc truy cập vào khoá KMS mà họ dùng để mã hoá câu lệnh dựa trên các thuộc tính của những tài nguyên sau:
- Nội dung: Mã đã được xác minh
- Nơi: Môi trường an toàn
- Đối tượng: Một nhà mạng đáng tin cậy
Primus sử dụng Liên kết danh tính tải để thực thi chính sách truy cập dựa trên các yêu cầu này. Liên kết thông tin nhận dạng khối lượng công việc cho phép bạn chỉ định các điều kiện thuộc tính. Các điều kiện này hạn chế những danh tính có thể xác thực bằng nhóm danh tính tải (WIP). Bạn có thể thêm Dịch vụ xác minh chứng thực vào WIP dưới dạng một nhà cung cấp nhóm danh tính tải để trình bày các phép đo và thực thi chính sách.
Nhóm danh tính tải đã được tạo trước đó trong bước thiết lập tài nguyên đám mây. Giờ đây, Primus sẽ tạo một nhà cung cấp nhóm danh tính tải OIDC mới. --attribute-condition được chỉ định sẽ cho phép truy cập vào vùng chứa khối lượng công việc. Tính năng này yêu cầu:
- Nội dung:
$WORKLOAD_IMAGE_NAMEmới nhất được tải lên kho lưu trữ$PRIMUS_ARTIFACT_REPOSITORY. - Vị trí: Môi trường thực thi đáng tin cậy Confidential Space đang chạy trên hình ảnh máy ảo Confidential Space được hỗ trợ đầy đủ.
- Đối tượng: Tài khoản dịch vụ
$WORKLOAD_SERVICE_ACCOUNTPrimus.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--project="$PRIMUS_PROJECT_ID" \
--workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'HARDENED_SHIELDED' && assertion.hwmodel == 'GCP_SHIELDED_VM' &&
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
Lệnh trên xác minh rằng tải đang chạy trong một môi trường không gian đáng tin cậy bằng cách kiểm tra xem hwmodel có được đặt thành "GCP_SHIELDED_VM" và swname có được đặt thành "HARDENED_SHIELDED" hay không. Hơn nữa, tính năng này còn có các câu khẳng định dành riêng cho khối lượng công việc, chẳng hạn như image_digest và image_reference, để tăng cường bảo mật và đảm bảo tính toàn vẹn của khối lượng công việc đang chạy.
Chạy khối lượng công việc
Trong bước này, chúng ta sẽ chạy khối lượng công việc trong VM Trusted Space (Không gian đáng tin cậy) có gắn một bộ tăng tốc. Các đối số TEE bắt buộc được truyền bằng cách sử dụng cờ siêu dữ liệu. Các đối số cho vùng chứa tải được truyền bằng cách sử dụng phần "tee-cmd" của cờ. Để trang bị cho VM tải công việc một GPU Nvidia Tesla T4, chúng ta sẽ sử dụng cờ --accelerator=type=nvidia-tesla-t4,count=1. Thao tác này sẽ đính kèm một GPU vào VM. Chúng ta cũng cần thêm tee-install-gpu-driver=true vào cờ siêu dữ liệu để kích hoạt quá trình cài đặt trình điều khiển GPU thích hợp.
gcloud compute instances create ${WORKLOAD_VM} \
--accelerator=type=nvidia-tesla-t4,count=1 \
--machine-type=n1-standard-16 \
--shielded-secure-boot \
--image-project=conf-space-images-preview \
--image=confidential-space-0-gpupreview-796705b \
--zone=${PRIMUS_PROJECT_ZONE} \
--maintenance-policy=TERMINATE \
--boot-disk-size=40 \
--scopes=cloud-platform \
--service-account=${WORKLOAD_SERVICEACCOUNT}@${PRIMUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata="^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-install-gpu-driver=true~tee-restart-policy=Never"
Chạy truy vấn suy luận
Sau khi máy chủ suy luận về khối lượng công việc được khởi chạy thành công, giờ đây, nhân viên của công ty Primus có thể gửi các yêu cầu tạo mã đến máy chủ suy luận.
Trong lớp học lập trình này, chúng ta sẽ sử dụng tập lệnh sau để thiết lập ứng dụng khách tương tác với máy chủ suy luận. Chạy tập lệnh này để thiết lập máy ảo ứng dụng.
./setup_client.sh
Các bước sau đây minh hoạ cách SSH vào VM của máy khách và thực thi một ứng dụng máy khách mẫu trong môi trường ảo Python. Ứng dụng ví dụ này sử dụng phương thức mã hoá phong bì với thư viện Fernet, nhưng xin lưu ý rằng bạn có thể điều chỉnh các thư viện mã hoá cụ thể cho phù hợp với nhiều trường hợp sử dụng.
gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}
Chạy các lệnh sau để kích hoạt môi trường ảo Python trong máy ảo của ứng dụng và thực thi ứng dụng.
source venv/bin/activate
python3 inference_client.py
Đầu ra của ứng dụng mẫu này sẽ cho thấy các yêu cầu mã hoá và văn bản thuần tuý, cũng như các phản hồi tương ứng đã mã hoá và giải mã.
5. Dọn dẹp
Đây là tập lệnh có thể dùng để dọn dẹp các tài nguyên mà chúng ta đã tạo trong lớp học lập trình này. Trong quá trình dọn dẹp này, các tài nguyên sau đây sẽ bị xoá:
- Tài khoản dịch vụ Primus (
$PRIMUS_SERVICEACCOUNT). - Khoá mã hoá Primus (
$PRIMUS_ENC_KEY). - Kho lưu trữ cấu phần phần mềm của Primus (
$PRIMUS_ARTIFACT_REPOSITORY). - Nhóm danh tính tải Primus (
$PRIMUS_WORKLOAD_IDENTITY_POOL) cùng với nhà cung cấp của nhóm. - Tài khoản dịch vụ tải của Primus (
$WORKLOAD_SERVICEACCOUNT). - VM tải công việc (
$WORKLOAD_VM) và VM máy khách ($CLIENT_VM).
./cleanup.sh
Nếu bạn đã khám phá xong, vui lòng cân nhắc việc xoá dự án.
- Truy cập vào Cloud Platform Console
- Chọn dự án mà bạn muốn tắt, rồi nhấp vào "Xoá" ở trên cùng: thao tác này sẽ lên lịch xoá dự án