이 튜토리얼에서는 다중 프로젝트 설정에서 최소한의 하위 레이어 프로토콜(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 또는 로컬 셸을 사용하면 됩니다.
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) 서명을 제공합니다. 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 메모 만들기
메모 프로젝트는 아티팩트 분석 메모를 소유합니다.
아티팩트 분석 메모를 만들려면 다음 단계를 완료하세요.
다음 단계를 완료하여 메모 프로젝트를 만듭니다.
- 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
메모 프로젝트에서 아티팩트 분석 메모를 만들려면 다음 명령어를 실행합니다.
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
파일에 저장합니다.- 아티팩트 분석 메모 만들기에서 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 서비스 계정에 메모 프로젝트의 아티팩트 분석 메모 일치 항목을 읽을 수 있는 권한을 부여하려면 다음 명령어를 실행합니다.
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 배포하려면 다음 단계를 완료하세요.
배포자 프로젝트를 만들려면 다음 단계를 완료하세요.
- 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 콘솔의 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.