本教學課程提供操作說明,說明如何在多專案設定中,將二進位授權做為最小底層通訊協定 (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 根據預測用量產生預估費用。
必要條件
開始本教學課程前,請先詳閱 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,請完成下列步驟:
前往 Google Cloud 控制台。
在主控台的右上角,按一下「Activate Google Cloud Shell」(啟用 Google Cloud Shell) 按鈕:
主控台底部的頁框中會開啟一個 Cloud Shell 工作階段。您可以使用這個殼層來執行 gcloud
和 kubectl
指令。
本機殼層
如要安裝 gcloud CLI 和 kubectl
工具,請完成下列步驟:
執行下列指令來安裝
kubectl
指令列工具:gcloud components install kubectl
容器專案
容器專案 cloud-healthcare-containers
已存在。它會保留 MLLP 轉接器圖片。
建立金鑰環和金鑰組
Cloud KMS 專案提供使用 Cloud KMS 的公開金鑰基礎結構 (X.509) (PKIX) 簽名。二進位授權會使用加密編譯金鑰,安全地驗證認證者的身分。這樣一來,只有經過驗證的對象才能參與容器映像檔的授權程序。金鑰組合包含私密金鑰和公開金鑰。前者是認證者用來數位簽署認證的金鑰,後者則是您新增至認證者,並由二進位授權服務儲存的金鑰。
如果您想在本機管理私密和公開金鑰組,則不需要 Cloud KMS 專案。詳情請參閱「使用客戶管理的加密金鑰」。
如要建立金鑰環和金鑰組,請完成下列步驟:
請完成下列步驟,建立 Cloud KMS 專案:
在 Google Cloud 控制台中,前往「New Project」(新增專案) 頁面。
填妥表單,然後按一下「建立」。在本教學課程中,您選取的專案名稱會以 KMS_PROJ_ID 的形式參照。
如要進一步瞭解如何建立專案,請參閱「建立及管理專案」。
如要在 Cloud KMS 專案中啟用 Cloud KMS API,請執行下列指令:
gcloud services enable cloudkms.googleapis.com \ --project=KMS_PROJ_ID
如要建立金鑰環,請執行下列指令,其中 KEY_RING 是金鑰環的專屬名稱,而 KEY_RING_LOCATION 是
us-central-1
等區域:gcloud kms keyrings create KEY_RING \ --project=KMS_PROJ_ID \ --location=KEY_RING_LOCATION
如要建立金鑰組,請執行下列指令:
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"
如要確認 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 儲存庫,請完成下列步驟:
如要建立 HL7v2 專案,請完成下列步驟:
在 Google Cloud 控制台中,前往「New Project」(新增專案) 頁面。
填妥表單,然後按一下「建立」。在本教學課程中,我們會以 HL7V2_PROJ_ID 稱呼您選取的專案名稱。
如要在專案中啟用 Cloud Healthcare API,請執行下列指令:
gcloud services enable healthcare.googleapis.com \ --project=HL7V2_PROJ_ID
如要建立資料集來儲存 HL7v2 存放區,請執行下列指令:
gcloud healthcare datasets create DATASET_ID \ --location=HL7V2_STORE_LOCATION \ --project=HL7V2_PROJ_ID
如要建立 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」記事,請完成下列步驟:
完成下列步驟,建立筆記專案:
- 在 Google Cloud 控制台中,前往「New Project」(新增專案) 頁面。
- 填妥表單,然後按一下「建立」。在本教學課程中,我們會以 NOTE_PROJ_ID 稱呼您選取的專案名稱。
如要在筆記專案中啟用 Artifact Analysis API,請執行下列指令:
gcloud services enable containeranalysis.googleapis.com \ --project=NOTE_PROJ_ID
如要將範例筆記酬載儲存至名為
./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
如要在記事專案中建立 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"
如要確認已建立附註,請執行下列指令:
curl \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/NOTE_ID"
建立及設定驗證者
認證者專案會儲存認證者,用於驗證或認證容器映像檔是否已準備好部署。
如要建立及設定認證者,請完成下列步驟:
如要建立認證器專案,請完成下列步驟:
- 在 Google Cloud 控制台中,前往「New Project」(新增專案) 頁面。
- 填妥表單,然後按一下「建立」。在本教學課程中,您選取的專案名稱會以 ATTESTOR_PROJ_ID 的形式參照。
如要在認證者專案中啟用二進位授權和 Cloud KMS API,請執行下列指令:
gcloud services enable binaryauthorization.googleapis.com \ --project=ATTESTOR_PROJ_ID gcloud services enable cloudkms.googleapis.com \ --project=ATTESTOR_PROJ_ID
如要在認證器專案中建立認證器,請執行下列指令。驗證者會使用在附註專案中建立的附註進行驗證。
gcloud beta container binauthz attestors create ATTESTOR_ID \ --project=ATTESTOR_PROJ_ID \ --attestation-authority-note=NOTE_ID \ --attestation-authority-note-project=NOTE_PROJ_ID
如要確認已建立認證者,請執行下列指令:
gcloud beta container binauthz attestors list \ --project=ATTESTOR_PROJ_ID
進行以下替換,然後執行下列指令,將範例 JSON 儲存至名為
./tmp/iam_request.json
的檔案:- 使用建立 Artifact 分析筆記中的 NOTE_PROJ_ID 和 NOTE_ID 值。
如要找出 ATTESTOR_PROJECT_NUM,請完成下列步驟:
前往Google Cloud 控制台的「資訊主頁」頁面。
按一下頁面頂端的 [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
如要授予驗證者專案的二進位授權服務帳戶權限,以便讀取筆記專案中的「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"
如要將在 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
建立認證
認證專案會儲存認證。認證是指認證者聲明管道中所需的程序已完成,且容器映像檔已獲授權部署。
如要建立認證,請完成下列步驟:
如要建立認證專案,請完成下列步驟:
- 在 Google Cloud 控制台中,前往「New Project」(新增專案) 頁面。
- 填妥表單,然後按一下「建立」。在本教學課程中,您選取的專案名稱會以 ATTESTATION_PROJ_ID 的形式參照。
如要在認證專案中啟用 Binary Authorization API,請執行下列指令:
gcloud services enable binaryauthorization.googleapis.com \ --project=ATTESTATION_PROJ_ID
如要簽署並建立認證,請執行下列指令,其中 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 轉接器,請完成下列步驟:
如要建立部署工具專案,請完成下列步驟:
- 在 Google Cloud 控制台中,前往「New Project」(新增專案) 頁面。
- 填妥表單,然後按一下「建立」。在本教學課程中,您選取的專案名稱會以 DEPLOYER_PROJ_ID 的形式參照。
如要在部署者專案中啟用 Binary Authorization API,請執行下列指令:
gcloud services enable binaryauthorization.googleapis.com \ --project=DEPLOYER_PROJ_ID
如要授予部署者專案的二進位授權服務帳戶存取認證器的權限,以便進行認證驗證,請執行下列指令:
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
如要在部署者專案中使用
--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
本範例部署政策會將圖片來源新增至許可清單,並設定專案範圍預設規則,以便封鎖未經認證者認證的來源圖片。如要將範例部署政策儲存至名為
./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
如要將部署政策匯入部署者專案,請執行下列指令:
gcloud beta container binauthz policy import ./tmp/policy.yaml \ --project=DEPLOYER_PROJ_ID
如要查看政策詳細資料,請前往 Google Cloud 控制台中的「Binary Authorization」(二進位授權) 頁面。
如要檢查 GKE 叢集憑證,請執行下列指令:
gcloud container clusters get-credentials \ --project=DEPLOYER_PROJ_ID \ --zone CLUSTER_ZONE CLUSTER_NAME
進行以下替換,然後執行下列指令,將範例 YAML 儲存至名為
./tmp/deployment.yaml
的檔案:- IMAGE_SIGNED 是已簽署的 MLLP 轉接器映像檔的位置,
gcr.io/cloud-healthcare-containers/mllp-adapter@sha256:231b073df13db0c65e57b0e1d526ab6816a73c37262e25c18bcca99bf4b4b185
。 - 使用您在建立及設定 HL7v2 專案、資料集和儲存庫時使用的 HL7V2_PROJ_ID、HL7V2_STORE_LOCATION、DATASET_ID 和 HL7V2_STORE_ID 值。
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
- IMAGE_SIGNED 是已簽署的 MLLP 轉接器映像檔的位置,
如要使用認證映像檔建立部署,請執行下列指令:
kubectl create -f ./tmp/deployment.yaml
如要確認部署作業是否成功,請執行下列指令:
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 專案
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.