使用已簽署的 MLLP 映像檔,透過 TCP/IP 連線傳送 HL7v2 訊息

本教學課程提供操作說明,說明如何在多專案設定中,將 Binary Authorization 用於最低層級通訊協定 (MLLP) 部署作業。在 Google Kubernetes Engine 上使用二進位授權,可確保 MLLP 配接器只能從經過驗證和簽署的容器映像檔部署。

GitHub 中的開放原始碼 MLLP 配接器二進位授權程式碼研究室,詳細說明瞭類似情境。

目標

完成本教學課程後,您將會學到以下內容:

  • 設定驗證者,在 MLLP 映像檔準備好部署時進行驗證。
  • 部署 MLLP 轉接程式二進位檔的經過認證映像檔。
  • 使用多專案設定,將簽署映像檔的責任與部署環境分開。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

  • Cloud Healthcare API
  • Google Kubernetes Engine
  • Artifact Analysis
  • Cloud Key Management Service
  • Binary Authorization

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

必要條件

開始本教學課程前,請先詳閱 MLLP 和 Google Cloud MLLP 介面卡,熟悉 MLLP 的概念文件。概念文件概略說明 MLLP、照護系統如何透過 MLLP 連線與 Cloud Healthcare API 傳送及接收訊息,以及 MLLP 安全性的基本概念。

選擇殼層

如要完成本教學課程,可以使用 Cloud Shell 或本機殼層。

Cloud Shell 是殼層環境,用於管理託管在 Google Cloud的資源。Cloud Shell 已預先安裝 Google Cloud CLIkubectl 指令列工具。gcloud CLI 是 Google Cloud的主要指令列介面。kubectl 工具提供指令列介面,可對 Kubernetes 叢集執行指令。

如果您想要使用本機殼層,就必須安裝 Google Cloud CLI。

如要開啟 Cloud Shell 或設定本機殼層,請完成下列步驟:

Cloud Shell

如要啟動 Cloud Shell,請完成下列步驟:

  1. 前往 Google Cloud 控制台。

    Google Cloud console

  2. 按一下主控台右上角的「啟用 Google Cloud Shell」按鈕:

主控台底部的頁框中會開啟一個 Cloud Shell 工作階段。您可以使用這個殼層來執行 gcloudkubectl 指令。

本機殼層

如要安裝 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 服務儲存)。

如要在本機管理私密和公開金鑰組,則不需要 Cloud KMS 專案。詳情請參閱「使用客戶管理的加密金鑰」。

如要建立金鑰環和金鑰組,請完成下列步驟:

  1. 完成下列步驟,建立 Cloud KMS 專案:

    1. 前往 Google Cloud 控制台的「New Project」(新增專案) 頁面。

      前往「New Project」(新專案)

    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_LOCATION 則是區域,例如 us-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 控制台的「New Project」(新增專案) 頁面。

      前往「New Project」(新專案)

    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 記事。

如要建立構件分析記事,請完成下列步驟:

  1. 完成下列步驟以建立附註專案:

    1. 前往 Google Cloud 控制台的「New Project」(新增專案) 頁面。

      前往「New Project」(新專案)

    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 控制台的「New Project」(新增專案) 頁面。

      前往「New Project」(新專案)

    2. 填寫表單,然後按一下「建立」。在本教學課程中,您選取的專案名稱會稱為 ATTESTOR_PROJ_ID
  2. 如要在驗證者專案中啟用 Binary Authorization 和 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 的檔案:

    • 使用「建立構件分析記事」中的 NOTE_PROJ_IDNOTE_ID 值。
    • 如要尋找 ATTESTOR_PROJECT_NUM,請完成下列步驟:

      1. 前往Google Cloud 控制台的「資訊主頁」頁面

        前往「資訊主頁」頁面

      2. 按一下頁面頂端的 [Select from] (可用的選項) 下拉式清單。在顯示的「Select from」(可用的選項) 視窗中,選取認證者專案。

      專案編號會顯示在專案資訊主頁的「專案資訊」資訊卡中。

    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. 如要授予驗證者專案的二進位授權服務帳戶權限,以便讀取附註專案中的 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 控制台的「New Project」(新增專案) 頁面。

      前往「New Project」(新專案)

    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 轉接程式

部署者專案擁有 GKE 叢集,二進位授權會匯入並儲存在該叢集。

如要部署 MLLP 配接器,請完成下列步驟:

  1. 如要建立部署者專案,請完成下列步驟:

    1. 前往 Google Cloud 控制台的「New Project」(新增專案) 頁面。

      前往「New Project」(新專案)

    2. 填寫表單,然後按一下「建立」。在本教學課程中,您選取的專案名稱會稱為 DEPLOYER_PROJ_ID
  2. 如要在部署者專案中啟用 Binary Authorization API,請執行下列指令:

    gcloud services enable binaryauthorization.googleapis.com \
        --project=DEPLOYER_PROJ_ID
  3. 如要授予部署者專案的二進位授權服務帳戶權限,以存取驗證者進行驗證,請執行下列指令:

    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」(二進位授權) 頁面。

    前往「二進位授權」頁面

  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

完成本節後,您已成功將經過認證的 MLLP 介面卡映像檔安全地部署至 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.