VM을 안전하게 부팅

이 문서에서는 Google Distributed Cloud (GDC) 에어 갭의 가상 머신 (VM) 인스턴스에서 안전한 부팅 또는 가상화된 신뢰 플랫폼 모듈 (vTPM)을 사용 설정하는 방법을 설명합니다.

이 문서는 GDC 환경의 VM에서 보안 부팅 및 vTPM을 구성하는 플랫폼 관리자 또는 애플리케이션 운영자 그룹의 개발자를 대상으로 합니다. 자세한 내용은 GDC 에어 갭 문서 대상을 참조하세요.

보안 부팅 정보

보안 부트는 모든 부팅 구성요소의 디지털 서명을 확인하여 시스템에서 인증된 소프트웨어만 실행하도록 보장하고 확인에 실패하면 프로세스를 중지하는 기능입니다. 통합 확장 가능 펌웨어 인터페이스 (UEFI) 펌웨어를 사용하여 제조업체가 시스템 펌웨어, 부트로더, 로드된 바이너리에 서명하는 데 사용하는 인증서와 키를 관리합니다.

부팅할 때마다 UEFI 펌웨어는 저장된 승인된 키를 기준으로 각 구성요소의 디지털 서명을 확인하고 서명되지 않았거나 잘못 서명된 구성요소를 차단합니다. VM 인스턴스에서 보안 부팅을 사용 설정하려면 VM의 shieldConfig.bootType 필드를 uefi로, shieldConfig.enableSecureBoot를 true로 설정해야 합니다.

공식 UEFI 문서를 보려면 https://uefi.org/sites/default/files/resources/UEFI_Secure_Boot_in_Modern_Computer_Security_Solutions_2013.pdf를 참조하세요.

가상 신뢰 플랫폼 모듈 정보

vTPM은 시스템 액세스 인증에 사용되는 키와 인증서를 보호하는 특수한 가상 컴퓨터 칩입니다. vTPM에 대한 자세한 내용은 https://trustedcomputinggroup.org/trusted-platform-module-tpm-summary/를 참조하세요.

vTPM을 사용하여 보호 또는 봉인을 통해 보안 비밀을 보호할 수도 있습니다. 밀봉된 저장소에 관한 자세한 내용은 https://en.wikipedia.org/wiki/Trusted_Computing#SEALED-STORAGE를 참고하세요. 이 목적으로 vTPM을 사용하는 방법을 보여주는 Go 언어 예시는 GitHub의 Go-TPM 프로젝트(https://github.com/google/go-tpm)를 참조하세요.

시작하기 전에

gdcloud 명령줄 인터페이스 (CLI) 명령어를 사용하려면 gdcloud CLI를 다운로드, 설치, 구성했는지 확인합니다. Distributed Cloud의 모든 명령어는 gdcloud 또는 kubectl CLI를 사용하며 운영체제 (OS) 환경이 필요합니다.

kubeconfig 파일 경로 가져오기

Management API 서버에 대해 명령어를 실행하려면 다음 리소스가 있어야 합니다.

  1. Management API 서버의 kubeconfig 파일이 없는 경우 로그인하고 생성합니다.

  2. Management API 서버의 kubeconfig 파일 경로를 사용하여 이 안내의 MANAGEMENT_API_SERVER를 바꿉니다.

IAM 역할 요청

VM에서 보안 부팅 또는 vTPM을 사용 설정하는 데 필요한 권한을 얻으려면 IAM 프로젝트 관리자에게 가상 머신 프로젝트 관리자(project-vm-admin) 역할을 부여해 달라고 요청하세요.

모든 VM 역할은 VM이 있는 프로젝트의 네임스페이스에 바인딩되어야 합니다. 액세스 권한을 확인하는 단계를 따릅니다.

안전한 부팅 사용 설정

VM에 보안 부팅을 사용 설정합니다. 프로젝트 네임스페이스(PROJECT_NAMESPACE)에서 VM_NAME이라는 VM에 다음 안내를 사용합니다.

  1. 패치를 적용하기 전에 VM이 실행 중인 경우 중지합니다. VM이 실행되는 동안 shieldConfig를 패치하려고 하면 API에서 Forbidden 오류(Changes to shieldConfig are not allowed while the VM is running)를 반환합니다. 자세한 내용은 VM 중지를 참조하세요.

  2. VM 커스텀 리소스를 업데이트하여 보안 부팅을 사용 설정합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        bootType: uefi
        enableSecureBoot: true
    '
    

    다음 변수를 바꿉니다.

    • MANAGEMENT_API_SERVER: Management API 서버의 kubeconfig 파일입니다.
    • PROJECT_NAMESPACE: VM이 있는 프로젝트의 네임스페이스입니다.
    • VM_NAME: VM의 이름입니다.
  3. 패치를 성공적으로 적용한 후 VM 시작 안내에 따라 VM을 시작합니다.

  4. 보안 부팅을 사용 설정했는지 확인합니다. VM에 대한 SSH 연결을 설정하고 다음 명령어를 실행합니다.

    mokutil --sb-state
    

    보안 부트를 사용 설정하면 명령어가 SecureBoot enabled를 반환합니다.

    mokutil 도구에서 보안 부팅을 사용 설정하지 않았다고 보고하는 경우 보안 부팅 구성 문제 해결 섹션의 단계를 따르세요.

보안 부팅 구성 문제 해결

  1. 편집기에서 VM 커스텀 리소스를 엽니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    다음 변수를 바꿉니다.

    • MANAGEMENT_API_SERVER: Management API 서버의 kubeconfig 파일입니다.
    • PROJECT_NAMESPACE: VM이 있는 프로젝트의 네임스페이스입니다.
    • VM_NAME: VM의 이름입니다.
  2. 안전한 부팅 사용 설정의 spec 필드에 표시된 대로 누락된 필드나 값을 찾습니다. 필수 항목입니다.

  3. 누락되거나 잘못된 항목이 있으면 spec를 수정하여 누락된 필드를 추가하고 잘못된 값을 수정합니다.

  4. 파일을 저장합니다.

  5. VM 다시 시작의 단계를 따릅니다.

이전 단계를 수행해도 문제가 해결되지 않으면 VM의 운영체제 (OS)에 해당하는 문서를 확인하여 OS 버전이 보안 부트를 지원하는지 확인합니다.

vTPM 사용 설정

VM에 vTPM을 사용 설정합니다. 프로젝트 네임스페이스 (PROJECT_NAMESPACE)에서 VM_NAME이라는 VM에 다음 안내를 사용합니다.

  1. 패치를 적용하기 전에 VM이 실행 중인 경우 중지합니다. VM이 실행되는 동안 shieldConfig를 패치하려고 하면 API에서 Forbidden 오류(Changes to shieldConfig are not allowed while the VM is running)를 반환합니다. 자세한 내용은 VM 중지를 참조하세요.

  2. VM 커스텀 리소스를 업데이트하여 vTPM을 사용 설정합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        enableVtpm: true
    '
    

    다음 변수를 바꿉니다.

    • MANAGEMENT_API_SERVER: Management API 서버의 kubeconfig 파일입니다.
    • PROJECT_NAMESPACE: VM이 있는 프로젝트의 네임스페이스입니다.
    • VM_NAME: VM의 이름입니다.
  3. 패치를 성공적으로 적용한 후 VM 시작 안내에 따라 VM을 시작합니다.

  4. vTPM을 사용 설정했는지 확인합니다. VM에 대한 SSH 연결을 설정하고 다음 명령어를 실행합니다.

    dmesg | grep -i tpm
    

    vTPM을 사용 설정하면 명령어가 ACPI 테이블의 일부로 TPM 모듈을 반환합니다. 출력은 다음과 비슷합니다.

    [    7.620985] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0x1, rev-id 1)
    

    ACPI tables에 TPM 모듈이 표시되지 않으면 vTPM 구성 문제 해결 섹션의 단계를 따르세요.

vTPM 구성 문제 해결

  1. 편집기에서 VM 커스텀 리소스를 엽니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    다음 변수를 바꿉니다.

    • MANAGEMENT_API_SERVER: Management API 서버의 kubeconfig 파일입니다.
    • PROJECT_NAMESPACE: VM이 있는 프로젝트의 네임스페이스입니다.
    • VM_NAME: VM의 이름입니다.
  2. vTPM 사용 설정의 spec 필드에 표시된 대로 누락된 필드나 값을 찾습니다. 필수 항목입니다.

  3. 누락되거나 잘못된 항목이 있으면 spec를 수정하여 누락된 필드를 추가하고 잘못된 값을 수정합니다.

  4. 파일을 저장합니다.

  5. VM 다시 시작의 단계를 따릅니다.

이전 단계를 수행해도 문제가 해결되지 않으면 VM의 운영체제 (OS)에 해당하는 문서를 확인하여 OS 버전이 vTPM을 지원하는지 확인합니다.