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 được xây dựng dựa trên lớp học lập trình về Không gian bí mật. Hỗ trợ hình ảnh vùng chứa đã ký cung cấp tuỳ chọn xác thực vùng chứa bằng cách sử dụng khoá công khai đã được chứng thực thay vì chỉ định chuỗi đại diện hình ảnh trong chính sách Nhóm Workload Identity (WIP).

Những thay đổi liên quan đến 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 hữu dụng: Nhờ sự ra mắt của tính năng hình ảnh vùng chứa đã ký, giờ đây, chúng tôi có thể chuyển từ cách tiếp cận chuỗi đại diện hình ảnh khối lượng công việc sang phương pháp sử dụng chữ ký vùng chứa để cộng tác viên/kiểm thử viên uỷ quyền cho hình ảnh.

  • Khi trực tiếp sử dụng chuỗi đại diện hình ảnh, chủ sở hữu tài nguyên phải cập nhật chính sách bằng chuỗi đại diện hình ảnh mỗi khi cấp quyền truy cập vào một hình ảnh mới. Bằng cách sử dụng chữ ký hình ảnh, chính sách chứa một vân tay khoá công khai. Tệp này có khoá riêng tư tương ứng thuộc sở hữu của cộng tác viên/người kiểm tra và được dùng để ký hình ảnh đã kiểm tra.
  • Đối với một số mô hình bảo mật, việc tham chiếu 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ị chuỗi đại diện hình ảnh mới.

Không hồi quy độ bảo mật: Phương pháp chữ ký vùng chứa này sẽ không gây ra sự hồi quy bảo mật so với phương pháp thông báo hình ảnh trước đó vì ranh giới tin cậy không thay đổi. Trong phương thức ký vùng chứa, chủ sở hữu tài nguyên cho phép khoá xác minh bằng cách chỉ định vân tay số của khoá công khai đáng tin cậy trong chính sách WIP. 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ụ Người xác minh chứng thực xác minh chữ ký được liên kết với khối lượng công việc đang chạy và chính sách WIP sẽ kiểm tra xem khoá công khai mà dịch vụ xác nhận có được chính sách uỷ quyền hay không.

Bảo mật mạnh mẽ: Việc sử dụng chữ ký hình ảnh trong vùng chứa cho phép người dùng uỷ thác một mức độ tin cậy nào đó cho trình ký hình ảnh. Bằng việc chỉ định vân tay số của khoá công khai của một 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ý đó xác nhận những hình ảnh vùng chứa đáp ứng chính sách. Dịch vụ Người xác minh chứng thực xác minh chữ ký được liên kết với khối lượng công việc đang chạy và chính sách này sẽ kiểm tra để đảm bảo rằng khoá công khai tạo ra chữ ký được cấp phép theo chính sách. Thông qua đó, tính năng ký hình ảnh cung cấp thêm lớp gián tiếp giúp duy trì sự đảm bảo bảo mật mạnh mẽ của Không gian mật.

Sự khác biệt duy nhất giữa các phương pháp này là phương pháp thứ hai sử dụng một lớp gián tiếp bổ sung, trong đó hình ảnh khối lượng công việc được cho phép bằng khoá ký. Điều này không tạo 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ý hình ảnh vùng chứa đã được kiểm tra bằng cosign
  • Cách tải chữ ký hình ảnh trong vùng chứa lên hệ thống đăng ký của OCI để tìm và lưu trữ chữ ký
  • Cách định cấu hình các tài nguyên cần thiết trên đám mây để chạy Không gian bảo mật
  • Cách chạy khối lượng công việc trong Không gian bảo mật với sự hỗ trợ hình ảnh vùng chứa đã ký

Lớp học lập trình này cho bạn biết cách sử dụng Không gian bảo mật để chứng thực từ xa 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 trong Không gian bí 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 tra và chủ sở hữu tài nguyên, đơn vị này sẽ chịu trách nhiệm về những việc sau:

  1. Đang 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ã khối lượng công việc.
  3. Dùng cosign để ký hình ảnh khối lượng công việc.
  4. Tải chữ ký lên 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à người điều hành khối lượng công việc, đồng thời chịu trách nhiệm:

  1. Đang thiết lập các tài nguyên bắt buộc để lưu trữ kết quả.
  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. Chạy khối lượng công việc trong Không gian bảo mật nhờ tính năng hỗ trợ 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 sẽ truy vấn dữ liệu khách hàng được lưu trữ trong bộ chứa lưu trữ trên đám mây và thuộc sở hữu của Primus Bank. Primus Bank sẽ kiểm tra khối lượng công việc, ký hình ảnh vùng chứa và thiết lập 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ộ chứa lưu trữ trên đám mây thuộc sở hữu của ngân hàng Secundus.

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 các biến này đã được đặt. (ví dụ: có thể sử 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 bạn chưa đặt các biến của tên tài nguyên, thì biến đó sẽ được tạo dựa trên mã dự án GCP.

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

  • $PRIMUS_INPUT_STORAGE_BUCKET: bộ chứa lưu trữ tệp dữ liệu khách hàng.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: Nhóm Workload Identity (WIP) xác thực các thông báo xác nhận quyền sở hữu.
  • $PRIMUS_WIP_PROVIDER: nhà cung cấp Nhóm Workload Identity bao gồm điều kiện uỷ quyền để dùng cho các mã thông báo do Dịch vụ người 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 bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET.
  • $PRIMUS_ENC_KEY: khoá KMS dùng để mã hoá dữ liệu lưu trữ trong $PRIMUS_INPUT_STORAGE_BUCKET.

Các tài nguyên mới dành cho 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 khối lượng công việc.
  • $PRIMUS_SIGNING_KEY: khoá KMS dùng để ký hình ảnh khối lượng công việc bởi kiểm tra viên/cộng tác viên dữ liệu (trong trường hợp này là ngân hàng ưu tiên).

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

  • $SECUNDUS_ARTIFACT_REGISTRY: sổ đăng ký cấu phần phần mềm nơi hình ảnh trình quản lý tải công việc sẽ được đẩy.
  • $WORKLOAD_IMAGE_NAME: tên của hình ảnh Docker tải công việc.
  • $WORKLOAD_IMAGE_TAG: thẻ của hình ảnh Docker tải công việc.
  • $WORKLOAD_SERVICEACCOUNT: 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.
  • $SECUNDUS_RESULT_BUCKET: bộ chứa 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 tại

Khi bạn chạy khối lượng công việc trong Không gian bảo mật, quá 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. Khối lượng công việc yêu cầu một mã truy cập chung của Google từ WIP đối với $PRIMUS_SERVICEACCOUNT. Dịch vụ này cung cấp mã dịch vụ Người xác minh chứng thực cùng với khối lượng công việc và các tuyên bố về môi trường.
  2. Nếu các tuyên bố đ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ã này sẽ trả về mã truy cập cho $PRIMUS_SERVICEACCOUNT.
  3. Khối lượng công việc này 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 dữ liệu khách hàng trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET.
  4. Khối lượng công việc thực hiện một thao tác trên dữ liệu đó.
  5. Khối lượng công việc này sử dụng tài khoản dịch vụ $WORKLOAD_SERVICEACCOUNT để ghi kết quả của toán tử đó vào bộ chứa $SECUNDUS_RESULT_STORAGE_BUCKET.

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

Hỗ trợ vùng chứa đã ký sẽ được tích hợp vào quy trình làm việc hiện tại, như được đánh dấu bên dưới. Khi bạn chạy khối lượng công việc trong Không gian bảo mật có sự hỗ trợ hình ảnh vùng chứa đã ký, quá 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. Bảo mật không gian sẽ phát hiện mọi chữ ký trong vùng chứa liên quan đến hình ảnh của khối lượng công việc đang chạy hiện tại rồi gửi các chữ ký này đến trình xác minh chứng thực. Người xác minh chứng thực sẽ xác minh chữ ký và có mọi chữ ký hợp lệ trong lời tuyên bố về việc chứng thực.
  2. Khối lượng công việc yêu cầu một mã truy cập chung của Google từ WIP đối với $PRIMUS_SERVICEACCOUNT. Dịch vụ này cung cấp mã dịch vụ Người xác minh chứng thực cùng với khối lượng công việc và các xác nhận quyền sở hữu về môi trường.
  3. Nếu chữ ký vùng chứa xác nhận quyền sở hữu trong mã 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ã sẽ trả về mã truy cập cho $PRIMUS_SERVICEACCOUNT.
  4. Khối lượng công việc này 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 dữ liệu khách hàng trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET.
  5. Khối lượng công việc thực hiện một thao tác trên dữ liệu đó.
  6. Khối lượng công việc sử dụng $WORKLOAD_SERVICEACCOUNT để ghi kết quả của toán tử đó vào bộ 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 Không gian bảo mật, trước tiên, bạn sẽ tạo các tài nguyên trên đám mây cần thiết trong các dự án GCP của Primus và Secundus Bank. Dưới đây là các tài nguyên mới dành cho lớp học lập trình này:

Trong dự án Primus:

  • Khoá ký KMS dùng để ký tải công việc Secundus sau khi kiểm tra mã.
  • Kho lưu trữ đăng ký cấu phần phần mềm để lưu trữ các chữ ký Cosign.

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

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

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
  • Hãy đảm bảo bạn đã thiết lập các dự án cần thiết như trình bày dưới đây.
$ export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
$ export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
  • Đặt biến cho tên tài nguyên nêu trên bằng lệnh này. Bạn có thể ghi đè tên tài nguyên bằng cách sử dụ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 tên biến còn lại thành các giá trị dựa trên mã dự án cho tên tài nguyên.
$ source config_env.sh
  • Cài đặt cosign theo hướng dẫn tại đây.

Thiết lập tài nguyên của 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 để thiết lập tài nguyên cho ngân hàng Primus. Trong các bước này, chúng tôi sẽ tạo các tài nguyên được đề cập bên dưới:

  • Bộ chứa Cloud Storage ($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à phương thức khoá ($PRIMUS_ENC_KEYRING) trong KMS để mã hoá tệp dữ liệu của ngân hàng Primus.
  • Nhóm Workload Identity ($PRIMUS_WORKLOAD_IDENTITY_POOL) để xác thực các thông báo xác nhận quyền sở hữu dựa trên điều kiện về thuộc tính được thiết lập theo nhà cung cấp.
  • Tài khoản dịch vụ ($PRIMUS_SERVICEACCOUNT) gắn liền với nhóm nhận dạng tải công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL) nêu trên có 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 trong bộ chứa Cloud Storage.
  • roles/iam.workloadIdentityUser để kết nối tài khoản dịch vụ này với nhóm nhận dạng của khối lượng công việc.
$ ./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 trên đám mây cần thiết cho ngân hàng Secundus. Chạy tập lệnh sau để thiết lập tài nguyên cho ngân hàng Secundus. Theo các bước dưới đây, chúng tôi sẽ tạo các tài nguyên được đề cập:

  • Bộ chứa Cloud Storage ($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ụ tải 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 cần thiết. Chạy tập lệnh sau để tạo tài khoản dịch vụ tải công việc trong dự án ngân hàng Secundus. Tài khoản dịch vụ này sẽ được sử dụng trên máy ảo chạy khối lượng công việc.

  • Tài khoản dịch vụ của tải 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 trong bộ chứa $PRIMUS_INPUT_STORAGE_BUCKET trên đám mây.
  • objectAdmin để ghi kết quả của khối lượng công việc vào bộ chứa $SECUNDUS_RESULT_STORAGE_BUCKET trên đám mây.
$ ./create_workload_serviceaccount.sh

Tạo khối lượng công việc

Trong bước này, bạn sẽ tạo một hình ảnh Docker tải công việc. 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ột ứng dụng Go đơn giản dựa trên giao diện dòng lệnh (CLI). Ứng dụng này sẽ đếm số lượng khách hàng (từ dữ liệu khách hàng của ngân hàng Primus) từ một vị trí địa lý được cung cấp trong đối số. Chạy tập lệnh sau để tạo khối lượng công việc đang thực hiện các bước sau đây:

  • Tạo Artifact Registry($SECUNDUS_ARTIFACT_REGISTRY) thuộc sở hữu của ngân hàng Secundus.
  • Cập nhật mã của khối lượng công việc bằng các tên tài nguyên cần thiết. Đây là mã khối lượng công việc dùng cho lớp học lập trình này.
  • Tạo tệp nhị phân Build Go và tạo Dockerfile để tạo hình ảnh Docker cho 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à 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 quyền đọc cho $WORKLOAD_SERVICEACCOUNT đối với $SECUNDUS_ARTIFACT_REGISTRY. Điều này là cần thiết để vùng chứa tải công việc lấy hình ảnh Docker của tải công việc từ Artifact Registry.
$ ./create_workload.sh

Ký khối lượng công việc

Chúng ta sẽ sử dụng Cosign để ký hình ảnh khối lượng công việc. Theo mặc định, Cosign sẽ lưu trữ các 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.

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

  1. Tạo kho lưu trữ Docker của Artifact Registry.
$ gcloud config set project $PRIMUS_PROJECT_ID

$ gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=us
  1. Tạo một chuỗi khoá và khoá trong KMS để ký hình ảnh khối lượng công việc.
$ gcloud config set project $PRIMUS_PROJECT_ID

$ gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=global

$ gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256
  --location=us
  1. Đối với Artifact Registry, cần có tên hình ảnh đầy đủ như $LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME. Bạn có thể tải bất kỳ hình ảnh vùng chứa nào 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. Điều này cho phép Không gian bảo mật 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 ta, chúng ta chỉ yêu cầu Cosign ký bằng một cặp khoá. Tính năng ký hình ảnh vùng chứa đã ký này không hỗ trợ tính năng ký không cần khoá Cosign.

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

  1. Ký bằng 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 bài viết ký bằng khoá tự quản lý để biết thêm thông tin.
// 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> với gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION

  • &lt;provider&gt; : Tham khảo giải pháp KMS mà bạn đang sử dụng
  • &lt;key&gt; : Tham chiếu đến đường dẫn chính 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ó đệ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 có đính kèm thuật toán chữ ký và khoá công khai đã xuất.
$ 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ý sẽ dùng. Khi tham chiếu đế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ợ của Sigstore KMS. 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 chuỗi đại diện 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 [BẮT BUỘC] chỉ định các chú giải đi kèm với tải trọng chữ ký. Đối với hình ảnh vùng chứa đã ký trong Không gian bảo mật, khoá công khai và thuật toán chữ ký phải được đính kèm vào tải trọng chữ ký.
  • dev.cosignproject.cosign/sigalg CHỈ chấp nhận 3 giá trị:
  • RSASSA_PSS_SHA256: Thuật toán RSASSA với khoảng đệm PSS với chuỗi đại diện SHA256.
  • RSASSA_PKCS1V15_SHA256: Thuật toán RSASSA với phần đệm PKCS#1 v1.5 với chuỗi đại diện SHA256.
  • ECDSA_P256_SHA256: ECDSA trên Đường cong P-256 với chuỗi đại diện 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

Ký tên đồng ý sẽ tự động tải chữ ký lên COSIGN_REPOSITORY được chỉ định.

4. Cho phép và chạy khối lượng công việc

Cho phép tải công việc

Trong bước này, chúng ta sẽ thiết lập nhà cung cấp danh tính cho tải công việc trong nhóm nhận dạng của tải công việc ($PRIMUS_WORKLOAD_IDENTITY_POOL). Có các điều kiện thuộc tính được định cấu hình cho thông tin nhận dạng của khối lượng công việc như trình bày dưới đây. Một trong những điều kiện là xác thực vân tay số của chữ ký hình ảnh của khối lượng công việc so với việc ký vân tay số của khoá công khai. Với điều kiện thuộc tính này, khi Secundus Bank phát hành hình ảnh khối lượng công việc mới, Primus Bank sẽ kiểm tra mã khối lượng công việc và ký hình ảnh khối lượng công việc mới mà không cần cập nhật chính sách WIP với chuỗi đại diện 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 tôi sẽ chạy khối lượng công việc trên máy ảo bảo mật. Các đối số TEE bắt buộc được truyền bằng cờ siêu dữ liệu. Truyền đối số cho vùng chứa khối lượng công việc bằng cách sử dụng "tee-cmd" của cờ. Khối lượng công việc được mã hoá để xuất bản kết quả lên $SECUNDUS_RESULT_STORAGE_BUCKET.

$ gcloud config set project $SECUNDUS_PROJECT_ID

$ gcloud compute instances create signed-container-vm \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=us-west1-b \
 --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ả sẽ là 3, vì đây là số người ở Seattle được liệt kê 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 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 nhận dạng khối lượng công việc của Primus Bank ($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Tài khoản dịch vụ tải công việc của Ngân hàng Secundus ($WORKLOAD_SERVICEACCOUNT).
  • Phiên bản điện toán Workload Compute.
  • Bộ chứa lưu trữ kết quả của Secundus Bank ($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).
// run the clean up script to delete the resources created as part of this codelab.
$ ./cleanup.sh

Nếu bạn đã khám phá xong, vui lòng xem xét xoá dự án của bạ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!

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 hữu dụng của Không gian bảo mật.

Tiếp theo là gì?

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

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