署名付きの MLLP イメージを使用した TCP/IP 接続を介した HL7v2 メッセージの送信

このチュートリアルでは、マルチ プロジェクト設定で最小階層プロトコル(MLLP)のデプロイの一部として Binary Authorization を使用する方法について説明します。Google Kubernetes Engine で Binary Authorization を使用すると、MLLP アダプタを検証済みの署名付きコンテナ イメージからのみデプロイできます。

GitHub のオープンソース MLLP アダプタ Binary Authorization Codelab では、同様のシナリオについて詳しく説明しています。

目標

このチュートリアルを完了すると、以下のことが行えます。

  • MLLP イメージをデプロイする準備ができたら認証を行う認証者を構成します。
  • MLLP アダプタ バイナリの証明済みイメージをデプロイします。
  • 複数プロジェクトの設定を使用して、イメージへの署名の義務をデプロイ環境から分離します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

前提条件

このチュートリアルを開始する前に、MLLP と Google Cloud MLLP アダプタを確認して、MLLP のコンセプトに関するドキュメントをよく読んでください。コンセプト ドキュメントでは、MLLP の概要、ケアシステムが MLLP 接続を介して Cloud Healthcare API との間でメッセージを送受信する方法、MLLP セキュリティの基本について説明しています。

シェルを選択する

このチュートリアルを完了するには、Cloud Shell またはローカルシェルを使用します。

Google 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 Console に移動します。

    Google Cloud コンソール

  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 では、暗号鍵を使用して認証者の ID を安全に確認します。これにより、確認済みの当事者のみがコンテナ イメージの承認に参加できるようになります。鍵ペアは、認証者がデジタルで証明書に署名するために使用する秘密鍵と、Binary Authorization サービスによって保存され、認証者に追加される公開鍵で構成されます。

秘密鍵と公開鍵のペアをローカルで管理する場合、Cloud KMS プロジェクトは必要ありません。詳細については、顧客管理の暗号鍵の使用をご覧ください。

キーリングと鍵ペアの作成は、次の手順で行います。

  1. 次の手順を実施して、Cloud KMS プロジェクトを作成します。

    1. Google Cloud コンソールで [新しいプロジェクト] ページに移動します。

      新しいプロジェクトに移動

    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 コンソールで [新しいプロジェクト] ページに移動します。

      新しいプロジェクトに移動

    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 コンソールで [新しいプロジェクト] ページに移動します。

      新しいプロジェクトに移動

    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 コンソールで [新しいプロジェクト] ページに移動します。

      新しいプロジェクトに移動

    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 という名前のファイルに保存します。

    • Artifact Analysis メモの作成から取得した NOTE_PROJ_IDNOTE_ID の値を使用します。
    • ATTESTOR_PROJECT_NUM を見つけるには、次の手順を実施します。

      1. Google Cloud コンソールの [ダッシュボード] ページに移動します。

        [ダッシュボード] ページに移動する

      2. ページ上部の [選択元] プルダウン リストをクリックします。表示される [選択元] ウィンドウで、認証者プロジェクトを選択します。

      プロジェクト番号は、プロジェクト ダッシュボードの [プロジェクト情報] カードに表示されます。

    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. 認証者プロジェクトの 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"
    
  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 コンソールで [新しいプロジェクト] ページに移動します。

      新しいプロジェクトに移動

    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 アダプターのデプロイ

デプロイ担当者プロジェクトには、Binary Authorization がインポートされ、保存されている GKE クラスタがあります。

MLLP アダプタをデプロイするには、次の手順を実行します。

  1. deployer プロジェクトの作成は、次の手順で行います。

    1. Google Cloud コンソールで [新しいプロジェクト] ページに移動します。

      新しいプロジェクトに移動

    2. フォームに入力し、[作成] をクリックします。選択したプロジェクト名は、このチュートリアル全体で DEPLOYER_PROJ_ID として参照されます。
  2. デプロイ担当者プロジェクトで Binary Authorization API を有効にするには、次のコマンドを実行します。

    gcloud services enable binaryauthorization.googleapis.com \
        --project=DEPLOYER_PROJ_ID
    
  3. デプロイ担当者プロジェクトの 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
    
  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 Console の [Binary Authorization] ページに移動します。

    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 コマンドは実行中のポッドを 1 つ表示し、get eventScaled up replica set mllp-adapter-deployment-xxxx to 1 を表示します。

このセクションを完了すると、証明済みの MLLP アダプタ イメージを Google Kubernetes Engine に安全にデプロイできます。

プロジェクトの削除

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、Google Cloud で作成したリソースをクリーンアップします。

このチュートリアルで作成した次のプロジェクトを、以下の方法に従って削除します。

  • 認証者プロジェクト
  • 証明書プロジェクト
  • デプロイ担当者プロジェクト
  • メモ プロジェクト
  • Cloud KMS プロジェクト
  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。