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ư của các khối lượng công việc được tăng tốc GPU chưa? Lớp học lập trình này sẽ hướng dẫn bạn về các tính năng của Trusted Space (Không gian đáng tin cậy), một dịch vụ cung cấp tính năng hỗ trợ tăng tốc và tách biệt mạnh mẽ cho các tác vụ AI/ML nhạy cảm.
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 giải pháp bằng cách đảm bảo rằng 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 và đáng tin cậy, ngay cả khi người vận hành khối lượng công việc không có quyền truy cập.
Dưới đây là những tính năng của Không gian đáng tin cậy:
- Nâng cao quyền riêng tư và bảo mật: 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 có giá trị và khoá) vẫn được bảo vệ, dựa trên bằng chứng mã hoá.
- Phân tách toán tử: Loại bỏ mối lo ngại về sự can thiệp của toán tử. Với Không gian đáng tin cậy, 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, ngăn họ sử dụng SSH, truy cập dữ liệu, cài đặt phần mềm hoặc can thiệp vào mã của bạn.
- Hỗ trợ trình tăng tốc: Không gian đáng tin cậy được thiết kế để hoạt động liền mạch với nhiều trình 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 chạy trơn tru.
Kiến thức bạn sẽ học được
- Tìm hiểu các dịch vụ chính của Trusted Space.
- Tìm hiểu cách triển khai và định cấu hình môi trường Không gian đáng tin cậy để bảo mật các tài sản có giá trị trong 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á, Mạng 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ề Vùng chứa và Cơ sở đăng ký cấu phần phần mềm
Bảo vệ lời nhắc tạo mã nhạy cảm bằng Công ty Primus
Trong lớp học lập trình này, chúng ta sẽ nhập vai Primus, một công ty ưu tiên quyền riêng tư và tính bảo mật của dữ liệu 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 do nhân viên gửi, vì các 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 thuật toán độc quyền.
Tại sao Công ty Primus không tin tưởng Nhà mạng?
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 giúp mang lại lợi thế cạnh tranh. Họ lo ngại về khả năng các nhà điều hành tải công việc có thể hoạt động gián điệp cho công ty. Ngoài ra, lời nhắc của nhân viên có thể bao gồm các phần mã "Cần biết" 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 hoạt động như sau:
- Mã hoá lời nhắc: Trước khi gửi lời nhắc đến máy chủ suy luận, mỗi nhân viên sẽ mã hoá lời nhắc đó 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 (có khoá giải mã tương ứng) mới có thể giải mã và truy cập vào lời nhắc văn bản thô. Trong trường hợp thực tế, các thư viện hiện có có thể xử lý việc mã hoá phía máy khách (ví dụ: tink). Trong lớp học lập trình này, chúng ta sẽ sử dụng ứng dụng khách mẫu này với tính năng mã hoá phong bì.
- Phân tách toán tử: Chỉ máy chủ suy luận chạy trong môi trường Không gian đáng tin cậy mới có quyền truy cập vào khoá dùng để mã hoá và có thể giải mã lời nhắc trong môi trường đá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 tính năng đảm bảo tách biệt của Không gian đáng tin cậy, 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 bảo mật 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 máy ảo được bảo vệ (trong quá trình thiết lập Không gian đáng tin cậy) để đảm bảo rằng thực thể khối lượng công việc không bị xâm phạm bởi phần mềm độc hại ở cấp khởi động hoặc cấp hạt nhân hoặc trình mô phỏng hệ thống. Máy chủ này giải mã lời nhắc 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 dưới đây để 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ạ dưới đây. Để biết thêm thông tin về cách thiết lập 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 đây để biết thông tin chi tiết về cách truy xuất mã dự án và sự khác biệt giữa mã dự án với tên dự án và số dự án.
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 lệnh sau. Các biến này cho phép bạn tuỳ chỉnh tên tài nguyên nếu cần và cũng sử dụng các tài nguyên hiện có nếu đã tạo. (ví dụ:
export PRIMUS_SERVICE_ACCOUNT='my-service-account'
)
- Bạn có thể đặt các biến sau đây 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 từ dự án Primus sẽ được sử dụng. Nếu bạn không đặt biến này, tên tài nguyên trên đám mây sẽ được tạo từ tên dự án và một tài nguyên trê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à 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à tài nguyên theo vùng sẽ được tạo cho công ty Primus. |
| Nhóm Workload Identity của công ty Primus để bảo vệ tài nguyên trên đám mây. |
| Nhà cung cấp Workload Identity Pool (WIP) của công ty Primus, bao gồm đ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. |
| Khoá chuỗi 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 đẩy. |
| Khu vực cho kho lưu trữ cấu phần phần mềm sẽ có hình ảnh docker tải trọng đã xuất bản. |
| Tên của máy ảo tải công việc. |
| Tên của hình ảnh docker cho 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 máy ảo ứng dụng khách sẽ chạy ứng dụng khách của máy chủ suy luận. |
| Tài khoản dịch vụ mà |
- Bạn cần có vai trò Quản trị viên bộ nhớ, Quản trị viên kho lưu trữ cấu phần phần mềm, Quản trị viên Cloud KMS, Quản trị viên tài khoản dịch vụ, Quản trị viên nhóm nhận dạng theo tải công việc IAM cho dự án
$PRIMUS_PROJECT_ID
. Bạn có thể tham khảo hướng dẫn này về 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 để đặt tên biến còn lại thành giá trị dựa trên mã dự án của bạ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 để thiết lập 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á truy cập ($PRIMUS_ENC_KEYRING
) trong KMS để mã hoá tệp dữ liệu khách hàng của công ty Primus. - Nhóm danh tính tải (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) để xác thực các tuyên bố dựa trên điều kiện thuộc tính được định cấu hình trong nhà cung cấp của nhóm. - Tài khoản dịch vụ (
$PRIMUS_SERVICE_ACCOUNT
) được đính kèm vào nhóm nhận dạng khối lượng công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL
) nêu trên có quyền 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ừ bộ nhớ trên đá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 nhận dạng khối lượng công việc (sử dụngroles/iam.workloadIdentityUser
).
./setup_primus_resources.sh
3. Tạo khối lượng công việc
Tạo tài khoản dịch vụ khối lượng công việc
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 để tạo tài khoản dịch vụ khối lượng công việc trong dự án Primus. Tài khoản dịch vụ này sẽ được máy ảo chạy máy chủ suy luận sử dụng.
Tài khoản dịch vụ khối lượng công việc này ($WORKLOAD_SERVICEACCOUNT
) sẽ có các vai trò sau:
confidentialcomputing.workloadUser
để nhận 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 mức tải
Trong bước này, bạn sẽ tạo một hình ảnh docker cho khối lượng công việc. Workload sẽ do công ty Primus tạo. Khối lượng công việc được sử dụng trong lớp học lập trình này là mã Python sử dụng mô hình codegemma từ vùng chứa GCS có sẵn công khai (của vườn mô hình đỉnh). Workload 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ừ các nhà phát triển của Primus.
Trên yêu cầu tạo mã, Workload sẽ nhận được DEK đã gói cùng với lời nhắc được mã hoá. Sau đó, Workload sẽ thực hiện lệnh gọi API KMS để giải mã DEK, sau đó giải mã lời nhắc bằng DEK này. Khoá mã hoá (cho DEK) sẽ được bảo vệ thông qua nhóm nhận dạng khối lượng công việc và quyền truy cập sẽ được cấp cho những khối lượng công việc đáp ứng các điều kiện 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 khối lượng công việc. Sau khi có lời nhắc đã giải mã, máy chủ suy luận sẽ tạo mã bằng cách sử dụng mô hình đã tải và trả về phản hồi.
Chạy tập lệnh sau để 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ã khối lượng công việc bằng tên tài nguyên bắt buộc.
- Tạo tải máy chủ suy luận và tạo Dockerfile để tạo hình ảnh Docker của mã tải. Đây là Dockerfile dùng cho lớp học lập trình này.
- Tạo và phát hành hình ảnh Docker lên Cấu phần phần mềm đăng ký (
$PRIMUS_ARTIFACT_REGISTRY
) do Primus sở hữu. - Cấp quyền đọc
$WORKLOAD_SERVICEACCOUNT
cho$PRIMUS_ARTIFACT_REGISTRY
. Điều này cần thiết để vùng chứa khối lượng công việc lấy hình ảnh docker khối lượng công việc từ Cấu phần phần mềm.
./create_workload.sh
Để bạn tham khảo, sau đây là phương thức generate() của khối lượng công việc được 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ã khối lượng công việc 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 Workload
Primus muốn uỷ quyền cho các khối lượng công việc truy cập vào khoá KMS dùng để mã hoá nhanh dựa trên các thuộc tính của các tài nguyên sau:
- Nội dung: Mã được xác minh
- Vị trí: Môi trường an toàn
- Who (Ai): Một nhà vận hành đáng tin cậy
Primus sử dụng tính năng liên kết danh tính theo khối lượng công việc để thực thi chính sách truy cập dựa trên các yêu cầu này. Tính năng liên kết danh tính theo khối lượng công việc cho phép bạn chỉ định điều kiện thuộc tính. Các điều kiện này hạn chế danh tính nào 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 nhà cung cấp nhóm danh tính tải để trình bày các số liệu đo lường 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 trên đám mây. Bây giờ, 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ẽ cấp quyền truy cập vào vùng chứa khối lượng công việc. Yêu cầu:
- Nội dung:
$WORKLOAD_IMAGE_NAME
mớ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 của Không gian bảo mật đang chạy trên hình ảnh máy ảo Không gian bảo mật được hỗ trợ đầy đủ.
- Ai: Tài khoản dịch vụ
$WORKLOAD_SERVICE_ACCOUNT
của Primus.
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 khối lượng công việc đang chạy trong môi trường không gian đáng tin cậy bằng cách kiểm tra để đảm bảo rằng hwmodel
được đặt thành "GCP_SHIELDED_VM" và swname
được đặt thành "HARDENED_SHIELDED". Ngoài ra, tính năng này còn bao gồm các câu nhận đị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 máy ảo Trusted Space (Không gian đáng tin cậy) có gắn trình tăng tốc. Các đối số TEE bắt buộc được truyền bằng cờ siêu dữ liệu. Các đối số cho vùng chứa khối lượng công việc được truyền bằng phần "tee-cmd
" của cờ. Để trang bị GPU Nvidia Tesla T4 cho máy ảo tải công việc, 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 máy ảo. Chúng ta cũng cần đưa 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 khởi chạy thành công máy chủ suy luận khối lượng công việc, nhân viên của công ty Primus hiện có thể gửi 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 sẽ 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 máy ảo ứng dụng và thực thi một ứng dụng ứng dụng mẫu trong môi trường ảo Python. Ứng dụng mẫu này sử dụng phương thức mã hoá phong bì bằng 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 khách và thực thi ứng dụng khách.
source venv/bin/activate
python3 inference_client.py
Kết quả của ứng dụng mẫu này sẽ hiển thị các yêu cầu lời nhắc mã hoá và văn bản thuần tuý, cũng như các phản hồi đã mã hoá và giải mã tương ứng.
5. Dọn dẹp
Dưới đâ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 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
) với nhà cung cấp. - Tài khoản dịch vụ tải trọng của Primus (
$WORKLOAD_SERVICEACCOUNT
). - Máy ảo tải công việc (
$WORKLOAD_VM
) và máy ảo ứng dụng ($CLIENT_VM
).
./cleanup.sh
Nếu bạn đã khám phá xong, vui lòng cân nhắc xoá dự án của mình.
- Truy cập vào Bảng điều khiển Cloud Platform
- Chọn dự án bạn muốn đóng, sau đó nhấp vào "Xoá" ở trên cùng: thao tác này sẽ lên lịch xoá dự án