Lớp học lập trình về hình ảnh vùng chứa đã ký

1. Tổng quan

Lớp học lập trình này dựa trên lớp học lập trình Confidential Space. Hỗ trợ hình ảnh vùng chứa đã ký, cho phép xác thực vùng chứa bằng khoá công khai được chứng thực thay vì chỉ định thuật toán băm hình ảnh trong chính sách Workload Identity Pool (WIP).

Những thay đổi đối với tính năng hỗ trợ hình ảnh vùng chứa đã ký trong Không gian bảo mật:

Cải thiện khả năng sử dụng: Với việc ra mắt tính năng hình ảnh vùng chứa đã ký, giờ đây, chúng ta có thể chuyển từ phương pháp tóm tắt hình ảnh tải sang phương pháp chữ ký vùng chứa để cộng tác viên/kiểm toán viên uỷ quyền cho hình ảnh.

  • Khi sử dụng trực tiếp các mã nhận dạng hình ảnh, chủ sở hữu tài nguyên phải cập nhật chính sách của họ bằng mã nhận dạng hình ảnh mỗi khi họ uỷ quyền cho một hình ảnh mới. Bằng cách sử dụng chữ ký hình ảnh, chính sách này chứa một dấu vân tay khoá công khai. Khoá riêng tư tương ứng thuộc về cộng tác viên/kiểm toán viên và được dùng để ký các hình ảnh được kiểm toán.
  • Đối với một số mô hình bảo mật, việc tham chiếu một khoá ký hình ảnh đáng tin cậy sẽ thuận tiện hơn so với việc cập nhật danh sách các giá trị mới của hàm băm hình ảnh.

Không có sự suy giảm về bảo mật: Phương pháp ký vùng chứa này sẽ không làm giảm mức độ bảo mật so với phương pháp trước đó về thuật toán băm hình ảnh vì ranh giới tin cậy vẫn giữ nguyên. Trong phương pháp chữ ký vùng chứa, chủ sở hữu tài nguyên sẽ uỷ quyền cho một khoá xác minh bằng cách chỉ định dấu vân tay khoá công khai đáng tin cậy trong chính sách WIP, đồng thời Dịch vụ xác minh chứng thực và WIP sẽ thực hiện quy trình kiểm tra uỷ quyền; Dịch vụ xác minh chứng thực sẽ xác minh chữ ký được liên kết với tải công việc đang chạy và chính sách WIP sẽ kiểm tra để đảm bảo khoá công khai do dịch vụ xác nhận được chính sách uỷ quyền.

Bảo mật mạnh mẽ: Việc sử dụng chữ ký hình ảnh vùng chứa cho phép người dùng uỷ quyền một mức độ tin cậy nhất định cho người ký hình ảnh. Bằng cách chỉ định dấu vân tay khoá công khai của người ký đáng tin cậy trong chính sách chứng thực, chủ sở hữu tài nguyên cho phép người ký đó đưa ra thông tin xác nhận về những hình ảnh vùng chứa đáp ứng một chính sách. Attestation Verifier Service xác minh rằng chữ ký được liên kết với tải công việc đang chạy và chính sách kiểm tra để đảm bảo rằng khoá công khai đã tạo chữ ký được chính sách cho phép. Thông qua đó, lớp gián tiếp bổ sung mà tính năng ký hình ảnh cung cấp sẽ duy trì các đảm bảo bảo mật mạnh mẽ của Không gian bảo mật.

Điểm khác biệt duy nhất giữa các phương pháp này là phương pháp sau sử dụng thêm một lớp gián tiếp, trong đó hình ảnh tải được uỷ quyền bằng khoá ký. Điều này không gây ra bất kỳ lỗ hổng bảo mật mới nào vì ranh giới tin cậy vẫn giữ nguyên.

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

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng chữ ký hình ảnh vùng chứa để cho phép truy cập vào các tài nguyên được bảo vệ:

  • Cách ký một hình ảnh vùng chứa đã được kiểm tra bằng cosign
  • Cách tải chữ ký hình ảnh vùng chứa lên các sổ đăng ký OCI để khám phá và lưu trữ chữ ký
  • Cách định cấu hình các tài nguyên đám mây cần thiết để chạy Confidential Space
  • Cách chạy khối lượng công việc trong một Confidential Space có hỗ trợ hình ảnh vùng chứa đã ký

Lớp học lập trình này hướng dẫn bạn cách sử dụng Không gian bảo mật để chứng thực từ xa cho một hình ảnh vùng chứa được ký bằng một khoá đáng tin cậy chạy trên Google Compute Engine.

Bạn cần có

Các vai trò liên quan đến Không gian bảo mật có Hình ảnh vùng chứa đã ký

Trong lớp học lập trình này, Primus Bank sẽ là đơn vị kiểm toán và chủ sở hữu tài nguyên, chịu trách nhiệm về những việc sau:

  1. Thiết lập các tài nguyên bắt buộc bằng dữ liệu mẫu.
  2. Kiểm tra mã của khối lượng công việc.
  3. Sử dụng cosign để ký hình ảnh tải.
  4. Tải chữ ký lên một kho lưu trữ.
  5. Định cấu hình chính sách WIP để bảo vệ dữ liệu khách hàng.

Secundus Bank sẽ là tác giả và đơn vị vận hành của khối lượng công việc, đồng thời chịu trách nhiệm về:

  1. Thiết lập các tài nguyên bắt buộc để lưu trữ kết quả.
  2. Viết mã tải.
  3. Xuất bản hình ảnh tải.
  4. Chạy khối lượng công việc trong Confidential Space với sự hỗ trợ cho hình ảnh vùng chứa đã ký.

Ngân hàng Secundus sẽ phát triển và xuất bản một khối lượng công việc để truy vấn dữ liệu khách hàng do Ngân hàng Primus sở hữu và lưu trữ trong một bộ chứa bộ nhớ trên đám mây. Ngân hàng Primus sẽ kiểm tra khối lượng công việc, ký hình ảnh vùng chứa và định cấu hình các chính sách WIP để cho phép các khối lượng công việc đã được phê duyệt truy cập vào dữ liệu của họ. Kết quả của quá trình thực thi khối lượng công việc này sẽ được lưu trữ trong một bộ nhớ trên đám mây thuộc sở hữu của ngân hàng Secundus.

Các tài nguyên liên quan đến việc thiết lập Không gian bảo mật

Lớp học lập trình này tham chiếu đến một số biến mà bạn nên đặt thành các giá trị thích hợp cho dự án GCP của mình. Các lệnh trong lớp học lập trình này giả định rằng bạn đã đặt các biến này. (ví dụ: bạn có thể dùng export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' để đặt tên cho bộ chứa lưu trữ đầu vào của ngân hàng Primus.) Nếu chưa đặt các biến của tên tài nguyên, thì tên tài nguyên sẽ được tạo dựa trên mã dự án GCP.

Định cấu hình những nội dung sau trong dự án Primus:

  • $PRIMUS_INPUT_STORAGE_BUCKET: vùng lưu trữ chứa tệp dữ liệu khách hàng.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: Nhóm Workload Identity (WIP) xác thực các yêu cầu.
  • $PRIMUS_WIP_PROVIDER: nhà cung cấp Workload Identity Pool (WIP) bao gồm điều kiện uỷ quyền để sử dụng cho mã thông báo do Attestation Verifier Service (Dịch vụ xác minh chứng thực) ký.
  • $PRIMUS_SERVICEACCOUNT: tài khoản dịch vụ mà $PRIMUS_WORKLOAD_IDENTITY_POOL dùng để truy cập vào các tài nguyên được bảo vệ. Ở bước này, ứng dụng có quyền xem dữ liệu khách hàng được lưu trữ trong vùng chứa $PRIMUS_INPUT_STORAGE_BUCKET.
  • $PRIMUS_ENC_KEY: khoá KMS dùng để mã hoá dữ liệu được lưu trữ trong $PRIMUS_INPUT_STORAGE_BUCKET.

Tài nguyên mới trong lớp học lập trình này:

  • $PRIMUS_COSIGN_REPOSITORY: Artifact Registry để lưu trữ chữ ký hình ảnh của tải.
  • $PRIMUS_SIGNING_KEY: khoá KMS được kiểm toán viên/người cộng tác dữ liệu dùng để ký hình ảnh tải.

Định cấu hình những mục sau trong dự án Secundus:

  • $SECUNDUS_ARTIFACT_REGISTRY: kho lưu trữ cấu phần phần mềm nơi hình ảnh Docker của tải sẽ được chuyển.
  • $WORKLOAD_IMAGE_NAME: tên của hình ảnh docker về khối lượng công việc.
  • $WORKLOAD_IMAGE_TAG: thẻ của hình ảnh Docker về khối lượng công việc.
  • $WORKLOAD_SERVICEACCOUNT: tài khoản dịch vụ có quyền truy cập vào VM bảo mật chạy tải.
  • $SECUNDUS_RESULT_BUCKET: vùng lưu trữ kết quả của khối lượng công việc.

Tài nguyên Khác:

  • primus_customer_list.csv chứa dữ liệu khách hàng. Chúng ta sẽ tải dữ liệu này lên $PRIMUS_INPUT_STORAGE_BUCKET và tạo một khối lượng công việc sẽ truy vấn dữ liệu này.

Quy trình làm việc hiện có

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ột mã truy cập chung của Google cho $PRIMUS_SERVICEACCOUNT từ WIP. 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 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ã 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 dữ liệu khách hàng trong nhóm $PRIMUS_INPUT_STORAGE_BUCKET.
  4. Tải thực hiện một thao tác trên dữ liệu đó.
  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.

Quy trình mới có hỗ trợ vùng chứa đã ký

Tính năng hỗ trợ vùng chứa đã ký sẽ được tích hợp vào quy trình hiện có, như minh hoạ bên dưới. Khi bạn chạy khối lượng công việc trong Confidential Space có hỗ trợ hình ảnh vùng chứa đã ký, 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. Confidential Space phát hiện mọi chữ ký vùng chứa liên quan đến hình ảnh tải đang chạy hiện tại và gửi các chữ ký này đến trình xác minh chứng thực. Trình xác minh chứng thực sẽ xác minh chữ ký và đưa mọi chữ ký hợp lệ vào các tuyên bố chứng thực.
  2. Tải yêu cầu một mã truy cập chung của Google cho $PRIMUS_SERVICEACCOUNT từ WIP. 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.
  3. Nếu các khai báo chữ ký vùng chứa 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ã này sẽ trả về mã truy cập cho $PRIMUS_SERVICEACCOUNT.
  4. 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 dữ liệu khách hàng trong vùng chứa $PRIMUS_INPUT_STORAGE_BUCKET.
  5. Tải thực hiện một thao tác trên dữ liệu đó.
  6. Tải sử dụng $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

Trong quá trình thiết lập Confidential Space, trước tiên, bạn sẽ tạo các tài nguyên đám mây cần thiết trong các dự án GCP của ngân hàng Primus và Secundus. Sau đây là những tài nguyên mới trong lớp học lập trình này:

Trong dự án Primus:

  • Khoá ký KMS được dùng để ký các tải Secundus, sau khi kiểm tra mã.
  • Kho lưu trữ Artifact Registry để lưu trữ chữ ký Cosign.

Không có tài nguyên mới nào trong dự án Secundus. Sau khi thiết lập các tài nguyên này, 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 cần thiết. Sau đó, bạn sẽ tạo một hình ảnh khối lượng công việc và đơn vị kiểm toán (ngân hàng Primus) sẽ ký hình ảnh khối lượng công việc đó. Sau đó, khối lượng công việc sẽ được các cộng tác viên dữ liệu (ngân hàng Primus trong lớp học lập trình này) uỷ quyền và người vận hành khối lượng công việc (Ngân hàng Secundus trong trường hợp này) sẽ chạy khối lượng công việc.

Trong quá trình thiết lập Confidential Space, bạn sẽ tạo các tài nguyên đám mây cần thiết trong các dự án Primus và Secundus GCP.

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
  • Thay đổi thư mục cho lớp học lập trình này.
cd confidential-space/codelabs/signed_container_codelab/scripts
  • Đảm bảo bạn đã thiết lập các dự án bắt buộc như minh hoạ bên dưới.
export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
  • Đặt các biến cho tên tài nguyên đã đề cập ở trên bằng lệnh này. Bạn có thể ghi đè tên tài nguyên bằng các biến này (ví dụ: export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')
  • 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 ngân hàng 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 ngân hàng Primus. Chạy tập lệnh sau đây để thiết lập tài nguyên cho ngân hàng Primus. Trong các bước này, các tài nguyên được đề cập dưới đây sẽ được tạo:

  • Bộ chứa bộ nhớ trên đám mây ($PRIMUS_INPUT_STORAGE_BUCKET) để lưu trữ tệp dữ liệu khách hàng đã mã hoá của ngân hàng Primus.
  • Khoá mã hoá ($PRIMUS_ENC_KEY) và khoá ($PRIMUS_ENC_KEYRING) trong KMS để mã hoá tệp dữ liệu của ngân hàng Primus.
  • Nhóm danh tính tải ($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.
  • Tài khoản dịch vụ ($PRIMUS_SERVICEACCOUNT) được đính kèm vào nhóm danh tính tải ($PRIMUS_WORKLOAD_IDENTITY_POOL) được đề cập ở trên với quyền truy cập IAM sau đây:
  • roles/cloudkms.cryptoKeyDecrypter để giải mã dữ liệu bằng khoá KMS.
  • objectViewer để đọc dữ liệu từ bộ nhớ trên đám mây.
  • roles/iam.workloadIdentityUser để kết nối tài khoản dịch vụ này với nhóm danh tính tải.
./setup_primus_bank_resources.sh

Thiết lập tài nguyên ngân hàng 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 ngân hàng Secundus. Chạy tập lệnh sau đây để thiết lập tài nguyên cho ngân hàng Secundus. Trong các bước này, các tài nguyên được đề cập dưới đây sẽ được tạo:

  • Bộ chứa bộ nhớ 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 của ngân hàng Secundus.
./setup_secundus_bank_resources.sh

3. Tạo và ký 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 ngân hàng Secundus. VM chạy khối lượng công việc 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 $PRIMUS_INPUT_STORAGE_BUCKET.
  • objectAdmin để 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_serviceaccount.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 được dùng trong Lớp học lập trình này là một ứng dụng Go đơn giản dựa trên CLI, có chức năng đếm số lượng khách hàng (từ dữ liệu khách hàng của ngân hàng Primus) tại một vị trí địa lý được cung cấp trong đối số. 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($SECUNDUS_ARTIFACT_REGISTRY) do ngân hàng Secundus sở hữu.
  • Cập nhật mã tải bằng tên tài nguyên bắt buộc. Tại đây là mã tải được dùng cho lớp học lập trình này.
  • Tạo tệp nhị phân Go và tạo Dockerfile để tạo một hình ảnh Docker của mã tải. Đâ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 ($SECUNDUS_ARTIFACT_REGISTRY) do ngân hàng Secundus sở hữu.
  • Cấp cho $WORKLOAD_SERVICEACCOUNT quyền đọc đối với $SECUNDUS_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

Ký đơn vị công việc

Chúng ta sẽ sử dụng Cosign để ký hình ảnh tải. Theo mặc định, Cosign sẽ lưu trữ chữ ký trong cùng một kho lưu trữ với hình ảnh mà nó đang ký. Để chỉ định một kho lưu trữ khác cho chữ ký, bạn có thể đặt biến môi trường COSIGN_REPOSITORY.

Trong ví dụ này, chúng ta sẽ sử dụng Artifact Registry. Bạn cũng có thể chọn các sổ đăng ký dựa trên OCI khác, chẳng hạn như Docker Hub, AWS CodeArtifact tuỳ theo lựa chọn ưu tiên của mình.

  1. Tạo một kho lưu trữ docker Artifact Registry.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=${PRIMUS_PROJECT_REPOSITORY_REGION}
  1. Tạo một bộ khoá và khoá trong KMS để ký một hình ảnh tải.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=${PRIMUS_PROJECT_LOCATION}
gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256 \
  --location=${PRIMUS_PROJECT_LOCATION}
  1. Đối với Artifact Registry, bạn cần có tên đầy đủ của hình ảnh, chẳng hạn như $LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME. Bạn có thể tải mọi hình ảnh vùng chứa lên kho lưu trữ để lưu trữ chữ ký.
export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
  1. Cấp vai trò Người xem trên kho lưu trữ $PRIMUS_COSIGN_REPOSITORY cho tài khoản dịch vụ $WORKLOAD_SERVICEACCOUNT. Nhờ đó, Confidential Space có thể phát hiện mọi chữ ký hình ảnh vùng chứa được tải lên $PRIMUS_COSIGN_REPOSITORY.
gcloud artifacts repositories add-iam-policy-binding ${PRIMUS_COSIGN_REPOSITORY} \
--project=${PRIMUS_PROJECT_ID} --role='roles/viewer' --location=us \
--member="serviceAccount:${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com"

Cosign là một công cụ mạnh mẽ có nhiều tính năng ký. Đối với trường hợp sử dụng của chúng tôi, chúng tôi chỉ yêu cầu Cosign ký bằng một cặp khoá. Tính năng ký không dùng khoá Cosign không được hỗ trợ cho tính năng hình ảnh vùng chứa đã ký này.

Khi ký bằng một cặp khoá, bạn có hai lựa chọn:

  1. Ký bằng một cặp khoá cục bộ do Cosign tạo.
  2. Ký bằng một cặp khoá được lưu trữ ở nơi khác (ví dụ: trong KMS).
  1. Tạo một cặp khoá trong Cosign nếu bạn chưa có. Hãy tham khảo phần ký bằng khoá tự quản lý để biết thêm thông tin chi tiết. Ở đây, chúng tôi đã chỉ định cả hai cách (cục bộ và sử dụng nhà cung cấp KMS) để tạo cặp khoá và ký khối lượng công việc. Vui lòng làm theo một trong những cách này để ký vùng chứa khối lượng công việc.
// Set Application Default Credentials.
gcloud auth application-default login 
// Generate keys using a KMS provider.
cosign generate-key-pair --kms <provider>://<key>
// Generate keys using Cosign.
cosign generate-key-pair

Trong phần trên, hãy thay thế <provider>://<key> bằng gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION

  • <provider> : Đề cập đến giải pháp KMS mà bạn đang sử dụng
  • <key> : Chỉ đường dẫn khoá trong KMS
  1. Truy xuất khoá công khai để xác minh.
// For KMS providers.
cosign public-key --key <some provider>://<some key> > pub.pem

// For local key pair signing.
cosign public-key --key cosign.key > pub.pem
  1. Ký khối lượng công việc bằng Cosign. Thực hiện mã hoá base64 không có khoảng đệm trên khoá công khai
PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
  1. Ký khối lượng công việc bằng Cosign với khoá công khai đã xuất và các thuật toán chữ ký được đính kèm.
IMAGE_REFERENCE=us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/$SECUNDUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
// Sign with KMS support.
cosign sign --key <some provider>://<some key> $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
// Sign with a local key pair.
cosign sign --key cosign.key $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
  • --key [BẮT BUỘC] chỉ định khoá ký cần dùng. Khi đề cập đến khoá do nhà cung cấp KMS quản lý, vui lòng tuân theo định dạng URI cụ thể trong phần Hỗ trợ KMS của Sigstore. Khi tham chiếu đến khoá do Cosign tạo, hãy sử dụng cosign.key.
  • $IMAGE_REFERENCE [BẮT BUỘC] chỉ định hình ảnh vùng chứa cần ký. Bạn có thể xác định định dạng của IMAGE_REFERENCE bằng thẻ hoặc mã nhận dạng hình ảnh. Ví dụ: us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container:latest or us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container[IMAGE-digest]
  • -a [REQUIRED] chỉ định chú thích được đính kèm vào tải trọng chữ ký. Đối với hình ảnh vùng chứa đã ký của Confidential Space, bạn phải đính kèm khoá công khai và thuật toán chữ ký vào tải trọng chữ ký.
  • dev.cosignproject.cosign/sigalg ONLY chấp nhận 3 giá trị:
  • RSASSA_PSS_SHA256: Thuật toán RSASSA có khoảng đệm PSS với thông báo SHA256.
  • RSASSA_PKCS1V15_SHA256: Thuật toán RSASSA có khoảng đệm PKCS#1 phiên bản 1.5 với thông báo SHA256.
  • ECDSA_P256_SHA256: ECDSA trên đường cong P-256 với thông báo SHA256. Đây cũng là thuật toán chữ ký mặc định cho các cặp khoá do Cosign tạo.
  1. Tải chữ ký lên kho lưu trữ Docker

Cosign sign sẽ tự động tải chữ ký lên COSIGN_REPOSITORY. mà bạn chỉ định

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

Trong bước này, chúng ta sẽ thiết lập nhà cung cấp dịch vụ danh tính tải trong nhóm danh tính tải ($PRIMUS_WORKLOAD_IDENTITY_POOL). Có các điều kiện thuộc tính được định cấu hình cho danh tính tải như minh hoạ bên dưới. Một trong các điều kiện là xác thực dấu vân tay của chữ ký hình ảnh tải đối với dấu vân tay của khoá công khai ký. Với điều kiện thuộc tính này, khi Secundus Bank phát hành một hình ảnh tải mới, Primus Bank sẽ kiểm tra mã tải và ký hình ảnh tải mới mà không cần cập nhật chính sách WIP bằng bản tóm tắt hình ảnh.

gcloud config set project $PRIMUS_PROJECT_ID
PUBLIC_KEY_FINGERPRINT=$(openssl pkey -pubin -in pub.pem -outform DER | openssl sha256 | cut -d' ' -f2)
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
     && '${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com' in
     assertion.google_service_accounts
     && ['ECDSA_P256_SHA256:${PUBLIC_KEY_FINGERPRINT}']
       .exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig,sig.signature_algorithm+':'+sig.key_id))"

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

Trong bước này, chúng ta sẽ chạy tải công việc trên VM 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 tải được truyền bằng cách sử dụng phần "tee-cmd" của cờ. Khối lượng công việc được mã hoá để xuất bản kết quả của nó lên $SECUNDUS_RESULT_STORAGE_BUCKET.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --project=${SECUNDUS_PROJECT_ID} \
 --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}/${SECUNDUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]"~tee-signed-image-repos=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo"

Xem kết quả

Trong dự án Secundus, hãy xem kết quả của khối lượng công việc.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

Kết quả phải là 3, vì đây là số người ở Seattle có trong tệp primus_customer_list.csv!

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 ngân hàng Primus ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Tài khoản dịch vụ của ngân hàng Primus ($PRIMUS_SERVICEACCOUNT).
  • Sổ đăng ký cấu phần phần mềm của Primus Bank lưu giữ chữ ký hình ảnh ($PRIMUS_COSIGN_REPOSITORY).
  • Nhóm Workload Identity của Primus Bank ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Tài khoản dịch vụ tải của Secundus Bank ($WORKLOAD_SERVICEACCOUNT).
  • Phiên bản điện toán của tải.
  • Nhóm lưu trữ kết quả của Ngân hàng Secundus ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • Sổ đăng ký cấu phần phần mềm của Ngân hàng Secundus ($SECUNDUS_ARTIFACT_REGISTRY).
  • Máy ảo khối lượng công việc của Ngân hàng Secundus ($WORKLOAD_VM).
./cleanup.sh

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

Xin chúc mừng

Xin chúc mừng, bạn đã hoàn tất thành công lớp học lập trình này!

Bạn đã tìm hiểu cách tận dụng tính năng hình ảnh vùng chứa đã ký để cải thiện khả năng sử dụng của Confidential Space.

Tiếp theo là gì?

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

Tài liệu đọc thêm