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

本教學課程提供操作說明,說明如何在多專案設定中,將二進位授權用於最低層級通訊協定 (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 CLI 和 kubectl 指令列工具。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 工作階段。您可以使用這個殼層來執行 gcloud 和 kubectl 指令。

本機殼層

如要安裝 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 附註

記事專案擁有 Artifact Analysis 記事。

如要建立 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. 如要在驗證者專案中啟用二進位授權和 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_ID 和 NOTE_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. 如要在驗證專案中啟用二進位授權 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. 如要在部署者專案中啟用二進位授權 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. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。