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 Confidential Space để bảo vệ tài sản trí tuệ nhạy cảm, chẳng hạn như các mô hình học máy.

Trong lớp học lập trình này, bạn sẽ sử dụng Confidential Space để cho phép một công ty chia sẻ an toàn mô hình học máy độc quyền của mình 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 Confidential Space, cho phép Primus giữ quyền kiểm soát hoàn toàn đối với 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 một quy trình suy luận bằng dữ liệu mẫu thuộc sở hữu của Secundus.

Trong đó, Primus là tác giả của khối lượng công việc, người tạo mã khối lượng công việc 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 người vận hành khối lượng công việc không đáng tin cậy, Secundus. Secundus là toán tử tải 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 thiết lập một 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 đối với tài sản trí tuệ của mình.

Bạn cần có

Cá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, Công ty Primus sẽ là chủ sở hữu tài nguyên và tác giả của 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 các tài nguyên đám mây bắt buộc bằng một 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 học máy khỏi một toán tử không đáng tin cậy

Secundus Company 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 cần thiết để 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 ML trong Confidential Space bằng mô hình do Primus cung cấp

Cách hoạt động của Không gian bí mật

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

  1. Tải yêu cầu mã truy cập chung của Google cho $PRIMUS_SERVICEACCOUNT từ Workload Identity Pool. Dịch vụ 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 yêu cầu về khối lượng công việc và môi trường.
  2. Nếu các yêu cầu đo lường khối lượng công việc 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ã truy cập cho $PRIMUS_SERVICEACCOUNT.
  3. Tải sử dụng mã truy cập tài khoản dịch vụ được 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 nhóm $PRIMUS_INPUT_STORAGE_BUCKET.
  4. Tải thực hiện một thao tác trên dữ liệu do Secundus sở hữu và tải đó do Secundus vận hành và chạy trong dự án của mình.
  5. Tải sử dụng tài khoản dịch vụ $WORKLOAD_SERVICEACCOUNT để ghi kết quả của thao tác đó vào vùng 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 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/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ạ 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>
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 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à cũng có thể sử dụng các tài nguyên hiện có nếu chúng đã được tạo. (ví dụ: export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')
  1. 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à 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:

$PRIMUS_INPUT_STORAGE_BUCKET

Nhóm 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 yêu cầu.

$PRIMUS_WIP_PROVIDER

Nhà cung cấp nhóm danh tính tải của 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ụ 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 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, nó 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 chuyển.

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

$SECUNDUS_INPUT_STORAGE_BUCKET

Nhóm lưu trữ các 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 tải.

$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 2 dự án này và 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 sẽ cần có quyền Quản trị viên bộ nhớ, Quản trị viên Artifact Registry, Quản trị viên tài khoản dịch vụ, Quản trị viên nhóm Workload Identity IAM.
  • Đối với $SECUNDUS_PROJECT_ID, bạn sẽ cần có quyền 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 Workload Identity IAM, Quản trị viên bảo mật (không bắt buộc).
  • Chạy tập lệnh sau để đặ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:

  • Bộ chứa lưu trữ trên đám mây ($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 xác nhận quyền sở hữ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.
  • 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) nêu trên bằng 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 đá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ả 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ập ở trên sẽ thiết lập tài nguyên đám mây. Giờ đây, chúng ta sẽ tải mô hình xuống và xuất bản 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 tiền kỳ 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 cần thiết cho Secundus. Chạy tập lệnh sau đây để 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 nhằm chạy suy luận bằng Secundus.
  • Bộ chứa lưu trữ trên đám mây ($SECUNDUS_RESULT_STORAGE_BUCKET) để lưu trữ kết quả thực thi khối lượng công việc học máy của Secundus.

Một số hình ảnh mẫu có sẵn 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ụ 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 Secundus. VM chạy khối lượng công việc ML sẽ dùng tài khoản dịch vụ này.

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

Chỉ những tải đáp ứng các điều kiện thuộc tính bắt buộc mới có thể truy cập vào mô hình học máy được lưu trữ trong vùng lưu trữ của Primus. 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 đâ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ể tìm thấy toàn bộ mã của 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 đâ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 bằng tên tài nguyên bắt buộc.
  • Tạo khối lượng công việc ML và tạo Dockerfile để tạo một hình ảnh Docker cho 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_SERVICEACCOUNT quyề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 khối lượng công việc từ Artifact Registry.
./create_workload.sh

Ngoài ra, bạn có thể mã hoá các 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. Lợi ích của các bước kiểm tra bổ sung như vậy là đảm bảo tính toàn vẹn của mô hình học máy. Với cách này, trình điều khiển tải cũng cần cập nhật hình ảnh tải hoặc các thông số của hình ảnh đó khi tải dự kiến sẽ sử dụng các phiên bản khác nhau 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 khối lượng công việc

Primus muốn cho phép các tải 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 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 của 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 tải. Tính năng này 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 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ụ Secundus $WORKLOAD_SERVICE_ACCOUNT.
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 VM Confidential Space. 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 tải được truyền bằng cách sử dụ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 khối lượng công việc hoàn tất thành công, kết quả của khối lượng công việc ML sẽ được xuất bản lên $SECUNDUS_RESULT_STORAGE_BUCKET.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/result

Sau đâ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 một vùng lưu trữ Secundus, bạn sẽ thấy một mục trong kết quả. Mục nhập này sẽ bao gồm 2 thông tin chính:

  • Chỉ mục của predicted_class: Đây là chỉ mục bằng số, đại diện cho lớp mà mô hình dự đoán hình ảnh thuộc về.
  • Top_k_predictions: Tham số này cung cấp tối đa k dự đoán cho hình ảnh, được xếp hạng từ khả năng cao nhất đến thấp 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ã tải để nhận được nhiều hoặc ít dự đoán hơn.

Để dịch chỉ mục lớp thành tên lớp mà con người có thể đọ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 ta đã minh hoạ rằng một mô hình thuộc sở hữu của Primus chỉ được phát hành cho tải chạy trong TEE. Secundus chạy tải học máy trong một TEE (Môi trường thực thi đáng tin cậy) và tải 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 tải bằng cách kéo một hình ảnh tải khác từ kho lưu trữ tạo tác của riêng nó mà Primus không uỷ quyền. Nhóm danh tính tải của Primus chỉ cho phép hình ảnh ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG Workload.

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, thì thao tác sẽ không thành công. Để xem lỗi, hãy xoá tệp kết quả ban đầu và phiên bản máy ảo, sau đó thử chạy lại tải.

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

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

  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á phiên bản VM bảo mật.
gcloud compute instances delete ${WORKLOAD_VM} --zone=${SECUNDUS_PROJECT_ZONE}

Chạy tải 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

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

  • Bộ chứa lưu trữ đầ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 Workload Identity Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Tài khoản dịch vụ tải của Secundus ($WORKLOAD_SERVICEACCOUNT).
  • Bộ chứa lưu trữ đầu vào của Secundus ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • Các phiên bản điện toán của khối lượng công việc.
  • Bộ chứa 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 việc xoá dự án.

Tiếp theo là gì?

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