1. Giới thiệu
Uỷ quyền nhị phân là một biện pháp kiểm soát bảo mật tại thời điểm triển khai, đảm bảo rằng chỉ những hình ảnh vùng chứa đáng tin cậy mới được triển khai trên Google Kubernetes Engine (GKE) hoặc Cloud Run. Với Uỷ quyền nhị phân, bạn có thể yêu cầu các hình ảnh được ký bởi các cơ quan đáng tin cậy trong quá trình phát triển, sau đó thực thi quy trình xác thực chữ ký khi triển khai. Bằng cách thực thi quy trình xác thực, bạn có thể kiểm soát chặt chẽ hơn môi trường vùng chứa bằng cách đảm bảo chỉ những hình ảnh đã xác minh mới được tích hợp vào quy trình tạo và phát hành.
Sơ đồ sau đây cho thấy các thành phần trong chế độ thiết lập Uỷ quyền nhị phân/Cloud Build:
**Hình 1.**Quy trình Cloud Build tạo chứng thực Uỷ quyền nhị phân.
Trong quy trình này:
- Mã để tạo hình ảnh vùng chứa được chuyển đến một kho lưu trữ nguồn, chẳng hạn như Cloud Source Repositories.
- Một công cụ tích hợp liên tục (CI), Cloud Build sẽ tạo và kiểm thử vùng chứa.
- Quy trình tạo sẽ đẩy hình ảnh vùng chứa vào Container Registry hoặc một sổ đăng ký khác lưu trữ hình ảnh đã tạo.
- Cloud Key Management Service cung cấp dịch vụ quản lý khoá cho cặp khoá mã hoá, ký hình ảnh vùng chứa. Sau đó, chữ ký thu được sẽ được lưu trữ trong một chứng thực mới tạo.
- Tại thời điểm triển khai, chứng thực viên sẽ xác minh chứng thực bằng khoá công khai trong cặp khoá. Uỷ quyền nhị phân thực thi chính sách bằng cách yêu cầu chứng thực đã ký để triển khai hình ảnh vùng chứa.
Trong phòng thí nghiệm này, bạn sẽ tập trung vào các công cụ và kỹ thuật để bảo mật các cấu phần phần mềm đã triển khai. Phòng thí nghiệm này tập trung vào các cấu phần phần mềm (vùng chứa) sau khi chúng được tạo nhưng chưa được triển khai vào bất kỳ môi trường cụ thể nào.
Kiến thức bạn sẽ học được
- Ký hình ảnh
- Chính sách kiểm soát quyền truy cập
- Ký ảnh chụp
- Uỷ quyền cho Hình ảnh có chữ ký
- Hình ảnh chưa ký bị chặn
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.



- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
- Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Thiết lập môi trường
Trong Cloud Shell, hãy đặt mã dự án và số dự án cho dự án của bạn. Lưu các giá trị này dưới dạng biến PROJECT_ID và PROJECT_ID.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
Bật các dịch vụ
Bật tất cả các dịch vụ cần thiết:
gcloud services enable \
cloudkms.googleapis.com \
cloudbuild.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
artifactregistry.googleapis.com \
containerscanning.googleapis.com \
ondemandscanning.googleapis.com \
binaryauthorization.googleapis.com
Tạo kho lưu trữ Artifact Registry
Trong phòng thí nghiệm này, bạn sẽ sử dụng Artifact Registry để lưu trữ và quét hình ảnh. Tạo kho lưu trữ bằng lệnh sau.
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
Định cấu hình Docker để sử dụng thông tin đăng nhập gcloud khi truy cập vào Artifact Registry.
gcloud auth configure-docker us-central1-docker.pkg.dev
Tạo và chuyển sang thư mục công việc
mkdir vuln-scan && cd vuln-scan
Xác định hình ảnh mẫu
Tạo một tệp có tên là Dockerfile với nội dung sau.
cat > ./Dockerfile << EOF
from python:3.8-slim
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app
EOF
Tạo một tệp có tên là main.py với nội dung sau
cat > ./main.py << EOF
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "Worlds")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
Tạo và đẩy hình ảnh vào AR
Sử dụng Cloud Build để tạo và tự động chuyển vùng chứa của bạn sang Artifact Registry.
gcloud builds submit . -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
3. Ký hình ảnh
Attestor là gì
Bên chứng thực
- Người/quy trình này chịu trách nhiệm về một đường liên kết trong chuỗi tin cậy của hệ thống.
- Họ lưu giữ một khoá mã hoá và ký một hình ảnh nếu hình ảnh đó vượt qua quy trình phê duyệt của họ.
- Mặc dù Người tạo chính sách xác định chính sách theo cách trừu tượng và ở cấp cao, nhưng Người chứng thực có trách nhiệm thực thi một cách cụ thể một khía cạnh nào đó của chính sách.
- Có thể là người thật, chẳng hạn như người kiểm thử QA hoặc người quản lý, hoặc có thể là bot trong hệ thống CI.
- Tính bảo mật của hệ thống phụ thuộc vào độ tin cậy của các khoá này, vì vậy, điều quan trọng là bạn phải giữ an toàn cho khoá riêng tư của mình.
Mỗi vai trò này có thể đại diện cho một cá nhân hoặc một nhóm người trong tổ chức của bạn. Trong môi trường sản xuất, những vai trò này có thể sẽ được quản lý bằng các dự án riêng biệt trên Google Cloud Platform (GCP) và quyền truy cập vào tài nguyên sẽ được chia sẻ giữa các dự án đó theo cách hạn chế bằng cách sử dụng Cloud IAM.

Các chứng thực trong Uỷ quyền nhị phân được triển khai trên API Phân tích vùng chứa đám mây, vì vậy, bạn cần mô tả cách hoạt động của API này trước khi tiếp tục. Container Analysis API được thiết kế để cho phép bạn liên kết siêu dữ liệu với các hình ảnh vùng chứa cụ thể.
Ví dụ: bạn có thể tạo một Ghi chú để theo dõi lỗ hổng bảo mật Heartbleed. Sau đó, các nhà cung cấp dịch vụ bảo mật sẽ tạo trình quét để kiểm thử lỗ hổng bảo mật trong hình ảnh vùng chứa và tạo một Sự cố liên kết với từng vùng chứa bị xâm nhập.

Ngoài việc theo dõi các lỗ hổng bảo mật, Container Analysis còn được thiết kế để trở thành một API siêu dữ liệu chung. Binary Authorization sử dụng Container Analysis để liên kết chữ ký với các hình ảnh vùng chứa mà chúng đang xác minh. Ghi chú phân tích vùng chứa được dùng để biểu thị một trình chứng thực duy nhất, đồng thời các lần xuất hiện được tạo và liên kết với từng vùng chứa mà trình chứng thực đã phê duyệt.
Binary Authorization API sử dụng các khái niệm về "chứng thực viên" và "chứng thực", nhưng các khái niệm này được triển khai bằng cách sử dụng các Ghi chú và Sự kiện tương ứng trong Container Analysis API.

Tạo Ghi chú của người chứng thực
Ghi chú của người chứng thực chỉ là một phần nhỏ dữ liệu đóng vai trò là nhãn cho loại chữ ký đang được áp dụng. Ví dụ: một ghi chú có thể cho biết thông tin quét lỗ hổng bảo mật, trong khi một ghi chú khác có thể được dùng để phê duyệt QA. Ghi chú sẽ được tham chiếu trong quá trình ký.

Tạo ghi chú
cat > ./vulnz_note.json << EOM
{
"attestation": {
"hint": {
"human_readable_name": "Container Vulnerabilities attestation authority"
}
}
}
EOM
Lưu trữ ghi chú
NOTE_ID=vulnz_note
curl -vvv -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @./vulnz_note.json \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
Xác minh ghi chú
curl -vvv \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"
Ghi chú của bạn hiện đã được lưu trong Container Analysis API.
Tạo một Attestor
Các chứng thực viên được dùng để thực hiện quy trình ký hình ảnh thực tế và sẽ đính kèm một lần xuất hiện của ghi chú vào hình ảnh để xác minh sau này. Để sử dụng chứng thực viên, bạn cũng phải đăng ký ghi chú bằng Uỷ quyền nhị phân:

Tạo Attestor
ATTESTOR_ID=vulnz-attestor
gcloud container binauthz attestors create $ATTESTOR_ID \
--attestation-authority-note=$NOTE_ID \
--attestation-authority-note-project=${PROJECT_ID}
Xác minh Attestor
gcloud container binauthz attestors list
Lưu ý rằng dòng cuối cùng cho biết NUM_PUBLIC_KEYS: 0 bạn sẽ cung cấp các khoá ở bước sau
Ngoài ra, hãy lưu ý rằng Cloud Build sẽ tự động tạo chứng thực viên built-by-cloud-build trong dự án của bạn khi bạn chạy một bản dựng tạo ra hình ảnh. Vì vậy, lệnh trên sẽ trả về 2 chứng thực viên, vulnz-attestor và built-by-cloud-build. Sau khi tạo thành công các hình ảnh, Cloud Build sẽ tự động ký và tạo chứng thực cho các hình ảnh đó.
Thêm vai trò IAM
Tài khoản dịch vụ Uỷ quyền nhị phân sẽ cần có quyền xem các ghi chú chứng thực. Cung cấp quyền truy cập bằng lệnh gọi API sau
PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" --format="value(projectNumber)")
BINAUTHZ_SA_EMAIL="service-${PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
cat > ./iam_request.json << EOM
{
'resource': 'projects/${PROJECT_ID}/notes/${NOTE_ID}',
'policy': {
'bindings': [
{
'role': 'roles/containeranalysis.notes.occurrences.viewer',
'members': [
'serviceAccount:${BINAUTHZ_SA_EMAIL}'
]
}
]
}
}
EOM
Sử dụng tệp này để tạo Chính sách IAM
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @./iam_request.json \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"
Thêm khoá KMS
Trước khi bạn có thể sử dụng trình chứng thực này, cơ quan của bạn cần tạo một cặp khoá mã hoá có thể dùng để ký hình ảnh vùng chứa. Bạn có thể thực hiện việc này thông qua Google Cloud Key Management Service (KMS).
Trước tiên, hãy thêm một số biến môi trường để mô tả khoá mới
KEY_LOCATION=global
KEYRING=binauthz-keys
KEY_NAME=codelab-key
KEY_VERSION=1
Tạo một chuỗi khoá để lưu trữ một bộ khoá
gcloud kms keyrings create "${KEYRING}" --location="${KEY_LOCATION}"
Tạo một cặp khoá ký bất đối xứng mới cho người chứng thực
gcloud kms keys create "${KEY_NAME}" \
--keyring="${KEYRING}" --location="${KEY_LOCATION}" \
--purpose asymmetric-signing \
--default-algorithm="ec-sign-p256-sha256"
Bạn sẽ thấy khoá của mình xuất hiện trên trang KMS của Bảng điều khiển Google Cloud.
Giờ đây, hãy liên kết khoá với chứng thực viên thông qua lệnh gcloud binauthz:
gcloud beta container binauthz attestors public-keys add \
--attestor="${ATTESTOR_ID}" \
--keyversion-project="${PROJECT_ID}" \
--keyversion-location="${KEY_LOCATION}" \
--keyversion-keyring="${KEYRING}" \
--keyversion-key="${KEY_NAME}" \
--keyversion="${KEY_VERSION}"
Nếu in lại danh sách các cơ quan, bạn sẽ thấy một khoá đã đăng ký:
gcloud container binauthz attestors list
Tạo Chứng thực đã ký
Đến đây, bạn đã thiết lập các tính năng cho phép bạn ký hình ảnh. Sử dụng Attestor mà bạn đã tạo trước đó để ký Hình ảnh vùng chứa mà bạn đang làm việc.
Chứng thực phải có chữ ký mã hoá để cho biết người chứng thực đã xác minh một hình ảnh vùng chứa cụ thể và an toàn khi chạy trên cụm của bạn. Để chỉ định hình ảnh vùng chứa cần chứng thực, bạn cần xác định chuỗi đại diện của hình ảnh đó.
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:latest \
--format='get(image_summary.digest)')
Giờ đây, bạn có thể dùng gcloud để tạo chứng thực. Lệnh này chỉ cần lấy thông tin chi tiết về khoá mà bạn muốn dùng để ký và hình ảnh vùng chứa cụ thể mà bạn muốn phê duyệt
gcloud beta container binauthz attestations sign-and-create \
--artifact-url="${CONTAINER_PATH}@${DIGEST}" \
--attestor="${ATTESTOR_ID}" \
--attestor-project="${PROJECT_ID}" \
--keyversion-project="${PROJECT_ID}" \
--keyversion-location="${KEY_LOCATION}" \
--keyversion-keyring="${KEYRING}" \
--keyversion-key="${KEY_NAME}" \
--keyversion="${KEY_VERSION}"
Theo thuật ngữ Phân tích vùng chứa, thao tác này sẽ tạo một lần xuất hiện mới và đính kèm lần xuất hiện đó vào ghi chú của người chứng thực. Để đảm bảo mọi thứ hoạt động như dự kiến, bạn có thể liệt kê các chứng thực của mình
gcloud container binauthz attestations list \
--attestor=$ATTESTOR_ID --attestor-project=${PROJECT_ID}
4. Chính sách kiểm soát quyền truy cập
Binary Authorization là một tính năng trong GKE và Cloud Run, cho phép xác thực các quy tắc trước khi một hình ảnh vùng chứa được phép chạy. Quy trình xác thực sẽ thực thi trên mọi yêu cầu chạy hình ảnh, cho dù đó là từ một quy trình CI/CD đáng tin cậy hay người dùng đang cố gắng triển khai hình ảnh theo cách thủ công. Khả năng này giúp bạn bảo mật môi trường thời gian chạy hiệu quả hơn so với chỉ kiểm tra quy trình CI/CD.
Để hiểu rõ khả năng này, bạn sẽ sửa đổi chính sách GKE mặc định để thực thi một quy tắc uỷ quyền nghiêm ngặt.
Tạo cụm GKE
Tạo cụm GKE có bật tính năng uỷ quyền nhị phân:
gcloud beta container clusters create binauthz \
--zone us-central1-a \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
Cho phép Cloud Build triển khai vào cụm này:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/container.developer"
Chính sách cho phép tất cả
Trước tiên, hãy xác minh trạng thái chính sách mặc định và khả năng triển khai mọi hình ảnh
- Xem lại chính sách hiện hành
gcloud container binauthz policy export
- Lưu ý rằng chính sách thực thi được đặt thành
ALWAYS_ALLOW
evaluationMode: ALWAYS_ALLOW
- Triển khai Mẫu để xác minh rằng bạn có thể triển khai mọi thứ
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
- Xác minh rằng quá trình triển khai đã diễn ra thành công
kubectl get pods
Bạn sẽ thấy kết quả sau

- Xoá loại hình triển khai
kubectl delete pod hello-server
Chính sách từ chối tất cả
Bây giờ, hãy cập nhật chính sách để không cho phép tất cả hình ảnh.
- Xuất chính sách hiện tại sang một tệp có thể chỉnh sửa
gcloud container binauthz policy export > policy.yaml
- Thay đổi chính sách
Trong trình chỉnh sửa văn bản, hãy thay đổi evaluationMode từ ALWAYS_ALLOW thành ALWAYS_DENY.
edit policy.yaml
Tệp YAML chính sách sẽ có dạng như sau:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_DENY enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
Chính sách này tương đối đơn giản. Dòng globalPolicyEvaluationMode khai báo rằng chính sách này mở rộng chính sách chung do Google xác định. Theo mặc định, chế độ này cho phép tất cả các vùng chứa GKE chính thức chạy. Ngoài ra, chính sách này khai báo một defaultAdmissionRule cho biết rằng tất cả các pod khác sẽ bị từ chối. Quy tắc nhập học bao gồm một dòng enforcementMode, trong đó nêu rõ rằng tất cả các pod không tuân thủ quy tắc này sẽ bị chặn chạy trên cụm.
Để biết hướng dẫn về cách tạo các chính sách phức tạp hơn, hãy xem tài liệu về Uỷ quyền nhị phân.

- Mở Terminal, áp dụng chính sách mới và đợi vài giây để thay đổi có hiệu lực
gcloud container binauthz policy import policy.yaml
- Thử triển khai khối lượng công việc mẫu
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
- Quá trình triển khai không thành công và thông báo sau đây sẽ xuất hiện
Error from server (VIOLATES_POLICY): admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image gcr.io/google-samples/hello-app:1.0 denied by Binary Authorization default admission rule. Denied by always_deny admission rule
Huỷ bỏ chính sách để cho phép tất cả
Trước khi chuyển sang phần tiếp theo, hãy nhớ huỷ bỏ các thay đổi về chính sách
- Thay đổi chính sách
Trong trình chỉnh sửa văn bản, hãy thay đổi evaluationMode từ ALWAYS_DENY thành ALWAYS_ALLOW.
edit policy.yaml
Tệp YAML chính sách sẽ có dạng như sau:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_ALLOW enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
- Áp dụng chính sách đã được khôi phục
gcloud container binauthz policy import policy.yaml
5. Ký hình ảnh được quét
Bạn đã bật tính năng Ký hình ảnh và dùng Attestor theo cách thủ công để ký hình ảnh mẫu. Trong thực tế, bạn sẽ muốn áp dụng Chứng thực trong các quy trình tự động như quy trình CI/CD.
Trong phần này, bạn sẽ định cấu hình Cloud Build để Chứng thực hình ảnh một cách tự động
Vai trò
Thêm vai trò Người xem chứng thực uỷ quyền nhị phân vào Tài khoản dịch vụ Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/binaryauthorization.attestorsViewer
Thêm vai trò Trình ký/Trình xác minh Cloud KMS CryptoKey vào Tài khoản dịch vụ Cloud Build (Ký dựa trên KMS):
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/cloudkms.signerVerifier
Thêm vai trò Trình đính kèm ghi chú phân tích vùng chứa vào Tài khoản dịch vụ Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/containeranalysis.notes.attacher
Cấp quyền truy cập cho Tài khoản dịch vụ Cloud Build
Cloud Build sẽ cần có quyền truy cập vào API quét theo yêu cầu. Cấp quyền truy cập bằng các lệnh sau.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Chuẩn bị bước tạo bản dựng tuỳ chỉnh của Cloud Build
Bạn sẽ sử dụng bước Bản dựng tuỳ chỉnh trong Cloud Build để đơn giản hoá quy trình chứng thực. Google cung cấp bước Bản dựng tuỳ chỉnh này, trong đó có các hàm trợ giúp để đơn giản hoá quy trình. Trước khi sử dụng, mã cho bước tạo tuỳ chỉnh phải được tạo thành một vùng chứa và được chuyển đến Cloud Build. Để thực hiện việc này, hãy chạy các lệnh sau:
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
cd cloud-builders-community/binauthz-attestation
gcloud builds submit . --config cloudbuild.yaml
cd ../..
rm -rf cloud-builders-community
Thêm bước ký vào cloudbuild.yaml
Trong bước này, bạn sẽ thêm bước chứng thực vào quy trình Cloud Build.
- Xem lại bước ký bên dưới.
Chỉ xem xét. Không sao chép
#Sign the image only if the previous severity check passes
- id: 'create-attestation'
name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
args:
- '--artifact-url'
- 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image'
- '--attestor'
- 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
- '--keyversion'
- 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
- Viết một tệp cloudbuild.yaml có quy trình hoàn chỉnh bên dưới.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
#Run a vulnerability scan at _SECURITY level
- id: scan
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
(gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--location us \
--format="value(response.scan)") > /workspace/scan_id.txt
#Analyze the result of the scan
- id: severity check
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
--format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi
#Retag
- id: "retag"
name: 'gcr.io/cloud-builders/docker'
args: ['tag', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#pushing to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#Sign the image only if the previous severity check passes
- id: 'create-attestation'
name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
args:
- '--artifact-url'
- 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good'
- '--attestor'
- 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
- '--keyversion'
- 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good
EOF
Chạy bản dựng
gcloud builds submit
Xem bản dựng trong Nhật ký Cloud Build
Mở Cloud Console để xem trang Nhật ký Cloud Build, sau đó xem bản dựng mới nhất và quá trình thực thi thành công các bước của bản dựng.
6. Uỷ quyền cho Hình ảnh có chữ ký
Trong phần này, bạn sẽ cập nhật GKE để sử dụng tính năng Uỷ quyền nhị phân nhằm xác thực rằng hình ảnh có chữ ký từ tính năng Quét lỗ hổng bảo mật trước khi cho phép hình ảnh chạy.

Cập nhật Chính sách GKE để yêu cầu chứng thực
Yêu cầu Attestor ký hình ảnh bằng cách thêm clusterAdmissionRules vào Chính sách BinAuth của GKE
Hiện tại, cụm của bạn đang chạy một chính sách có một quy tắc: cho phép các vùng chứa từ kho lưu trữ chính thức và từ chối tất cả các vùng chứa khác.
Ghi đè chính sách bằng cấu hình mới cập nhật bằng lệnh bên dưới.
COMPUTE_ZONE=us-central1-a
cat > binauth_policy.yaml << EOM
defaultAdmissionRule:
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
evaluationMode: ALWAYS_DENY
globalPolicyEvaluationMode: ENABLE
clusterAdmissionRules:
${COMPUTE_ZONE}.binauthz:
evaluationMode: REQUIRE_ATTESTATION
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
requireAttestationsBy:
- projects/${PROJECT_ID}/attestors/vulnz-attestor
EOM
Bây giờ, bạn sẽ có một tệp mới trên ổ đĩa, có tên là updated_policy.yaml. Giờ đây, thay vì quy tắc mặc định từ chối tất cả hình ảnh, quy tắc này sẽ kiểm tra người chứng thực của bạn để xác minh.

Tải chính sách mới lên Uỷ quyền nhị phân:
gcloud beta container binauthz policy import binauth_policy.yaml
Triển khai hình ảnh đã ký
Lấy bản tóm tắt hình ảnh cho hình ảnh tốt
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:good \
--format='get(image_summary.digest)')
Sử dụng chuỗi đại diện trong cấu hình Kubernetes
cat > deploy.yaml << EOM
apiVersion: v1
kind: Service
metadata:
name: deb-httpd
spec:
selector:
app: deb-httpd
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deb-httpd
spec:
replicas: 1
selector:
matchLabels:
app: deb-httpd
template:
metadata:
labels:
app: deb-httpd
spec:
containers:
- name: deb-httpd
image: ${CONTAINER_PATH}@${DIGEST}
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
EOM
Triển khai ứng dụng vào GKE
kubectl apply -f deploy.yaml
Xem tải trong bảng điều khiển và lưu ý việc triển khai thành công hình ảnh.
7. Hình ảnh chưa ký bị chặn
Tạo hình ảnh
Trong bước này, bạn sẽ dùng docker cục bộ để tạo hình ảnh cho bộ nhớ đệm cục bộ.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad .
Đẩy hình ảnh chưa ký vào kho lưu trữ
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad
Lấy mã nhận dạng hình ảnh cho hình ảnh không hợp lệ
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:bad \
--format='get(image_summary.digest)')
Sử dụng chuỗi đại diện trong cấu hình Kubernetes
cat > deploy.yaml << EOM
apiVersion: v1
kind: Service
metadata:
name: deb-httpd
spec:
selector:
app: deb-httpd
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deb-httpd
spec:
replicas: 1
selector:
matchLabels:
app: deb-httpd
template:
metadata:
labels:
app: deb-httpd
spec:
containers:
- name: deb-httpd
image: ${CONTAINER_PATH}@${DIGEST}
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
EOM
Thử triển khai ứng dụng vào GKE
kubectl apply -f deploy.yaml
Xem xét tải trong bảng điều khiển và lưu ý lỗi cho biết việc triển khai đã bị từ chối:
No attestations found that were valid and signed by a key trusted by the attestor
8. Xin chúc mừng!
Xin chúc mừng, bạn đã hoàn tất lớp học lập trình này!
Nội dung đã đề cập:
- Ký hình ảnh
- Chính sách kiểm soát quyền truy cập
- Ký ảnh chụp
- Uỷ quyền cho Hình ảnh có chữ ký
- Hình ảnh chưa ký bị chặn
Bước tiếp theo:
- Bảo mật việc triển khai hình ảnh cho Cloud Run và Google Kubernetes Engine | Tài liệu về Cloud Build
- Hướng dẫn nhanh: Định cấu hình chính sách Binary Authorization bằng GKE | Google Cloud
Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên.
Xoá dự án
Cách dễ nhất để loại bỏ phí thanh toán là xoá dự án mà bạn đã tạo cho hướng dẫn này.
—
Lần cập nhật gần đây nhất: 21/3/2023

