使用已签名的 MLLP 映像,通过 TCP/IP 连接传输 HL7v2 消息

本教程介绍如何在多项目设置中将 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

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

前提条件

在开始学习本教程之前,请查看 MLLP 和 Google Cloud MLLP 适配器以熟悉 MLLP 的概念性文档。该概念性文档简要介绍了 MLLP,医疗保健系统如何通过 MLLP 连接向 Cloud Healthcare API 发送和接收消息,以及 MLLP 安全的基础知识。

选择 shell

要完成本教程,您可以使用 Cloud Shell 或本地 shell。

Cloud Shell 是一种 shell 环境,用于管理托管在 Google Cloud 上的资源。Cloud Shell 预安装有 Google Cloud CLIkubectl 命令行工具。gcloud CLI 提供了 Google Cloud 的主要命令行界面。kubectl 工具提供了用于对 Kubernetes 集群运行命令的命令行界面。

如果您更喜欢使用本地 shell,则必须安装 Google Cloud CLI。

如需打开 Cloud Shell 或配置本地 shell,请完成以下步骤:

Cloud Shell

如需启动 Cloud Shell,请完成以下步骤:

  1. 进入 Google Cloud 控制台。

    Google Cloud 控制台

  2. 在控制台的右上角,点击激活 Google Cloud Shell 按钮:

控制台底部的框中随即打开一个 Cloud Shell 会话。您可以使用此 shell 运行 gcloudkubectl 命令。

本地 Shell

如需安装 gcloud CLI 和 kubectl 工具,请完成以下步骤:

  1. 安装并初始化 gcloud CLI

  2. 请运行以下命令来安装 kubectl 命令行工具:

    gcloud components install kubectl
    

容器项目

容器项目 cloud-healthcare-containers 已存在。它包含 MLLP 适配器映像。

创建密钥环和密钥对

Cloud KMS 项目使用 Cloud KMS 提供公钥基础架构 (X.509) (PKIX) 签名。Binary Authorization 使用加密密钥来安全地验证证明者的身份。这可确保只有经过验证的相关方才能参与容器映像的授权。密钥对由一个私钥(由证明者用于对证明进行数字签名)和一个公钥(您按照 Binary Authorization 服务所存储的添加到证明者)组成。

如果要在本地管理私钥和公钥对,则不需要 Cloud KMS 项目。如需了解详情,请参阅使用 CMEK(客户管理的加密密钥)

如需创建密钥环和密钥对,请完成以下步骤:

  1. 通过完成以下步骤创建 Cloud KMS 项目:

    1. 在 Google Cloud 控制台中,进入“新建项目”页面。

      转到“新建项目”

    2. 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 KMS_PROJ_ID

    如需详细了解如何创建项目,请参阅创建和管理项目

  2. 要在 Cloud KMS 项目上启用 Cloud KMS API,请运行以下命令:

    gcloud services enable cloudkms.googleapis.com \
        --project=KMS_PROJ_ID
  3. 要创建密钥环,请运行以下命令,其中 KEY_RING 是密钥环的唯一名称,KEY_RING_LOCATIONus-central-1 等地区:

    gcloud kms keyrings create KEY_RING \
        --project=KMS_PROJ_ID \
        --location=KEY_RING_LOCATION
  4. 要创建密钥对,请运行以下命令:

    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"
  5. 要在 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 存储区,请完成以下步骤:

  1. 要创建 HL7v2 项目,请完成以下步骤:

    1. 在 Google Cloud 控制台中,进入“新建项目”页面。

      转到“新建项目”

    2. 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 HL7V2_PROJ_ID

  2. 要在项目上启用 Cloud Healthcare API,请运行以下命令:

    gcloud services enable healthcare.googleapis.com \
        --project=HL7V2_PROJ_ID
  3. 要创建数据集以存储 HL7v2 存储,请运行以下命令:

    gcloud healthcare datasets create DATASET_ID \
        --location=HL7V2_STORE_LOCATION \
        --project=HL7V2_PROJ_ID
  4. 要创建 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 备注,请完成以下步骤:

  1. 通过完成以下步骤创建备注项目:

    1. 在 Google Cloud 控制台中,进入“新建项目”页面。

      转到“新建项目”

    2. 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 NOTE_PROJ_ID
  2. 如需在记事项目中启用 Artifact Analysis API,请运行以下命令:

    gcloud services enable containeranalysis.googleapis.com \
         --project=NOTE_PROJ_ID
  3. 要将示例备注载荷保存到名为 ./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
  4. 如需在备注项目中创建 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"
  5. 要验证备注是否已创建,请运行以下命令:

    curl \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/NOTE_ID"

创建和配置证明者

证明者项目会存储证明者,用于验证或证明容器映像已准备好进行部署。

要创建和配置证明者,请完成以下步骤:

  1. 要创建证明者项目,请完成以下步骤:

    1. 在 Google Cloud 控制台中,进入“新建项目”页面。

      转到“新建项目”

    2. 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 ATTESTOR_PROJ_ID
  2. 要在证明者项目上启用 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
  3. 要在证明者项目上创建证明者,请运行以下命令。证明者使用在备注项目中创建的备注进行证明。

    gcloud beta container binauthz attestors create ATTESTOR_ID \
        --project=ATTESTOR_PROJ_ID \
        --attestation-authority-note=NOTE_ID \
        --attestation-authority-note-project=NOTE_PROJ_ID
  4. 要验证证明者是否已创建,请运行以下命令:

    gcloud beta container binauthz attestors list \
        --project=ATTESTOR_PROJ_ID
  5. 进行以下替换,然后通过运行以下命令将示例 JSON 保存到名为 ./tmp/iam_request.json 的文件中:

    • 使用创建 Artifact Analysis 备注中的 NOTE_PROJ_IDNOTE_ID 值。
    • 要查找 ATTESTOR_PROJECT_NUM,请完成以下步骤:

      1. 前往 Google Cloud 控制台中的信息中心页面

        转到“信息中心”页面

      2. 点击页面顶部的请选择:下拉列表。在显示的请选择:窗口中,选择证明者项目。

      项目编号会显示在项目信息中心的项目信息卡片上。

    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.iam.gserviceaccount.com"
            ]
          }
        ]
      }
    }
    EOM
  6. 要授予证明者项目的 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"
  7. 要将 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

创建证明

认证项目会存储证明。证明是证明者关于流水线中的必需流程已完成且容器映像已获得部署授权的声明。

要创建证明,请完成以下步骤:

  1. 要创建证明项目,请完成以下步骤:

    1. 在 Google Cloud 控制台中,进入“新建项目”页面。

      转到“新建项目”

    2. 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 ATTESTATION_PROJ_ID
  2. 要在证明项目上启用 Binary Authorization API,请运行以下命令:

    gcloud services enable binaryauthorization.googleapis.com \
        --project=ATTESTATION_PROJ_ID
  3. 要签署并创建证明,请运行以下命令,其中 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 适配器,请完成以下步骤:

  1. 要创建部署者项目,请完成以下步骤:

    1. 在 Google Cloud 控制台中,进入“新建项目”页面。

      转到“新建项目”

    2. 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 DEPLOYER_PROJ_ID
  2. 要在部署者项目上启用 Binary Authorization API,请运行以下命令:

    gcloud services enable binaryauthorization.googleapis.com \
        --project=DEPLOYER_PROJ_ID
  3. 要向部署者项目上的 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.iam.gserviceaccount.com" \
        --role=roles/binaryauthorization.attestorsVerifier
  4. 要在部署者项目中创建具有 --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
  5. 示例部署政策将映像来源添加到许可名单,并设置项目范围默认规则,以阻止来自未被证明者证明的来源的映像。要将示例部署政策保存到名为 ./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
  6. 要将部署政策导入部署者项目,请运行以下命令:

    gcloud beta container binauthz policy import ./tmp/policy.yaml \
        --project=DEPLOYER_PROJ_ID
  7. 如需查看此政策的详细信息,请转到 Google Cloud 控制台中的“Binary Authorization”页面。

    转到“Binary Authorization”页面

  8. 要检查 GKE 集群凭据,请运行以下命令:

    gcloud container clusters get-credentials \
        --project=DEPLOYER_PROJ_ID \
        --zone CLUSTER_ZONE CLUSTER_NAME
  9. 进行以下替换,然后通过运行以下命令将示例 YAML 保存到名为 ./tmp/deployment.yaml 的文件中:

    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
  10. 要使用已证明的映像创建部署,请运行以下命令:

    kubectl create -f ./tmp/deployment.yaml
  11. 要确认部署是否成功,请运行以下命令:

    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 项目
  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.