서명된 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
  • Artifact Analysis
  • Cloud Key Management Service
  • Binary Authorization

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. 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) 서명을 제공합니다. 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 메모 만들기

메모 프로젝트는 아티팩트 분석 메모를 소유합니다.

아티팩트 분석 메모를 만들려면 다음 단계를 완료하세요.

  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. 메모 프로젝트에서 아티팩트 분석 메모를 만들려면 다음 명령어를 실행합니다.

    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 파일에 저장합니다.

    • 아티팩트 분석 메모 만들기에서 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 서비스 계정에 메모 프로젝트의 아티팩트 분석 메모 일치 항목을 읽을 수 있는 권한을 부여하려면 다음 명령어를 실행합니다.

    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. 배포자 프로젝트를 만들려면 다음 단계를 완료하세요.

    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 콘솔의 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 명령어는 실행중인 pod 하나를 표시하고 get eventScaled 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.