本教程介绍如何在多项目设置中将 Binary Authorization 用作最小底层协议 (MLLP) 部署的一部分。在 Google Kubernetes Engine 上使用 Binary Authorization 可确保只能通过经过验证的签名容器映像部署 MLLP 适配器。
GitHub 中的开源 MLLP 适配器 Binary Authorization Codelab 详细演示了类似的场景。
目标
完成本教程后,您将了解如何执行以下任务:
- 配置证明者以在 MLLP 映像准备好部署时进行证明。
- 部署 MLLP 适配器二进制文件经过认证的映像。
- 使用多项目设置将映像与部署环境的签名分开。
费用
在本文档中,您将使用的以下收费组件: Google Cloud
- Cloud Healthcare API
- Google Kubernetes Engine
- Artifact Analysis
- Cloud Key Management Service
- Binary Authorization
您可使用 价格计算器 根据您的预计使用情况来估算费用。
前提条件
在开始学习本教程之前,请查看 MLLP 和 MLLP 适配器以熟悉 MLLP 的概念性 文档。 Google Cloud 该概念性文档简要介绍了 MLLP,医疗保健系统如何通过 MLLP 连接向 Cloud Healthcare API 发送和接收消息,以及 MLLP 安全的基础知识。
选择 shell
要完成本教程,您可以使用 Cloud Shell 或您的 本地 shell。
Cloud Shell 是一种 shell 环境,用于管理托管在
上 Google Cloud的资源。Cloud Shell 预安装有 Google Cloud CLI 和 kubectl 命令行工具。gcloud CLI 为提供了主要命令行
界面 Google Cloud。kubectl 工具提供了用于对 Kubernetes
集群运行命令的命令行界面。
如果您更喜欢使用本地 shell,则必须安装 Google Cloud CLI。
如需打开 Cloud Shell 或配置本地 shell,请完成以下步骤:
Cloud Shell
如需启动 Cloud Shell,请完成以下步骤:
前往 Google Cloud 控制台。
在控制台的右上角,点击 激活 Google Cloud Shell 按钮:

控制台底部的框中随即打开一个 Cloud Shell 会话。您可以使用此 shell 运行 gcloud 和 kubectl 命令。
本地 Shell
如需安装 gcloud CLI 和 kubectl 工具,请完成以下步骤:
请运行以下命令来安装
kubectl命令行工具:gcloud components install kubectl
容器项目
容器项目 cloud-healthcare-containers 已存在。它包含 MLLP 适配器映像。
创建密钥环和密钥对
Cloud KMS 项目使用 Cloud KMS 提供公钥基础架构 (X.509) (PKIX) 签名。Binary Authorization 使用加密密钥来安全地验证证明者的身份。这可确保只有经过验证的相关方才能参与容器映像的授权。密钥对由一个私钥(由证明者用于对证明进行数字签名)和一个公钥(您按照 Binary Authorization 服务所存储的添加到证明者)组成。
如果要在本地管理私钥和公钥对,则不需要 Cloud KMS 项目。如需了解详情,请参阅使用 CMEK(客户管理的加密密钥)。
如需创建密钥环和密钥对,请完成以下步骤:
通过完成以下步骤创建 Cloud KMS 项目:
在 Google Cloud 控制台中,前往“新建项目”页面。
填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 KMS_PROJ_ID。
如需详细了解如何创建项目,请参阅创建和管理项目。
要在 Cloud KMS 项目上启用 Cloud KMS API,请运行以下命令:
gcloud services enable cloudkms.googleapis.com \ --project=KMS_PROJ_ID
要创建密钥环,请运行以下命令,其中 KEY_RING 是密钥环的唯一名称,KEY_RING_LOCATION 是
us-central-1等地区:gcloud kms keyrings create KEY_RING \ --project=KMS_PROJ_ID \ --location=KEY_RING_LOCATION
要创建密钥对,请运行以下命令:
gcloud kms keys create KEY \ --project=KMS_PROJ_ID \ --keyring=KEY_RING \ --location=KEY_RING_LOCATION \ --purpose=asymmetric-signing \ --default-algorithm="ec-sign-p256-sha256"
要在 Cloud KMS 项目上验证密钥版本,请运行以下命令。密钥版本应为
1。gcloud kms keys versions list \ --project=KMS_PROJ_ID \ --location=KEY_RING_LOCATION \ --key=KEY \ --keyring=KEY_RING
创建和配置 HL7v2 项目、数据集和 HL7v2 存储区
要创建和配置 HL7v2 项目、数据集和 HL7v2 存储区,请完成以下步骤:
要创建 HL7v2 项目,请完成以下步骤:
在 Google Cloud 控制台中,前往“新建项目”页面。
填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 HL7V2_PROJ_ID。
要在项目上启用 Cloud Healthcare API,请运行以下命令:
gcloud services enable healthcare.googleapis.com \ --project=HL7V2_PROJ_ID
要创建数据集以存储 HL7v2 存储区,请运行以下命令:
gcloud healthcare datasets create DATASET_ID \ --location=HL7V2_STORE_LOCATION \ --project=HL7V2_PROJ_ID
要创建 HL7v2 存储区,请运行以下命令:
gcloud healthcare hl7v2-stores create HL7V2_STORE_ID \ --dataset=DATASET_ID \ --location=HL7V2_STORE_LOCATION \ --project=HL7V2_PROJ_ID
创建 Artifact Analysis 备注
备注项目拥有 Artifact Analysis 备注。
如需创建 Artifact Analysis 备注,请完成以下步骤:
通过完成以下步骤创建备注项目:
- 在 Google Cloud 控制台中,前往“新建项目”页面。
- 填写表单,然后点击创建。您选择的项目名称 在本教程中会引用为 NOTE_PROJ_ID。
要在备注项目上启用 Artifact Analysis API,请运行以下命令:
gcloud services enable containeranalysis.googleapis.com \ --project=NOTE_PROJ_ID
要将示例备注载荷保存到名为
./tmp/note_payload.json的文件中,请运行以下命令:cat > ./tmp/note_payload.json << EOM { "name": "projects/NOTE_PROJ_ID/notes/NOTE_ID", "attestation": { "hint": { "human_readable_name": "Attestor note" } } } EOM
要在备注项目中创建 Artifact Analysis 备注,请运行以下命令:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --data-binary @./tmp/note_payload.json \ "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/?noteId=NOTE_ID"
要验证备注是否已创建,请运行以下命令:
curl \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/NOTE_ID"
创建和配置证明者
证明者项目会存储证明者,用于验证或证明容器映像已准备好进行部署。
要创建和配置证明者,请完成以下步骤:
要创建证明者项目,请完成以下步骤:
- 在 Google Cloud 控制台中,前往“新建项目”页面。
- 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 ATTESTOR_PROJ_ID。
要在证明者项目上启用 Binary Authorization API 和 Cloud KMS API,请运行以下命令:
gcloud services enable binaryauthorization.googleapis.com \ --project=ATTESTOR_PROJ_ID gcloud services enable cloudkms.googleapis.com \ --project=ATTESTOR_PROJ_ID
要在证明者项目上创建证明者,请运行以下命令。证明者使用在备注项目中创建的备注进行证明。
gcloud beta container binauthz attestors create ATTESTOR_ID \ --project=ATTESTOR_PROJ_ID \ --attestation-authority-note=NOTE_ID \ --attestation-authority-note-project=NOTE_PROJ_ID
要验证证明者是否已创建,请运行以下命令:
gcloud beta container binauthz attestors list \ --project=ATTESTOR_PROJ_ID
进行以下替换,然后通过运行以下命令将示例 JSON 保存到名为
./tmp/iam_request.json的文件中:- 使用 创建 Artifact Analysis 备注中的值 NOTE_PROJ_ID 和 NOTE_ID。
如需查找 ATTESTOR_PROJECT_NUM,请完成以下步骤:
前往信息中心页面中的 Google Cloud 控制台。
点击页面顶部的请选择:下拉列表。在显示的请选择:窗口中,选择证明者项目。
项目编号会显示在项目信息中心的项目信息 卡片上。
cat > ./tmp/iam_request.json << EOM { "resource": "projects/NOTE_PROJ_ID/notes/NOTE_ID", "policy": { "bindings": [ { "role": "roles/containeranalysis.notes.occurrences.viewer", "members": [ "serviceAccount:service-ATTESTOR_PROJ_NUM@gcp-sa-binaryauthorization." ] } ] } } EOM
要向证明者项目的 Binary Authorization 服务帐号授予读取备注项目中出现的 Artifact Analysis 备注的权限,请运行以下命令:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --data-binary @./tmp/iam_request.json \ "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/NOTE_ID:setIamPolicy"
要将 Cloud KMS 项目中生成的密钥添加到证明者,请运行以下命令:
gcloud beta container binauthz attestors public-keys add \ --project=ATTESTOR_PROJ_ID \ --attestor=ATTESTOR_ID \ --keyversion-project=KMS_PROJ_ID \ --keyversion-location=KEY_RING_LOCATION \ --keyversion-keyring=KEY_RING \ --keyversion-key=KEY \ --keyversion=KEY_VERSION
创建证明
认证项目会存储证明。证明是证明者关于流水线中的必需流程已完成且容器映像已获得部署授权的声明。
要创建证明,请完成以下步骤:
要创建证明项目,请完成以下步骤:
- 在 Google Cloud 控制台中,前往“新建项目”页面。
- 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 ATTESTATION_PROJ_ID。
要在证明项目上启用 Binary Authorization API,请运行以下命令:
gcloud services enable binaryauthorization.googleapis.com \ --project=ATTESTATION_PROJ_ID
要签署并创建证明,请运行以下命令,其中 IMAGE_SIGNED 是签名的 MLLP 适配器映像 (
gcr.io/cloud-healthcare-containers/mllp-adapter@sha256:231b073df13db0c65e57b0e1d526ab6816a73c37262e25c18bcca99bf4b4b185) 的位置:gcloud beta container binauthz attestations sign-and-create \ --project=ATTESTATION_PROJ_ID \ --artifact-url=IMAGE_SIGNED \ --attestor=ATTESTOR_ID \ --attestor-project=ATTESTOR_PROJ_ID \ --keyversion-project=KMS_PROJ_ID \ --keyversion-location=KEY_RING_LOCATION \ --keyversion-keyring=KEY_RING \ --keyversion-key=KEY \ --keyversion=KEY_VERSION
部署 MLLP 适配器
部署者项目拥有导入并存储 Binary Authorization 的 GKE 集群。
要部署 MLLP 适配器,请完成以下步骤:
要创建部署者项目,请完成以下步骤:
- 在 Google Cloud 控制台中,前往“新建项目”页面。
- 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 DEPLOYER_PROJ_ID。
要在部署者项目上启用 Binary Authorization API,请运行以下命令:
gcloud services enable binaryauthorization.googleapis.com \ --project=DEPLOYER_PROJ_ID
要向部署者项目上的 Binary Authorization 服务账号授予访问证明者进行证明验证的权限,请运行以下命令:
gcloud beta container binauthz attestors add-iam-policy-binding \ "projects/ATTESTOR_PROJ_ID/attestors/ATTESTOR_ID" \ --project=ATTESTOR_PROJ_ID \ --member="serviceAccount:service-DEPLOYER_PROJ_NUM@gcp-sa-binaryauthorization." \ --role=roles/binaryauthorization.attestorsVerifier
要在部署者项目中创建具有
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE的集群,请运行以下命令:gcloud beta container clusters create CLUSTER_NAME \ --project=DEPLOYER_PROJ_ID \ --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \ --zone CLUSTER_ZONE
示例部署政策将映像来源添加到许可名单,并设置项目范围默认规则,以阻止来自未被证明者证明的来源的映像。要将示例部署政策保存到名为
./tmp/policy.yaml的文件中,请运行以下命令:cat > ./tmp/policy.yaml << EOM admissionWhitelistPatterns: - namePattern: gcr.io/google_containers/* - namePattern: gcr.io/google-containers/* - namePattern: k8s.gcr.io/* - namePattern: gcr.io/stackdriver-agents/* defaultAdmissionRule: evaluationMode: REQUIRE_ATTESTATION enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG requireAttestationsBy: - projects/ATTESTOR_PROJ_ID/attestors/ATTESTOR_ID name: projects/DEPLOYER_PROJ_ID/policy EOM
要将部署政策导入部署者项目,请运行以下命令:
gcloud beta container binauthz policy import ./tmp/policy.yaml \ --project=DEPLOYER_PROJ_ID
如需查看政策的详细信息,请前往 控制台中的 Google Cloud Binary Authorization 页面。
要检查 GKE 集群凭据,请运行以下命令:
gcloud container clusters get-credentials \ --project=DEPLOYER_PROJ_ID \ --zone CLUSTER_ZONE CLUSTER_NAME
进行以下替换,然后通过运行以下命令将示例 YAML 保存到名为
./tmp/deployment.yaml的文件中:- IMAGE_SIGNED 是 签名的 MLLP 适配器映像 (
gcr.io/cloud-healthcare-containers/mllp-adapter@sha256:231b073df13db0c65e57b0e1d526ab6816a73c37262e25c18bcca99bf4b4b185) 的位置。 - 使用您在创建和配置 HL7v2 项目、数据集和存储区时使用的 HL7V2_PROJ_ID、HL7V2_STORE_LOCATION、DATASET_ID 和 HL7V2_STORE_ID 值。
cat > ./tmp/deployment.yaml << EOM apiVersion: apps/v1 kind: Deployment metadata: name: mllp-adapter-deployment spec: replicas: 1 selector: matchLabels: app: mllp-adapter template: metadata: labels: app: mllp-adapter spec: containers: - name: mllp-adapter imagePullPolicy: Always image: IMAGE_SIGNED ports: - containerPort: 2575 protocol: TCP name: "port" command: - "/usr/mllp_adapter/mllp_adapter" - "--hl7_v2_project_id=HL7V2_PROJ_ID" - "--hl7_v2_location_id=HL7V2_STORE_LOCATION" - "--hl7_v2_dataset_id=DATASET_ID" - "--hl7_v2_store_id=HL7V2_STORE_ID" - "--api_addr_prefix=https://healthcare.googleapis.com:443/v1beta1" - "--logtostderr" - "--receiver_ip=0.0.0.0" EOM
- IMAGE_SIGNED 是 签名的 MLLP 适配器映像 (
要使用已证明的映像创建部署,请运行以下命令:
kubectl create -f ./tmp/deployment.yaml
要确认部署是否成功,请运行以下命令:
kubectl get pods kubectl get event
get pods命令显示一个正在运行的 pod,get event显示Scaled up replica set mllp-adapter-deployment-xxxx to 1。
完成此部分后,您已成功将经过证明的机器学习 LP 适配器映像安全地部署到 Google Kubernetes Engine。
删除项目
为避免因本教程中使用的 资源导致您的 Google Cloud 账号产生费用,您可以清理在 Google Cloud创建的资源。
请按照以下步骤删除您在本教程中创建的以下项目:
- 证明者项目
- 证明项目
- 部署者项目
- 备注项目
- Cloud KMS 项目
- 在 Google Cloud 控制台中,前往 管理资源 页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。