使用已簽署的 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 CLIkubectl 指令列工具。gcloud CLI 提供 Google Cloud的主要指令列介面。kubectl 工具提供指令列介面,可用於執行 Kubernetes 叢集相關指令。

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

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

Cloud Shell

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

  1. 前往 Google Cloud 控制台。

    Google Cloud 主控台

  2. 在主控台的右上角,按一下「Activate Google Cloud Shell」(啟用 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) 簽名。二進位授權會使用加密編譯金鑰,安全地驗證認證者的身分。這樣一來,只有經過驗證的對象才能參與容器映像檔的授權程序。金鑰組合包含私密金鑰和公開金鑰。前者是認證者用來數位簽署認證的金鑰,後者則是您新增至認證者,並由二進位授權服務儲存的金鑰。

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

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

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

    1. 在 Google Cloud 控制台中,前往「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_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 控制台中,前往「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」(新增專案) 頁面。

      前往「新專案」

    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」(新增專案) 頁面。

      前往「新專案」

    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 分析筆記中的 NOTE_PROJ_IDNOTE_ID 值。
    • 如要找出 ATTESTOR_PROJECT_NUM,請完成下列步驟:

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

        前往「Dashboard」(資訊主頁) 頁面

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

      專案編號會顯示在專案資訊主頁的「Project info」(專案資訊) 卡片中。

    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」(新增專案) 頁面。

      前往「新專案」

    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」(新增專案) 頁面。

      前往「新專案」

    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.