Bảo mật mô hình học máy và Tài sản trí tuệ bằng Không gian bảo mật

1. Tổng quan

Không gian bảo mật cung cấp một môi trường an toàn để nhiều bên cộng tác với nhau. Lớp học lập trình này minh hoạ cách sử dụng Không gian bảo mật để bảo vệ tài sản trí tuệ nhạy cảm, chẳng hạn như mô hình học máy.

Trong lớp học lập trình này, bạn sẽ sử dụng Không gian bảo mật để cho phép một công ty chia sẻ mô hình học máy độc quyền của mình một cách an toàn với một công ty khác muốn sử dụng mô hình đó. Cụ thể, Công ty Primus có một mô hình học máy chỉ được phát hành cho một khối lượng công việc chạy trong Không gian bảo mật, cho phép Primus giữ toàn quyền kiểm soát tài sản trí tuệ của mình. Công ty Secundus sẽ là đơn vị vận hành khối lượng công việc và sẽ chạy khối lượng công việc học máy trong một Không gian bảo mật. Secundus sẽ tải mô hình này và chạy quy trình suy luận bằng dữ liệu mẫu do Secundus sở hữu.

Trong đó, Primus là tác giả tác vụ, người viết mã tác vụ và là cộng tác viên muốn bảo vệ tài sản trí tuệ của mình khỏi tác nhân tác vụ không đáng tin cậy, Secundus. Secundus là toán tử khối lượng công việc của khối lượng công việc học máy.

5a86c47d935da998.jpeg

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

  • Cách định cấu hình môi trường mà một bên có thể chia sẻ mô hình học máy độc quyền của mình với một bên khác mà không mất quyền kiểm soát tài sản trí tuệ của mình.

Bạn cần có

Vai trò liên quan đến việc thiết lập Không gian bảo mật

Trong lớp học lập trình này, Company Primus sẽ là chủ sở hữu tài nguyên và tác giả khối lượng công việc, chịu trách nhiệm về những việc sau:

  1. Thiết lập tài nguyên đám mây bắt buộc bằng mô hình học máy
  2. Viết mã khối lượng công việc
  3. Xuất bản hình ảnh khối lượng công việc
  4. Định cấu hình chính sách Nhóm danh tính tải để bảo vệ mô hình máy học khỏi một toán tử không đáng tin cậy

Công ty Secundus sẽ là đơn vị vận hành và chịu trách nhiệm về:

  1. Thiết lập các tài nguyên đám mây bắt buộc để lưu trữ hình ảnh mẫu mà khối lượng công việc sử dụng và kết quả
  2. Chạy khối lượng công việc học máy trong Không gian bảo mật bằng mô hình do Primus cung cấp

Cách hoạt động của Không gian riêng tư

Khi bạn chạy khối lượng công việc trong Không gian bảo mật, quy trình sau đây sẽ diễn ra bằng cách sử dụng các tài nguyên đã định cấu hình:

  1. Công việc yêu cầu mã thông báo truy cập chung của Google cho $PRIMUS_SERVICEACCOUNT từ Nhóm danh tính tải. Tệp này cung cấp mã thông báo dịch vụ Trình xác minh chứng thực với các tuyên bố về môi trường và khối lượng công việc.
  2. Nếu các tuyên bố đo lường mức tải trong mã thông báo dịch vụ Trình xác minh chứng thực khớp với điều kiện thuộc tính trong WIP, thì mã thông báo này sẽ trả về mã thông báo truy cập cho $PRIMUS_SERVICEACCOUNT.
  3. Gói công việc sử dụng mã truy cập tài khoản dịch vụ liên kết với $PRIMUS_SERVICEACCOUNT để truy cập vào mô hình học máy được lưu trữ trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET.
  4. Gánh nặng công việc thực hiện một thao tác trên dữ liệu do Secundus sở hữu và gánh nặng công việc đó do Secundus vận hành và chạy trong dự án của mình.
  5. Gói công việc sử dụng tài khoản dịch vụ $WORKLOAD_SERVICEACCOUNT để ghi kết quả của thao tác đó vào bộ chứa $SECUNDUS_RESULT_STORAGE_BUCKET.

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/ml_model_protection/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>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus>
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.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 các tài nguyên đó đã được tạo. (ví dụ: export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')
  1. 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à 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:

$PRIMUS_INPUT_STORAGE_BUCKET

Bộ chứa lưu trữ mô hình học máy của Primus.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Nhóm danh tính tải (WIP) của Primus xác thực các thông báo xác nhận.

$PRIMUS_WIP_PROVIDER

Nhà cung cấp nhóm danh tính tải của Primus, bao gồm điều kiện uỷ quyền để sử dụng cho mã thông báo do dịch vụ Trình xác minh chứng thực ký.

$PRIMUS_SERVICE_ACCOUNT

Tài khoản dịch vụ Primus mà $PRIMUS_WORKLOAD_IDENTITY_POOL sử dụng để truy cập vào các tài nguyên được bảo vệ (mô hình học máy trong lớp học lập trình này). Ở bước này, ứng dụng có quyền đọc mô hình học máy được lưu trữ trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ARTIFACT_REPOSITORY

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.

  1. 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 Secundus. 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 Secundus 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:

$SECUNDUS_INPUT_STORAGE_BUCKET

Bộ chứa lưu trữ hình ảnh mẫu mà Secundus muốn phân loại bằng mô hình do Primus cung cấp.

$SECUNDUS_RESULT_STORAGE_BUCKET

Bộ chứa lưu trữ kết quả của khối lượng công việc.

$WORKLOAD_IMAGE_NAME

Tên của hình ảnh vùng chứa khối lượng công việc.

$WORKLOAD_IMAGE_TAG

Thẻ của hình ảnh vùng chứa khối lượng công việc.

$WORKLOAD_SERVICE_ACCOUNT

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.

  • Bạn sẽ cần có một số quyền nhất định cho hai dự án này và 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, bạn cần có 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 tài khoản dịch vụ, Quản trị viên nhóm danh tính theo mức tải IAM.
  • Đối với $SECUNDUS_PROJECT_ID, bạn cần có Quản trị viên điện toán, Quản trị viên bộ nhớ, Quản trị viên tài khoản dịch vụ, Quản trị viên nhóm danh tính theo mức tải IAM, Quản trị viên bảo mật (không bắt buộc).
  • 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:

  • Bộ chứa trên Google Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) để lưu trữ mô hình học máy của 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_SERVICEACCOUNT) được đính kèm vào nhóm danh tính cho khối lượng công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL) được đề cập ở trên, có quyền truy cập IAM để đọ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ụ này với nhóm danh tính cho khối lượng công việc (sử dụng vai trò roles/iam.workloadIdentityUser).

Trong quá trình thiết lập tài nguyên trên đám mây này, chúng ta sẽ sử dụng một mô hình TensorFlow. Chúng ta có thể lưu toàn bộ mô hình bao gồm cấu trúc, trọng số và cấu hình huấn luyện của mô hình trong một tệp lưu trữ ZIP. Để phục vụ cho mục đích của lớp học lập trình này, chúng ta sẽ sử dụng mô hình MobileNet V1 được huấn luyện trên tập dữ liệu ImageNet có tại đây.

./setup_primus_company_resources.sh

Tập lệnh được đề cập ở trên sẽ thiết lập tài nguyên trên đám mây. Bây giờ, chúng ta sẽ tải xuống và phát hành mô hình vào bộ chứa Cloud Storage do tập lệnh tạo.

  1. Tải mô hình được huấn luyện trước xuống tại đây.
  2. Sau khi tải xuống, hãy đổi tên tệp tar đã tải xuống thành model.tar.gz.
  3. Xuất bản tệp model.tar.gz vào bộ chứa Cloud Storage bằng lệnh sau đây từ thư mục chứa tệp model.tar.gz.
gsutil cp model.tar.gz gs://${PRIMUS_INPUT_STORAGE_BUCKET}/

Thiết lập tài nguyên của Công ty Secundus

Trong bước này, bạn sẽ thiết lập các tài nguyên đám mây bắt buộc cho Secundus. Chạy tập lệnh sau để thiết lập tài nguyên cho Secundus. Trong các bước này, các tài nguyên sau sẽ được tạo:

  • Bộ chứa bộ nhớ trên đám mây ($SECUNDUS_INPUT_STORAGE_BUCKET) để lưu trữ hình ảnh mẫu cho việc chạy suy luận bằng Secundus.
  • Bộ chứa bộ nhớ trên đám mây ($SECUNDUS_RESULT_STORAGE_BUCKET) để lưu trữ kết quả của quá trình thực thi khối lượng công việc máy học do Secundus thực hiện.

Một số hình ảnh mẫu được cung cấp tại đây cho lớp học lập trình này.

./setup_secundus_company_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 Secundus. Tài khoản dịch vụ này sẽ được máy ảo chạy khối lượng công việc học máy 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ực
  • logging.logWriter để ghi nhật ký vào Cloud Logging.
  • objectViewer để đọc dữ liệu từ bộ nhớ trên đám mây $SECUNDUS_INPUT_STORAGE_BUCKET.
  • objectUser để ghi kết quả khối lượng công việc vào bộ nhớ trên đám mây $SECUNDUS_RESULT_STORAGE_BUCKET.
./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 Primus tạo. Công việc được sử dụng trong lớp học lập trình này là mã Python học máy, truy cập vào mô hình học máy được lưu trữ trong bộ chứa bộ nhớ của Primus và chạy các suy luận bằng hình ảnh mẫu được lưu trữ trong bộ chứa bộ nhớ.

Mô hình học máy được lưu trữ trong bộ chứa bộ nhớ của Primus sẽ chỉ được truy cập bằng các khối lượng công việc đáp ứng các điều kiện thuộc tính bắt buộc. 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.

Dưới đây là phương thức run_inference() của khối lượng công việc sẽ được tạo và sử dụng trong lớp học lập trình này. Bạn có thể xem toàn bộ mã khối lượng công việc tại đây.

def run_inference(image_path, model):
  try:
    # Read and preprocess the image
    image = tf.image.decode_image(tf.io.read_file(image_path), channels=3)
    image = tf.image.resize(image, (128, 128))
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.expand_dims(image, axis=0)

    # Get predictions from the model
    predictions = model(image)
    predicted_class = np.argmax(predictions)

    top_k = 5
    top_indices = np.argsort(predictions[0])[-top_k:][::-1]

    # Convert top_indices to a TensorFlow tensor
    top_indices_tensor = tf.convert_to_tensor(top_indices, dtype=tf.int32)

    # Use TensorFlow tensor for indexing
    top_scores = tf.gather(predictions[0], top_indices_tensor)

    return {
        "predicted_class": int(predicted_class),
        "top_k_predictions": [
            {"class_index": int(idx), "score": float(score)}
            for idx, score in zip(top_indices, top_scores)
        ],
    }
  except Exception as e:
    return {"error": str(e)}

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 Cấu phần phần mềm đăng ký($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 khối lượng công việc học máy và tạo Dockerfile để tạo hình ảnh Docker của mã khối lượng công việc. Đâ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

Ngoài ra, bạn có thể lập trình khối lượng công việc để đảm bảo rằng khối lượng công việc đó đang tải phiên bản dự kiến của mô hình học máy bằng cách kiểm tra hàm băm hoặc chữ ký của mô hình trước khi sử dụng. Ưu điểm của các bước kiểm tra bổ sung này là đảm bảo tính toàn vẹn của mô hình học máy. Do đó, toán tử khối lượng công việc cũng cần cập nhật hình ảnh khối lượng công việc hoặc các tham số của hình ảnh đó khi khối lượng công việc dự kiến sẽ sử dụng nhiều phiên bản của mô hình học máy.

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 mô hình học máy của họ 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 Workload Identity để 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 Secundus.
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 config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --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 == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
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@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

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 Không gian bảo mật. 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ờ. Kết quả thực thi khối lượng công việc sẽ được xuất bản lên $SECUNDUS_RESULT_STORAGE_BUCKET.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --project=${SECUNDUS_PROJECT_ID} \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_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}

Xem kết quả

Sau khi hoàn tất thành công khối lượng công việc, kết quả của khối lượng công việc học máy sẽ được phát hành đến $SECUNDUS_RESULT_STORAGE_BUCKET.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

Dưới đây là một số ví dụ về kết quả suy luận trên hình ảnh mẫu:

Image: sample_image_1.jpeg, Response: {'predicted_class': 531, 'top_k_predictions': [{'class_index': 531, 'score': 12.08437442779541}, {'class_index': 812, 'score': 10.269512176513672}, {'class_index': 557, 'score': 9.202644348144531}, {'class_index': 782, 'score': 9.08737564086914}, {'class_index': 828, 'score': 8.912498474121094}]}

Image: sample_image_2.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 9.53619384765625}, {'class_index': 557, 'score': 7.928380966186523}, {'class_index': 783, 'score': 7.70129919052124}, {'class_index': 531, 'score': 7.611623287200928}, {'class_index': 906, 'score': 7.021416187286377}]}

Image: sample_image_3.jpeg, Response: {'predicted_class': 905, 'top_k_predictions': [{'class_index': 905, 'score': 6.09878396987915}, {'class_index': 447, 'score': 5.992854118347168}, {'class_index': 444, 'score': 5.9582319259643555}, {'class_index': 816, 'score': 5.502010345458984}, {'class_index': 796, 'score': 5.450454235076904}]}

Đối với mỗi hình ảnh mẫu trong bộ chứa bộ nhớ Secundus, bạn sẽ thấy một mục trong kết quả. Mục nhập này sẽ bao gồm hai thông tin chính:

  • Chỉ mục của predicted_class: Đây là chỉ mục dạng số đại diện cho lớp mà mô hình dự đoán hình ảnh thuộc về.
  • Top_k_predictions: Thông số này cung cấp tối đa k kết quả dự đoán cho hình ảnh, được xếp hạng từ nhiều khả năng nhất đến ít khả năng nhất. Giá trị của k được đặt thành 5 trong lớp học lập trình này, nhưng bạn có thể điều chỉnh giá trị này trong mã khối lượng công việc để nhận được nhiều hoặc ít kết quả dự đoán hơn.

Để dịch chỉ mục lớp thành tên lớp mà con người đọc được, hãy tham khảo danh sách nhãn có sẵn tại đây. Ví dụ: nếu bạn thấy chỉ mục lớp là 2, thì chỉ mục này tương ứng với nhãn lớp "cá chép" trong danh sách nhãn.

Trong lớp học lập trình này, chúng tôi đã minh hoạ rằng một mô hình do Primus sở hữu chỉ được phát hành cho khối lượng công việc chạy trong TEE. Secundus chạy khối lượng công việc học máy trong một TEE và khối lượng công việc này có thể sử dụng mô hình do Primus sở hữu trong khi Primus vẫn giữ toàn quyền kiểm soát mô hình.

Chạy khối lượng công việc trái phép

Secundus thay đổi hình ảnh khối lượng công việc bằng cách lấy một hình ảnh khối lượng công việc khác từ kho lưu trữ cấu phần phần mềm của riêng nó mà Primus không cho phép. Nhóm danh tính tải của Primus chỉ cho phép hình ảnh Workload ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG.

Chạy lại khối lượng công việc

Khi Secundus cố gắng chạy khối lượng công việc ban đầu bằng hình ảnh khối lượng công việc mới này, quá trình này sẽ không thành công. Để xem lỗi, hãy xoá tệp kết quả ban đầu và thực thể máy ảo, sau đó thử chạy lại khối lượng công việc.

Vui lòng đảm bảo rằng có một hình ảnh docker mới được phát hành trong kho lưu trữ cấu phần phần mềm của Secundus (dưới dạng us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}) và tài khoản dịch vụ khối lượng công việc ($WORKLOAD_SERVICEACCOUNT) đã cấp cho trình đọc kho lưu trữ cấu phần phần mềm quyền đọc hình ảnh khối lượng công việc mới này. Điều này nhằm đảm bảo rằng khối lượng công việc không thoát trước khi chính sách WIP của Primus từ chối mã thông báo do khối lượng công việc đưa ra.

Xoá tệp kết quả hiện có và phiên bản máy ảo

  1. Đặt dự án thành dự án $SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. Xoá tệp kết quả.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result
  1. Xoá thực thể máy ảo bảo mật.
gcloud compute instances delete ${WORKLOAD_VM} --zone=${SECUNDUS_PROJECT_ZONE}

Chạy khối lượng công việc trái phép:

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata  ^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/custom-image/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}

Xem lỗi

Thay vì kết quả của khối lượng công việc, bạn sẽ thấy một lỗi (The given credential is rejected by the attribute condition).

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

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á:

  • Bộ nhớ đầu vào của Primus ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Tài khoản dịch vụ Primus ($PRIMUS_SERVICEACCOUNT).
  • Kho lưu trữ cấu phần phần mềm của Primus ($PRIMUS_ARTIFACT_REPOSITORY).
  • Nhóm nhận dạng khối lượng công việc Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Tài khoản dịch vụ tải trọng của Secundus ($WORKLOAD_SERVICEACCOUNT).
  • Bộ chứa bộ nhớ đầu vào của Secundus ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • Thực thể điện toán tải trọng.
  • Vùng lưu trữ kết quả của Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET).
$ ./cleanup.sh

Nếu bạn đã khám phá xong, vui lòng cân nhắc xoá dự án của mình.

Tiếp theo là gì?

Hãy xem một số lớp học lập trình tương tự sau đây...