Google이 프로덕션 머신에서 부팅 무결성을 적용하는 방법

이 콘텐츠는 2024년 5월에 마지막으로 업데이트되었으며 작성 당시의 상황을 나타냅니다. Google의 보안 정책 및 시스템은 고객 보호를 지속적으로 개선함에 따라 앞으로도 계속 변경될 수 있습니다.

이 문서에서는 Google이 Titan이 장착된 프로덕션 머신에서 부팅 프로세스 무결성을 시행하는 데 사용하는 인프라 제어를 설명합니다. 신중한 부팅 프로세스를 기반으로 하는 이러한 제어를 통해 Google은 데이터 센터 머신을 부팅 스택의 취약점으로부터 복구하고 머신을 임의의 부팅 상태에서 알려진 정상 구성으로 되돌릴 수 있습니다.

소개

데이터 센터 머신의 보안 상황은 부팅 시의 머신 구성에 따라 크게 달라집니다. 머신의 부팅 프로세스는 머신의 하드웨어를 구성하고 운영체제를 초기화하면서 Google의 프로덕션 환경에서 머신을 안전하게 실행합니다.

부팅 프로세스의 각 단계에서 Google은 기대하는 부팅 상태를 시행하고 고객 데이터를 보호하는 데 도움이 되도록 업계 최고의 제어를 구현합니다. 이러한 제어를 통해 머신이 의도한 소프트웨어로 부팅되도록 할 수 있으므로 머신의 초기 보안 상황을 손상시킬 수 있는 취약점을 삭제할 수 있습니다.

이 문서에서는 부팅 프로세스를 설명하고 부팅 흐름 중에 Google 제어가 작동하는 방식을 보여줍니다. 주요 제어 목표는 다음과 같습니다.

배경

이 섹션에서는 머신 사용자 인증 정보, 신뢰할 수 있는 하드웨어 루트, 실링된 사용자 인증 정보, 암호화 실링과 같은 용어를 정의하고 컨텍스트를 제공합니다.

머신 사용자 인증 정보

Google 머신 관리 시스템의 중심 구성요소 중 하나는 내부 인증 기관(CA)과 사용자 인증 정보 순환 흐름을 조정하는 기타 제어 영역 요소로 구성됩니다.

Google 프로덕션 Fleet의 머신은 보안 채널을 설정할 때 상호 인증을 수행합니다. 상호 인증을 수행하기 위해 각 머신에는 Google의 CA 공개 키가 있습니다. 또한 각 머신에는 자체 공개 키/비공개 키 쌍과 해당 키 쌍에 대한 인증서가 있습니다.

각 머신의 공개 키/비공개 키 쌍을 CA에서 서명한 인증서와 함께 머신 사용자 인증 정보라고 하며, 머신은 이를 사용하여 Fleet의 다른 머신에 자신을 인증합니다. 프로덕션 네트워크 내에서 머신은 트래픽을 교환하기 전에 다른 머신의 공개 키가 Google CA에서 인증되었는지 확인합니다.

신뢰할 수 있는 하드웨어 루트 및 암호화 실링

컴퓨팅 기기가 더 정교해짐에 따라 각 기기의 공격 표면도 커집니다. 이를 고려하여 기기에는 머신의 민감한 정보를 보호하는 작고 신뢰할 수 있는 실행 환경인 신뢰할 수 있는 하드웨어 루트(RoT)가 점점 더 많이 사용됩니다. 또한 RoT는 노트북 또는 휴대전화와 같은 휴대기기에 표시되며 데스크톱 PC와 같은 일반적인 기기에도 표시됩니다.

Google의 데이터 센터 머신은 각 머신의 가장 깊은 레이어에 통합된 Google에서 설계한 신뢰할 수 있는 커스텀 하드웨어 루트를 특징으로 하며, 이는 Titan이라고 알려져 있기도 합니다. Google에서는 암호화 실링이라는 메커니즘과 함께 Titan을 사용하여 각 머신이 예상한 구성 및 소프트웨어 버전을 실행하도록 합니다.

암호화 실링은 보안 비밀을 보호하는 데 사용되는 Titan에서 제공하는 서비스입니다. Titan의 실링 기능은 신뢰할 수 있는 컴퓨팅 그룹에서 게시한 신뢰 플랫폼 모듈(TPM) 사양의 실링 기능과 비슷합니다. Titan의 암호화 실링에는 하위 수준 펌웨어를 측정하고 증명하는 데 더욱 우수한 기능을 제공한다는 추가 이점이 있습니다.

암호화 실링은 다음 두 가지 제어로 구성됩니다.

  • 민감한 정보 암호화
  • 데이터를 복호화하기 전에 충족해야 하는 정책

실링된 사용자 인증 정보

Google의 사용자 인증 정보 인프라는 암호화 실링을 사용하여 머신의 신뢰할 수 있는 하드웨어 루트로 제어되는 키로 머신 사용자 인증 정보를 암호화합니다. 암호화된 사용자 인증 정보 비공개 키와 해당 인증서를 실링된 사용자 인증 정보라고 합니다. Google은 머신 사용자 인증 정보 외에도 이러한 실링 메커니즘을 사용하여 다른 민감한 정보도 보호합니다.

각 머신은 머신에서 부팅해야 하는 소프트웨어를 지정하는 복호화 정책을 충족할 수 있는 경우에만 머신 사용자 인증 정보를 복호화하고 액세스할 수 있습니다. 예를 들어 머신의 사용자 인증 정보를 의도된 운영체제 커널 출시 버전을 지정하는 정책에 실링하면 의도된 커널 버전을 부팅하지 않은 한 머신이 머신 클러스터에 참여할 수 없습니다.

복호화 정책은 신중한 부팅이라는 프로세스를 통해 적용됩니다. 부팅 스택의 모든 레이어는 다음 레이어를 측정하며 머신은 부팅이 끝날 때 이 측정 체인을 증명합니다. 이 측정값이 암호화 해시인 경우가 많습니다.

사용자 인증 정보 실링 프로세스

이 섹션에서는 Google 머신에서 사용되는 사용자 인증 정보 실링 및 신중한 부팅 프로세스에 대해 설명합니다. 이 흐름을 다이어그램으로 나타내면 다음과 같습니다.

사용자 인증 정보 실링 흐름

머신의 사용자 인증 정보를 특정 부팅 정책에 실링하려면 다음 단계가 수행됩니다.

  1. Google의 머신 자동화 인프라가 머신에서 소프트웨어 업데이트를 시작합니다. 의도된 소프트웨어 버전을 사용자 인증 정보 인프라에 전달합니다.
  2. Google의 사용자 인증 정보 인프라는 머신이 원하는 소프트웨어로 부팅되는 경우에만 Titan에 사용되도록 하는 정책 제약이 있는 Titan 실링 키를 요청합니다.
  3. 사용자 인증 정보 인프라는 반환된 키의 정책을 머신 자동화 인프라에서 전달한 인텐트와 비교합니다. 사용자 인증 정보 인프라가 정책이 인텐트와 일치한다고 충족되면 인증된 머신 사용자 인증 정보를 머신에 발급합니다.
  4. 사용자 인증 정보 인프라는 2단계에서 조달된 실링 키를 사용하여 이 사용자 인증 정보를 암호화합니다.
  5. 암호화된 사용자 인증 정보는 이후 부팅 시 Titan에서 복호화할 수 있도록 디스크에 저장됩니다.

신중한 부팅 프로세스

Google 머신 부팅 스택은 다음 다이어그램과 같이 레이어 4개로 구성됩니다.

신중한 부팅 프로세스의 레이어 4개

레이어는 다음과 같습니다.

  • 사용자 공간: 데몬 또는 워크로드와 같은 애플리케이션입니다.
  • 시스템 소프트웨어: 하이퍼바이저 또는 커널입니다. 사용자 공간에 대한 네트워킹, 파일 시스템 또는 가상 메모리와 같은 하드웨어 기능을 추상화하는 가장 낮은 계층의 소프트웨어입니다.
  • 부팅 펌웨어: BIOS 및 부트로더와 같이 커널을 초기화하는 펌웨어입니다.
  • 신뢰할 수 있는 하드웨어 루트: Google 머신에서 펌웨어 및 기타 하위 수준 CPU 서비스를 암호화 방식으로 측정하는 Titan 칩입니다.

부팅 중에 각 레이어는 다음 레이어를 측정한 후 해당 레이어에 제어를 전달합니다. 부팅 시 캡처된 모든 측정 데이터가 Google의 사용자 인증 정보 인프라에 지정된 대로 실링된 사용자 인증 정보의 복호화 정책을 준수하는 경우에만 머신의 실링된 사용자 인증 정보가 운영체제에 제공됩니다. 따라서 머신이 실링된 사용자 인증 정보로 작업을 수행할 수 있으면 이는 머신이 신중한 부팅 정책을 충족했다는 증거입니다. 이 프로세스는 암시적 증명 형식입니다.

머신이 의도한 상태에서 벗어나 소프트웨어를 부팅하면 머신은 Fleet 내에서 작동하는 데 필요한 사용자 인증 정보를 사용하여 작업을 복호화하고 수행할 수 없습니다. 이러한 머신은 머신 관리 인프라가 자동 복구 작업을 트리거할 때까지 워크로드 예약에 참여할 수 없습니다.

커널의 취약점 복구

머신에서 커널 버전 A를 실행 중이지만 보안 연구원이 이 커널 버전에 취약점이 있다는 것을 발견했다고 가정해 보겠습니다. 이러한 시나리오에서 Google은 취약점을 패치하고 업데이트된 커널 버전 B를 Fleet에 출시합니다.

취약점 패치 외에도 Google은 Fleet에 있는 각 머신에 새로운 머신 사용자 인증 정보를 발급합니다. 사용자 인증 정보 실링 프로세스에 설명된 대로 새 머신 사용자 인증 정보는 커널 버전 B가 머신에서 부팅되는 경우에만 충족되는 복호화 정책에 바인딩됩니다. 부팅 펌웨어 측정값이 머신 부팅 정책을 충족하지 않으므로 의도된 커널이 실행되지 않는 머신에서는 새 머신 사용자 인증 정보를 복호화할 수 없습니다. 이 프로세스의 일환으로 이전 머신 사용자 인증 정보도 취소됩니다.

따라서 이러한 머신은 커널이 컨트롤 플레인 인텐트를 준수하도록 업데이트될 때까지 머신 클러스터에 참여할 수 없습니다. 이러한 제어는 취약한 커널 버전 A가 실행되는 머신이 커널 버전 B로 업그레이드될 때까지 작업이나 사용자 데이터를 수신하지 못하도록 합니다.

부팅 펌웨어의 취약점 복구

부팅 펌웨어에 운영체제 커널 대신 취약점이 있다고 가정해 보겠습니다. Google은 커널의 취약점 복구에 설명된 것과 동일한 제어로 이러한 취약점을 복구할 수 있습니다.

Google의 Titan 칩은 머신이 실행되기 전에 머신의 부팅 펌웨어를 측정하므로 Titan은 부팅 펌웨어가 시스템 사용자 인증 정보의 부팅 정책을 충족하는지 확인할 수 있습니다. 의도된 부팅 펌웨어가 실행되지 않는 머신은 새로운 머신 사용자 인증 정보를 가져올 수 없으며 부팅 펌웨어가 컨트롤 플레인 인텐트를 준수할 때까지 머신 클러스터에 참여할 수 없습니다.

신뢰할 수 있는 루트 펌웨어 취약점 복구

RoT가 취약점의 영향을 받지 않지만 Google의 부팅 제어를 통해 부트 스택의 이 레이어에서도 RoT 자체 변경 가능 코드 내에서 버그로부터 복구할 수 있습니다.

Titan의 부팅 스택은 자체적으로 안전하고 신중한 부팅 흐름을 구현합니다. Titan 칩의 전원이 켜지면 하드웨어가 Titan의 부트로더를 암호화하여 측정하고, 이 부트로더는 다시 Titan 펌웨어를 측정합니다. 머신의 커널과 부팅 펌웨어와 마찬가지로 Titan 펌웨어는 버전 번호를 사용하여 암호화 서명됩니다. Titan의 부트로더는 서명을 검증하고 Titan 펌웨어의 버전 번호를 추출하여 버전 번호를 Titan의 하드웨어 기반 키 파생 하위 시스템에 제공합니다.

Titan의 하드웨어 하위 시스템은 버전이 지정된 키 파생 스키마를 구현하며, 여기서 버전이 X인 Titan 펌웨어는 X보다 낮거나 같은 모든 버전에 바인딩된 칩 고유 키를 얻을 수 있습니다. Titan 하드웨어를 사용하면 버전이 X인 펌웨어가 X보다 낮거나 같지만 X보다 높지 않은 버전에 바인딩된 키에 액세스할 수 있습니다. 머신 사용자 인증 정보를 포함하여 Titan에 실링된 모든 보안 비밀은 버전이 지정된 키를 통해 암호화됩니다.

증명 및 실링 키는 각 Titan 칩마다 다릅니다. 고유 키를 사용하면 Google은 Google 데이터 센터 내에서 실행될 것으로 예상되는 Titan 칩만 신뢰합니다.

다음 다이어그램에서는 버전 키가 있는 Titan을 보여줍니다. 버전 X 펌웨어에서 버전 X+1 키에 액세스할 수 없지만 그보다 오래된 모든 키에 액세스할 수 있습니다.

Titan 버전

Titan 펌웨어에 심각한 취약점이 발생하면 Google이 더 큰 버전 번호로 패치를 출시한 후 상위 Titan 펌웨어 버전에 바인딩되는 새 머신 사용자 인증 정보를 발급합니다. 이전의 취약한 Titan 펌웨어는 이러한 새 사용자 인증 정보를 복호화할 수 없습니다. 따라서 머신이 프로덕션에서 새 사용자 인증 정보를 사용하여 작업을 수행하면 Google은 머신의 Titan 칩에서 최신 Titan 펌웨어를 부팅했다는 확신을 가질 수 있습니다.

신뢰할 수 있는 루트 신뢰성 보장

이 문서에서 설명한 제어 기능은 모두 하드웨어 RoT의 자체 기능에 의존합니다. Google의 사용자 인증 정보 인프라는 이러한 RoT에서 내보내진 서명을 사용하여 머신이 의도한 소프트웨어를 실행하는지 확인합니다.

따라서 사용자 인증 정보 인프라에서 하드웨어 RoT가 인증되었는지, RoT가 최신 펌웨어를 실행하고 있는지 확인할 수 있습니다.

각 Titan 칩이 제조될 때 고유한 엔트로피로 프로그래밍됩니다. Titan의 하위 수준 부팅 루틴은 해당 엔트로피를 기기 고유 키로 변환합니다. Titan 제조 라인의 보안 요소는 Google에서 합법적인 Titan 칩으로 인식할 수 있도록 이 칩 고유 키를 보증합니다.

다음 다이어그램은 이 보증 프로세스를 보여줍니다.

Titan 보증 프로세스입니다.

프로덕션 단계에서 Titan은 기기 고유 키를 사용하여 내보내는 모든 서명을 보증합니다. Titan 칩은 기기 식별자 구성 엔진(DICE)과 비슷한 흐름을 사용합니다. 보증에는 Titan 펌웨어 버전 정보가 포함됩니다. 이 증명은 공격자가 Titan 칩에서 내보낸 서명을 가장하고 이전 Titan 펌웨어로 롤백하고 새 Titan 펌웨어를 가장하지 못하도록 하는 데 도움이 됩니다. 이러한 제어를 통해 Google은 Titan에서 수신된 서명을 신뢰할 수 있는 Titan 펌웨어를 실행하는 신뢰할 수 있는 Titan 하드웨어에서 내보냈는지 확인할 수 있습니다.

부팅 무결성 빌드

이 논문은 머신의 애플리케이션 프로세서가 의도된 코드를 부팅하도록 보장하는 메커니즘을 설명합니다. 이러한 메커니즘은 하드웨어 신뢰할 수 있는 루트 칩과 결합된 신중한 부팅 흐름에 의존합니다.

Google의 위협 모델에는 머신의 복호화된 사용자 인증 정보를 부적절하게 얻기 위해 CPU와 RoT 간의 버스에 물리적으로 개입할 수 있는 공격자가 포함됩니다. 이러한 위험을 최소화하기 위해 Google은 신뢰 컴퓨팅 그룹의 TPMDPE API와 Caliptra 신뢰할 수 있는 통합 루트를 결합하여 활성 침입자를 무력화하는 표준 기반 접근 방식을 개발하고 있습니다.

다음 단계

저자: 제프 앤더슨, 케빈 플리본