mTLS를 통해 워크로드를 다른 워크로드에 인증


이 문서에서는 Compute Engine용 관리형 워크로드 아이덴티티의 자동 프로비저닝 및 수명 주기 관리를 설정하는 방법을 설명합니다. CA 서비스의 배포, 관리, 보안을 간소화하고 자동화하는 가용성이 높고 확장 가능한 Google Cloud 서비스인 Certificate Authority Service(CA)를 사용하여 인증서를 발급하도록 CA 풀을 구성합니다. 각 VM은 구성된 CA 풀의 X.509 사용자 인증 정보로 프로비저닝됩니다. 그런 다음 이 사용자 인증 정보를 사용하여 mTLS 연결을 설정할 수 있습니다.

Compute Engine용 관리형 워크로드 아이덴티티를 사용하면 두 Compute Engine VM 간에 상호 인증 및 암호화된 통신을 구현할 수 있습니다. 구성된 VM에서 실행되는 워크로드 애플리케이션이 VM별 mTLS에 X.509 사용자 인증 정보를 사용할 수 있습니다. 이러한 mTLS 인증서는 Certificate Authority Service에 의해 자동으로 순환되고 관리됩니다.

시작하기 전에

  • 관리형 워크로드 아이덴티티 미리보기에 대한 액세스 권한을 요청합니다.

  • Google Cloud CLI를 구성합니다.

    Install the Google Cloud CLI, then initialize it by running the following command:

    gcloud init
  • 결제 및 할당량에 허용 목록 프로젝트를 사용하도록 Google Cloud CLI를 구성합니다.

      gcloud config set billing/quota_project PROJECT_ID

    PROJECT_ID를 관리형 워크로드 아이덴티티 미리보기의 허용 목록에 추가된 프로젝트의 ID로 바꿉니다.

  • 관리형 워크로드 아이덴티티 개요 문서를 검토하세요.
  • Enable the Compute Engine API:

    gcloud services enable compute.googleapis.com

필요한 역할

다른 워크로드 인증을 위해 관리형 워크로드 아이덴티티 인증서를 사용하는 VM을 만드는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

개요

애플리케이션에 관리형 워크로드 아이덴티티를 사용하려면 다음 작업을 수행해야 합니다.

  1. 보안 관리자:

  2. Compute 관리자:

Identity and Access Management에서 관리형 워크로드 아이덴티티 구성

  • 관리형 워크로드 아이덴티티 인증 구성 의 안내를 따릅니다.

    이 안내에서는 다음을 완료하는 방법을 자세히 설명합니다.

    • 워크로드 아이덴티티 풀을 만듭니다.
    • 워크로드 아이덴티티 풀에서 네임스페이스를 만듭니다. 네임스페이스를 사용하여 관리형 워크로드 아이덴티티의 관리 경계(예: 조직에서 소유한 각 애플리케이션의 네임스페이스)를 만듭니다.
    • 워크로드 아이덴티티 풀의 네임스페이스에 관리형 워크로드 아이덴티티를 만듭니다. 예를 들어 애플리케이션의 네임스페이스를 만들고 해당 애플리케이션을 지원하는 마이크로서비스의 네임스페이스 내에 관리형 ID를 만들 수 있습니다.
    • 서비스 계정 만들기. Compute Engine VM은 VM에 연결된 Google Cloud 서비스 계정을 기반으로 관리형 워크로드 아이덴티티를 수신하도록 승인될 수 있습니다.
    • 워크로드에 관리형 워크로드 아이덴티티의 사용자 인증 정보를 발급할 수 있는 워크로드 증명 정책을 만듭니다. 관리형 워크로드 아이덴티티의 사용자 인증 정보를 발급하려면 워크로드가 지정된 프로젝트 내에 있어야 하며 서비스 계정이 연결되어 있어야 합니다.
    • 관리형 워크로드 ID의 인증서를 발급하도록 Certificate Authority Service를 구성합니다.
      • 루트 CA 풀 구성
      • 하위 CA 구성
      • 관리형 워크로드 아이덴티티를 승인하여 CA 풀에서 인증서 요청

파트너 메타데이터를 업로드할 구성 파일 가져오기

보안 관리자가 다음을 포함하는 JSON 파일을 생성합니다.

이 파일 이름은 CONFIGS.json이어야 합니다. MIG의 인스턴스 템플릿을 만들거나 개별 VM을 만들 때 이 파일을 사용합니다.

CONFIGS.json 파일은 다음과 비슷하게 표시됩니다.

  {
  "wc.compute.googleapis.com": {
     "entries": {
        "certificate-issuance-config": {
           "primary_certificate_authority_config": {
              "certificate_authority_config": {
                 "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
              }
           },
           "key_algorithm": "rsa-2048"
        },
        "trust-config": {
           "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
               "trust_anchors": [{
                  "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
                }]
           }
     }
  }
  },
  "iam.googleapis.com": {
     "entries": {
        "workload-identity": "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID"
     }
  }
  }
  

관리형 인스턴스 그룹(MIG)에 관리형 워크로드 아이덴티티 사용 설정

관리형 인스턴스 그룹(MIG)은 단일 항목으로 취급되는 가상 머신(VM) 인스턴스 그룹입니다. MIG의 각 VM은 인스턴스 템플릿을 사용하여 생성됩니다. MIG의 VM이 관리형 워크로드 아이덴티티를 사용하도록 설정하려면 인스턴스 템플릿에서 구성을 지정합니다.

인스턴스 템플릿 만들기

관리형 워크로드 아이덴티티 기능이 사용 설정된 인스턴스 템플릿을 만듭니다. 그런 다음 이 템플릿을 사용하여 관리형 인스턴스 그룹(MIG)을 만듭니다.

gcloud

gcloud beta compute instance-templates create 명령어를 사용하여 관리형 워크로드 아이덴티티를 사용 설정하는 새 인스턴스 템플릿을 만듭니다.

gcloud beta compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --metadata enable-workload-certificate=true \
    --partner-metadata-from-file CONFIGS.json

기본값을 사용하는 대신 머신 유형 및 이미지를 지정하는 등 인스턴스 템플릿을 만들 때 플래그를 추가하여 생성되는 VM을 맞춤설정할 수 있습니다.

다음을 바꿉니다.

  • INSTANCE_TEMPLATE_NAME: 새 템플릿의 이름입니다.
  • SERVICE_ACCOUNT_NAME: 관리형 ID의 수신이 허용되는 서비스 계정의 이름입니다.
  • PROJECT_ID: 서비스 계정이 생성된 프로젝트의 ID입니다.
  • CONFIGS.json: 인증서 발급 구성, 트러스트 구성, 관리형 워크로드 아이덴티티가 포함된 구성 파일입니다.

자세한 내용은 인스턴스 템플릿 만들기를 참조하세요.

템플릿에서 관리형 인스턴스 그룹 만들기

관리형 워크로드 아이덴티티를 사용 설정하는 인스턴스 템플릿을 사용하는 관리형 인스턴스 그룹을 만듭니다. 인스턴스 템플릿을 만드는 방법에 대한 자세한 내용은 인스턴스 템플릿 만들기를 참조하세요.

gcloud

인스턴스 템플릿 및 gcloud compute instance-groups managed create 명령어를 사용하여 MIG를 만듭니다.

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --size=SIZE \
    --template=INSTANCE_TEMPLATE_NAME \
    --zone=ZONE

다음을 바꿉니다.

  • INSTANCE_GROUP_NAME: 관리형 인스턴스 그룹의 고유 ID입니다. 유효한 이름에 대한 자세한 내용은 리소스 이름 지정을 참조하세요.
  • SIZE: 관리형 인스턴스 그룹의 크기입니다.
  • INSTANCE_TEMPLATE_NAME: MIG에서 VM을 만들 때 사용할 인스턴스 템플릿의 이름입니다.
  • ZONE: VM을 생성할 영역입니다.

MIG를 만드는 방법에 대한 자세한 내용은 관리형 인스턴스 그룹(MIG)을 만들기 위한 기본 시나리오를 참조하세요.

개별 VM에 관리형 워크로드 아이덴티티 사용 설정

VM을 만들거나 기존 VM의 파트너 메타데이터를 업데이트하여 VM의 관리형 워크로드 아이덴티티를 사용 설정할 수 있습니다.

관리형 워크로드 아이덴티티가 사용 설정된 VM 만들기

VM을 만들 때 VM에 관리형 워크로드 아이덴티티 기능을 사용 설정하려면 다음을 수행해야 합니다.

  • VM에 사용할 서비스 계정 지정
  • enable-workload-certificate 메타데이터 속성을 true로 설정
  • 인증서 발급 구성 및 트러스트 구성 정보를 파트너 메타데이터로 지정

gcloud

gcloud beta compute instances create 명령어를 사용하여 새 VM을 만듭니다. 보안 관리자로부터 제공받았거나 파트너 메타데이터를 업로드할 구성 파일 만들기의 안내에 따라 만든 CONFIGS.json 파일을 사용합니다.

  1. 관리형 워크로드 아이덴티티 기능이 사용 설정된 VM을 만듭니다.

    gcloud beta compute instances create INSTANCE_NAME \
       --zone=INSTANCE_ZONE \
       --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --metadata enable-workload-certificate=true \
       --partner-metadata-from-file CONFIGS.json
    

    기본값을 사용하는 대신 명령어에 다른 줄을 추가해 머신 유형, 이미지 등 VM을 구성할 수 있습니다. 자세한 내용은 VM 인스턴스 만들기 및 시작을 참조하세요.

    다음을 바꿉니다.

    • INSTANCE_NAME: VM의 고유한 이름입니다. 유효한 인스턴스 이름에 대한 자세한 내용은 리소스 이름 지정을 참조하세요.
    • INSTANCE_ZONE: VM을 만들 영역입니다.
    • SERVICE_ACCOUNT_NAME: 관리형 ID의 수신이 허용되는 서비스 계정의 이름입니다.
    • PROJECT_ID: 서비스 계정이 생성된 프로젝트의 ID입니다.
    • CONFIGS.json: 인증서 발급 구성, 트러스트 구성, 관리형 워크로드 아이덴티티 구성이 포함된 구성 파일의 이름입니다.

기존 VM에서 관리형 워크로드 아이덴티티 사용 설정

기존 VM에 관리형 워크로드 아이덴티티를 사용 설정하려면 VM을 업데이트하여 다음을 구성합니다.

  • enable-workload-certificate 메타데이터 속성을 true로 설정
  • 인증서 발급 구성 및 트러스트 구성 정보를 파트너 메타데이터로 지정

gcloud

이 태스크에서는 보안 관리자로부터 제공받았거나 파트너 메타데이터를 업로드할 구성 파일 만들기의 안내에 따라 만든 CONFIGS.json 파일을 사용합니다.

  1. 관리형 워크로드 아이덴티티를 사용 설정하도록 기존 VM의 구성을 업데이트합니다.

    gcloud beta compute instances update VM_NAME \
       --zone=ZONE \
       --metadata enable-workload-certificate=true \
       --partner-metadata-from-file CONFIGS.json
    

    다음을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • ZONE: VM이 있는 영역
    • CONFIGS.json: 인증서 발급 구성, 트러스트 구성, 관리형 워크로드 아이덴티티가 포함된 구성 파일입니다.

Linux VM에서 워크로드 사용자 인증 정보에 액세스

mTLS를 사용하여 워크로드 간 인증을 성공적으로 구성한 후에는 VM에서 발급된 사용자 인증 정보에 액세스할 수 있습니다.

Compute Engine 관리형 워크로드 아이덴티티 사용자 인증 정보와 관련 트러스트 번들에 액세스하는 방법에는 두 가지가 있습니다.

  • VM의 파일 시스템
  • Compute Engine 메타데이터 서버

VM의 파일 시스템을 사용하여 워크로드 사용자 인증 정보 및 트러스트 번들에 액세스

이 방법은 X.509 사용자 인증 정보와 트러스트 번들을 VM 파일 시스템 내의 특정 경로에 배치합니다. 애플리케이션은 파일 시스템에서 사용자 인증 정보 및 트러스트 번들을 직접 읽을 수 있습니다. 사용자 인증 정보를 가져오는 방법의 예시는 GitHub의 다음 예시를 참조하세요.

VM은 Compute Engine 게스트 에이전트 버전 20231103.01 이상을 실행해야 합니다. 다음 명령어를 사용하여 VM에서 Compute Engine 게스트 에이전트의 버전을 확인합니다.

gcloud compute instances get-serial-port-output INSTANCE_NAME | grep "GCE Agent Started"

게스트 에이전트의 버전이 20231103.01 미만인 경우 게스트 환경 업데이트의 안내에 따라 업데이트할 수 있습니다.

VM의 파일 시스템에서 워크로드 사용자 인증 정보 및 트러스트 번들을 사용하려면 다음 단계를 완료하세요.

  1. Compute Engine 게스트 에이전트를 설치하거나 버전 20231103.01 이상으로 업데이트합니다. 게스트 에이전트는 다음을 수행합니다.

    • Compute Engine 메타데이터 서버에서 사용자 인증 정보 및 트러스트 번들을 자동으로 가져옵니다.
    • X.509 인증서와 해당 비공개 키를 업데이트하는 동안 파일 시스템에 대한 원자적 쓰기를 보장합니다.
    • 예를 들어 mTLS 인증서가 순환될 때 사용자 인증 정보와 트러스트 번들을 자동으로 새로고침합니다.
  2. 게스트 OS에서 Compute Engine 게스트 에이전트를 설치하거나 업데이트하면 워크로드 새로고침 작업에서 /var/run/secrets/workload-spiffe-credentials 디렉터리를 만들고 디렉터리 권한을 0755 (rwxr-xr-x)로 설정합니다.

    디렉터리에는 0644 (rw-r--r--) 권한으로 만든 다음 파일이 포함됩니다.

    • private_key.pem: PEM 형식의 비공개 키
    • certificates.pem: 다른 VM에 클라이언트 인증서 체인으로 제공하거나 서버 인증서 체인으로 사용할 수 있는 PEM 형식의 X.509 인증서 번들
    • ca_certificates.pem: 피어 인증서를 검증할 때 신뢰 앵커로 사용할 PEM 형식의 X.509 인증서 번들

      spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog
      
    • config_status: 오류 메시지가 포함된 로그 파일

  3. 애플리케이션은 파일 시스템에서 직접 인증서, 비공개 키, 트러스트 번들을 읽어 mTLS 연결을 설정할 수 있습니다.

메타데이터 서버를 사용하여 워크로드 사용자 인증 정보 및 트러스트 번들에 액세스

Compute Engine VM에서 실행되는 애플리케이션은 직접 메타데이터 서버 엔드포인트를 쿼리하고 사용자 인증 정보 및 트러스트 번들을 가져올 수 있습니다. 이 애플리케이션은 메타데이터 서버 엔드포인트를 주기적으로 확인하여 새 사용자 인증 정보 및 트러스트 번들에 대한 업데이트를 확인합니다.

Compute Engine 메타데이터 서버는 VM 내에서 실행되는 애플리케이션이 관리형 워크로드 아이덴티티 기능을 사용할 수 있도록 3개의 HTTP 엔드포인트를 노출합니다.

  • gce-workload-certificates/config-status: VM 메타데이터를 통해 제공된 구성 값의 오류가 포함된 엔드포인트입니다.
  • gce-workload-certificates/workload-identities: Compute Engine 제어 영역에서 관리하는 ID의 엔드포인트입니다. 이 엔드포인트에는 X.509 인증서 및 VM의 트러스트 도메인의 비공개 키가 포함됩니다.
  • gce-workload-certificates/trust-anchors: 피어 X.509 인증서 체인 검증을 위한 신뢰할 수 있는 인증서 집합이 포함된 엔드포인트입니다.

VM 인스턴스의 메타데이터 쿼리에 대한 자세한 내용은 VM 메타데이터 정보를 참조하세요.

메타데이터 서버를 사용하여 워크로드 사용자 인증 정보와 트러스트 번들에 액세스하려면 애플리케이션이 다음을 수행해야 합니다.

  1. gce-workload-certificates/config-status 엔드포인트를 쿼리합니다. HTTP 응답 코드가 200이고 응답에 partnerMetadataConfigsErrors 오류가 포함되어 있지 않은지 확인합니다. 이러한 오류가 있으면 인증서 발급 및 트러스트 구성 업데이트에 설명된 단계에 따라 유효한 값으로 적절한 구성을 업데이트합니다.

    값을 확인하려면 VM에서 다음 명령어를 실행하면 됩니다.

    curl "http://metadata.google.internal/computeMetadata/v1/instance/gce-workload-certificates/config-status" -H "Metadata-Flavor: Google"
    

    config-status 엔드포인트는 다음과 같은 구조의 JSON 응답을 반환합니다.

    {
        "partnerMetadataConfigsErrors": {
            "errors": {  // A map of errors keyed by attribute name.
                "ATTRIBUTE_NAME" : "ERROR_DETAILS",
                ...
            }
        }
    }
    
  2. gce-workload-certificates/workload-identities 엔드포인트를 쿼리합니다. HTTP 응답 코드가 200인지 확인합니다. 엔드포인트는 다음과 같은 구조의 JSON 응답을 반환합니다.

    {
     "workloadCredentials": {  // Credentials for the VM's trust domains
       "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID": {
          "certificatePem" : "X.509 certificate or certificate chain",
          "privateKeyPem" : "Private for X.509 leaf certificate"
       }
     }
    }
    

    certificatePemprivateKeyPem을 추출합니다. 관리형 워크로드 아이덴티티가 Compute Engine 인프라에서 새로고침된 경우 비공개 및 공개 키의 불일치를 방지하기 위해서는 두 값을 모두 동일한 응답에서 읽는 것이 중요합니다.

  3. gce-workload-certificates/trust-anchors 엔드포인트를 쿼리합니다. HTTP 응답 코드가 200인지 확인합니다. 응답에는 SPIFFE 트러스트 도메인의 신뢰 앵커만 포함됩니다(지정된 경우). 그렇지 않으면 쿼리가 오류를 반환합니다. trust-anchors 엔드포인트는 다음과 같은 구조의 JSON 응답을 반환합니다.

    {
        "trustAnchors": {  // Trust bundle for the VM's trust domains
            "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
                "trustAnchorsPem" : "Trust bundle containing the X.509
                roots certificates"
            }
        }
    }
    

    trustAnchorsPem의 콘텐츠에는 mTLS 연결을 설정할 때 피어 X.509 사용자 인증 정보를 인증하는 데 사용할 수 있는 트러스트 번들이 포함되어 있습니다.

사용자 인증 정보 및 트러스트 번들 새로고침

Compute Engine 제어 영역은 관리형 워크로드 아이덴티티 사용자 인증 정보와 신뢰 앵커를 주기적으로 자동 순환합니다.

애플리케이션이 파일 시스템을 사용하여 워크로드 사용자 인증 정보와 트러스트 번들에 액세스하는 경우 Compute Engine 게스트 에이전트는 사용자 인증 정보 및 트러스트 번들을 자동으로 새로고침합니다(예: mTLS 인증서가 순환될 때).

애플리케이션이 메타데이터 서버를 쿼리하는 경우 VM에서 실행되는 애플리케이션에서 주기적으로 메타데이터 서버 엔드포인트를 쿼리하여 최신 관리형 워크로드 아이덴티티 사용자 인증 정보 및 트러스트 번들 집합을 가져와야 합니다. 실패할 경우 인증서 만료 또는 트러스트 번들 변경사항으로 인해 애플리케이션이 중단되어 mTLS 연결 설정이 실패할 수 있습니다. 애플리케이션에서 5분마다 메타데이터 서버에 관리형 워크로드 아이덴티티 사용자 인증 정보와 트러스트 번들을 쿼리하는 것이 좋습니다.

인증서 발급 및 트러스트 구성 업데이트

관리형 워크로드 아이덴티티를 사용하는 VM에 대한 인증서 발급 구성 및 트러스트 구성을 수정할 수 있습니다.

관리형 인스턴스 그룹의 인스턴스 템플릿 업데이트

인스턴스 템플릿에서 인증서 발급 구성 및 트러스트 구성 값을 업데이트하려면 새 값으로 새 템플릿을 만들어야 합니다. 따라서 기존 관리형 인스턴스 그룹(MIG)의 인증서 발급 구성 및 트러스트 구성의 업데이트는 지원되지 않습니다.

개별 Compute Engine VM 업데이트

인증서 발급 구성과 트러스트 구성을 업데이트하려면 CONFIGS.json 파일의 콘텐츠를 업데이트하고 gcloud beta compute instances update 명령어를 사용하여 업데이트를 적용합니다.

gcloud beta compute instances update INSTANCE_NAME \
    --partner-metadata-from-file FILENAME.json

다음을 바꿉니다.

  • INSTANCE_NAME: 구성 값을 업데이트할 VM의 이름
  • FILENAME: 수정된 구성 파일의 이름(예: CONFIGS.json)

문제 해결

워크로드 사용자 인증 정보 가져오기와 관련된 일반적인 오류를 진단하고 해결하는 방법은 워크로드 간 인증 문제 해결 문서를 참조하세요.

다음 단계