使用已签名的 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
  • 容器分析
  • Cloud Key Management Service
  • 二进制授权

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

前提条件

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

选择 shell

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

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

如果您更喜欢使用本地 shell,则必须安装 Cloud SDK,其中包含 gcloud 工具和 kubectl 工具。

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

Cloud Shell

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

  1. 转到 Google Cloud Console。

    Google Cloud Console

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

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

本地 Shell

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

  1. 安装并初始化 Cloud SDK

  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. 在 Cloud Console 中,转到“新建项目”页面。

      转到“新建项目”页面

    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. 在 Cloud Console 中,转到“新建项目”页面。

      转到“新建项目”页面

    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
    

创建 Container Analysis 备注

备注项目拥有 Container Analysis 备注。

要创建 Container Analysis 备注,请完成以下步骤:

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

    1. 在 Cloud Console 中,转到“新建项目”页面。

      转到“新建项目”页面

    2. 填写表单,然后点击创建。在本教程中,您选择的项目名称会引用为 NOTE_PROJ_ID
  2. 要在备注项目上启用 Container 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. 要在备注项目中创建 Container 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. 在 Cloud Console 中,转到“新建项目”页面。

      转到“新建项目”页面

    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 的文件中:

    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 服务帐号授予读取备注项目中出现的 Container 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. 在 Cloud Console 中,转到“新建项目”页面。

      转到“新建项目”页面

    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. 在 Cloud Console 中,转到“新建项目”页面。

      转到“新建项目”页面

    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. 要在部署者项目中创建具有 --enable-binauthz 的集群,请运行以下命令:

    gcloud beta container clusters create CLUSTER_NAME \
        --project=DEPLOYER_PROJ_ID \
        --enable-binauthz \
        --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 Console 中的 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. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。