このチュートリアルでは、マルチ プロジェクト設定で最小階層プロトコル(MLLP)のデプロイの一部として Binary Authorization を使用する方法について説明します。Google Kubernetes Engine で Binary Authorization を使用すると、MLLP アダプタを検証済みの署名付きコンテナ イメージからのみデプロイできます。
GitHub のオープンソース MLLP アダプタ Binary Authorization Codelab では、同様のシナリオについて詳しく説明しています。
目標
このチュートリアルを完了すると、以下のことが行えます。
- MLLP イメージをデプロイする準備ができたら認証を行う認証者を構成します。
- MLLP アダプタ バイナリの証明済みイメージをデプロイします。
- 複数プロジェクトの設定を使用して、イメージへの署名の義務をデプロイ環境から分離します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Cloud Healthcare API
- Google Kubernetes Engine
- Artifact Analysis
- Cloud Key Management Service
- Binary Authorization
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
前提条件
このチュートリアルを開始する前に、MLLP と Google Cloud MLLP アダプタを確認して、MLLP のコンセプトに関するドキュメントをよく読んでください。コンセプト ドキュメントでは、MLLP の概要、ケアシステムが MLLP 接続を介して Cloud Healthcare API との間でメッセージを送受信する方法、MLLP セキュリティの基本について説明しています。
シェルを選択する
このチュートリアルを完了するには、Cloud Shell またはローカルシェルを使用します。
Google 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 Console に移動します。
コンソールの右上隅にある [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)署名を提供します。Binary Authorization では、暗号鍵を使用して認証者の ID を安全に確認します。これにより、確認済みの当事者のみがコンテナ イメージの承認に参加できるようになります。鍵ペアは、認証者がデジタルで証明書に署名するために使用する秘密鍵と、Binary Authorization サービスによって保存され、認証者に追加される公開鍵で構成されます。
秘密鍵と公開鍵のペアをローカルで管理する場合、Cloud KMS プロジェクトは必要ありません。詳細については、顧客管理の暗号鍵の使用をご覧ください。
キーリングと鍵ペアの作成は、次の手順で行います。
次の手順を実施して、Cloud KMS プロジェクトを作成します。
Google Cloud コンソールで [新しいプロジェクト] ページに移動します。
フォームに入力し、[作成] をクリックします。選択したプロジェクト名は、このチュートリアル全体で 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 コンソールで [新しいプロジェクト] ページに移動します。
フォームに入力し、[作成] をクリックします。選択したプロジェクト名は、このチュートリアル全体で 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 コンソールで [新しいプロジェクト] ページに移動します。
- フォームに入力し、[作成] をクリックします。選択したプロジェクト名は、このチュートリアル全体で 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 コンソールで [新しいプロジェクト] ページに移動します。
- フォームに入力し、[作成] をクリックします。選択したプロジェクト名は、このチュートリアル全体で ATTESTOR_PROJ_ID として参照されます。
認証者プロジェクトの 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
認証者プロジェクトに認証者を作成するには、次のコマンドを実行します。認証者は、認証用にメモ プロジェクトで作成されたメモを使用します。
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 Analysis メモの作成から取得した NOTE_PROJ_ID と NOTE_ID の値を使用します。
ATTESTOR_PROJECT_NUM を見つけるには、次の手順を実施します。
Google Cloud コンソールの [ダッシュボード] ページに移動します。
ページ上部の [選択元] プルダウン リストをクリックします。表示される [選択元] ウィンドウで、認証者プロジェクトを選択します。
プロジェクト番号は、プロジェクト ダッシュボードの [プロジェクト情報] カードに表示されます。
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
認証者プロジェクトの Binary Authorization サービス アカウントに、メモ プロジェクトの 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 コンソールで [新しいプロジェクト] ページに移動します。
- フォームに入力し、[作成] をクリックします。選択したプロジェクト名は、このチュートリアル全体で 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 アダプターのデプロイ
デプロイ担当者プロジェクトには、Binary Authorization がインポートされ、保存されている GKE クラスタがあります。
MLLP アダプタをデプロイするには、次の手順を実行します。
deployer プロジェクトの作成は、次の手順で行います。
- Google Cloud コンソールで [新しいプロジェクト] ページに移動します。
- フォームに入力し、[作成] をクリックします。選択したプロジェクト名は、このチュートリアル全体で DEPLOYER_PROJ_ID として参照されます。
デプロイ担当者プロジェクトで Binary Authorization API を有効にするには、次のコマンドを実行します。
gcloud services enable binaryauthorization.googleapis.com \ --project=DEPLOYER_PROJ_ID
デプロイ担当者プロジェクトの 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
デプロイ担当者プロジェクトで
--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 Console の [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
コマンドは実行中のポッドを 1 つ表示し、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.