커스텀 보안 이미지 만들기

이 주제에서는 디스크를 준비하고 보안 인증서를 생성하며 필요한 운영체제(OS) 기능을 사용 설정하여 커스텀 보안 이미지를 만드는 방법을 설명합니다.

기본적으로 보안 VM은 Container-Optimized OS, 다양한 Linux 배포판, 여러 Windows Server 버전을 지원합니다. 하지만 애플리케이션에 커스텀 이미지가 필요한 경우에도 보안 VM을 활용할 수 있습니다.

디스크 준비하기

보안 VM은 보안 부팅과 같은 기능을 지원하기 위해 Unified Extensible Firmware Interface(UEFI)를 준수하는 펌웨어를 사용합니다. 보안 VM에는 GUID 파티션 테이블(GPT) 스키마가 필요합니다. 마스터 부트 레코드(MBR)는 지원되지 않습니다.

디스크에는 2개 이상의 파티션이 있어야 합니다.

  • EFI 시스템 파티션(ESP): 이 파티션에는 100MB이면 충분하며 이는 제안일 뿐입니다. 필요한 경우 더 큰 파티션을 만들 수 있습니다. ESP의 유일한 요구사항은 파일 할당 테이블(FAT) 파일 시스템으로 포맷되어야 한다는 것입니다.
  • OS 파티션: 디스크의 나머지 부분입니다. 이 파티션에는 부팅 OS(Linux 또는 Windows)가 포함됩니다. 이 파티션의 크기에 대한 제한이 없습니다.

필요에 따라 데이터 파티션을 더 만들 수 있습니다.

OS를 OS 파티션에 복사하기

디스크가 올바르게 포맷되고 파티션이 나눠진 후 OS 파일을 OS 파티션에 복사합니다. OS에는 부트 로더가 있으며, 이 부트 로더는 UEFI 사양에 설명된 ESP의 유효한 경로(\EFI\Boot\bootx64.efi)에 위치해 있어야 합니다. OS 부트 로더를 지정된 위치에 복사해야 할 수도 있습니다.

Windows의 경우 OS 부트 로더를 올바른 위치로 복사하는 데 사용할 수 있는 bcdboot라는 명령어와 그 외 Windows에서 필요한 다른 작업(예: BCD 저장소 복사)이 있습니다. 자세한 내용은 Microsoft Hardware Dev Center의 BCDBoot 명령줄 옵션을 확인하세요.

보안 VM 이미지를 사용할 때는 vTPM(가상 신뢰 플랫폼 모듈)과 무결성 모니터링이라는 두 가지 추가 보안 기능을 활용할 수도 있습니다. 다음 섹션에서는 이러한 기능의 이점과 OS 요구사항을 간략하게 설명합니다.

vTPM(가상 신뢰 플랫폼 모듈)

TPM(Trusted Platform Module)은 시스템에 대한 액세스를 인증하는 데 사용하는 객체(예: 키 및 인증서)를 보호하는 기기입니다. 보안 VM 이미지에서는 신중한 부팅 기능을 사용 설정하는 데 TPM 기기의 가상화 버전(vTPM)을 사용합니다. 간단히 말해 신중한 부팅은 부팅 및 커널 드라이버의 중요한 로드 경로의 무결성을 보장합니다. vTPM 및 신중한 부팅에 대한 자세한 내용은 보안 VM 문서에서 다룹니다.

vTPM 및 신중한 부팅을 활용하려면 드라이버가 필요합니다. TPM 2.0을 지원하는 최소 OS 버전은 다음과 같습니다.

  • Windows Server 2012
  • Linux 3.20 버전
  • Red Hat Enterprise Linux 7.3

무결성 모니터링

무결성 모니터링은 VM 인스턴스의 상태를 이해하고 그에 대해 어떤 결정을 내릴 수 있는지에 대해 알려줍니다. 모니터링 시 신중한 부팅에서 생성된 데이터를 사용해 VM 인스턴스에 대한 정보를 보고합니다. 보안 VM 문서에서 무결성 모니터링무결성 확인 실패에 대한 응답 자동화에 대한 자세한 내용을 확인할 수 있습니다.

보안 VM 무결성 모니터링 기능을 지원하려면 이미지가 무결성 신호를 생성해야 합니다.

  • Windows는 기본적으로 무결성 신호를 생성합니다.
  • Linux에는 IMA(Integrity Measurement Architecture) 모듈이 설치 및 사용 설정되어 있어야 합니다. 모듈의 CONFIG_IMA_MEASURE_PCR_IDX는 10으로 설정되어 있어야 합니다. 이 값은 IMA 모듈의 기본값입니다.

디스크 이미지를 Compute Engine으로 가져오기

이미지가 준비되면 Compute Engine에 이미지를 업로드해야 합니다. 이미지를 Google Cloud에 업로드하는 데 필요한 단계는 Compute Engine에 부팅 디스크 이미지 가져오기를 참조하세요.

보안 부팅을 위한 인증서 설정하기

보안 VM 이미지를 추가할 때 일련의 보안 부팅 공개 인증서 및 데이터베이스가 Compute Engine에 전달됩니다. 이러한 파일은 해당하는 UEFI 변수에 저장되며 플랫폼, 펌웨어, OS 간의 트러스트 관계를 설정하는 데 사용됩니다. 인증서는 DER(고유한 인코딩 규칙)로 인코딩된 X.509 인증서입니다. 데이터베이스는 인증서 또는 원시 바이너리일 수 있습니다. 총 4개의 값이 있습니다.

  • 플랫폼 키(pk): 플랫폼 소유자와 펌웨어 간의 트러스트 관계를 설정하는 데 사용되는 키입니다. 플랫폼 키는 하나만 지정할 수 있으며 유효한 X.509 인증서여야 합니다.
  • 키 교환 키(kek): 펌웨어와 OS 간의 트러스트 관계를 설정하는 데 사용되는 키입니다. 이 값에 여러 개의 키를 지정할 수 있습니다.
  • 금지된 키 데이터베이스(dbx): 취소된 인증서 데이터베이스로, 부팅 파일이 해당 인증서 중 하나로 서명되면 시스템의 부팅이 중단됩니다. 이 값에 단일 또는 여러 값을 지정할 수 있습니다.
  • 키 데이터베이스(db): 신뢰할 수 있으며 부팅 파일에 서명하는 데 사용할 수 있는 인증서 데이터베이스입니다. 이 값에 단일 또는 여러 값을 지정할 수 있습니다.

UEFI 사양에는 이러한 값에 관한 자세한 정보와 작동 방식이 포함되어 있습니다.

다음 예시에서는 OpenSSL을 사용하여 보안 부팅 키와 인증서를 만듭니다.

  • 2048비트 RSA 키 쌍을 생성합니다.

      $ openssl genrsa -out secure-boot-key.rsa 2048
    
  • 키에서 DER 형식으로 자체 서명 X.509 인증서를 생성합니다.

      $ openssl req -new -x509 -sha256 -subj '/CN=secure-boot' -key secure-boot-key.rsa
      -outform DER -out secure-boot-cert.pem
    

Google Cloud에 보안 이미지 추가하기

업로드된 이미지와 인증서를 사용하여 이미지를 Compute Engine에 추가할 수 있습니다. Google Cloud CLI 또는 Compute Engine API를 사용하여 이미지를 추가할 수 있습니다.

gcloud

Compute Engine에 커스텀 이미지를 추가합니다.

gcloud compute images create [IMAGE_NAME] \
--source-disk [SOURCE_DISK] \
--source-disk-zone [ZONE] \
--platform-key-file=<file.der> \
--key-exchange-key-file=<file.der> \
--signature-database-file=<file.bin>,<file.der> \
--forbidden-database-file=<file.bin> \
--guest-os-features="UEFI_COMPATIBLE[,WINDOWS]"

각 항목의 의미는 다음과 같습니다.

  • [IMAGE_NAME]은 새 이미지의 이름입니다.
  • [SOURCE_DISK]는 새 이미지를 만들 디스크입니다.
  • [ZONE]은 디스크가 있는 영역입니다.

guest-os-featuresWINDOWS 옵션은 Windows 이미지를 사용할 때만 필요합니다. 이미지 만들기에 대한 자세한 내용은 gcloud create 참조를 확인하세요.

API

안내를 따라 영구 디스크에서 이미지를 생성하되 요청 본문에 initial_state_config를 지정합니다.

...
"sourceDisk": "/zones/[ZONE]/disks/[SOURCE_DISK]",

"initial_state_config": {
    "pk": {
        "content": [KEY],
        "fileType": [BIN,X509]
    },
    "keks": [
        {
            "content": [KEY],
            "fileType": [BIN,X509]
        },
        ...
    ],
    "dbxs": [
        {
            "content": [KEY],
            "fileType": [BIN,X509]
        },
        ...
    ],
    "dbs": [
        {
            "content": [KEY],
            "fileType": [BIN,X509]
        },
        ...
    ]
}

기본 인증서

pk, keks, dbxs, dbs 필드는 선택사항입니다. 초기 상태 구성을 제공하면 이 필드 중 일부 또는 전체가 설정되지 않은 상태일 수 있습니다. 미설정 필드에 커스텀 값을 설정하지 않는 한 이미지에서 새 인스턴스가 생성될 때 Google Cloud에서는 PK, KEK, db, dbx의 기본값을 제공합니다. 초기 상태 구성을 제공하지 않으면(구성이 단순히 비어 있는 상태가 아니라 누락된 상태) 이미지의 구성은 소스 이미지의 초기 상태 구성이 됩니다.

각 필드의 기본값은 다음과 같습니다.

  • PK: Google에서 만든 기본 비공개 키와 연결된 인증서
  • KEK: 기본 Microsoft KEK 인증서. Microsoft에서 다운로드: MicCorKEKCA2011_2011-06-24.crt
  • dbx: 기본 Microsoft DBX 해지 목록. Unified Extensible Firmware Interface 포럼에서 다운로드: UEFI 해지 목록 파일
  • db: 다음 두 인증서
    • SHA-1 인증서 해시가 58 0a 6f 4c c4 e4 b6 69 b9 eb dc 1b 2b 3e 08 7b 80 d0 67 8d인 Microsoft Windows 프로덕션 PCA 2011. Microsoft에서 다운로드: MicWinProPCA2011_2011-10-19.crt
    • SHA-1 인증서 해시가 46 de f6 3b 5c e6 1c f8 ba 0d e2 e6 63 9c 10 19 d0 ed 14 f3인 Microsoft Corporation UEFI CA 2011. Microsoft에서 다운로드: MicCorUEFCA2011_2011-06-27.crt

자체 인증서를 추가하면 기본 인증서와 병합되는 대신 자체 인증서가 기본 인증서를 덮어 쓰므로 주의해야 합니다.