TPM은 암호화되지 않은 디스크 암호화 키를 저장할 위치에 대한 "닭과 달걀" 문제를 해결하여 시스템에 다른 하드 드라이브를 추가하거나 다른 운영 체제를 부팅하고 디스크/플래시/BIOS/읽기에서 직접 실행할 수 없도록 해야 합니다. 열쇠...
내가 아는 한, TPM은 기본적으로 실행되는 소프트웨어를 확인하여 이 작업을 수행하며, 해당 소프트웨어가 사전 설정된 해시와 일치하지 않으면 잠긴 상태를 유지하고 디스크 암호화 키 제공을 거부합니다.
systemd가 LUKS 키를 TPM에 내장하는 데 도움이 될 수 있다는 기사를 많이 읽었습니다.systemd-cryptenroll. 그러나 여기에는 TPM에 키를 내장하는 것만 포함되며 공격자가 해당 키를 읽는 것을 막지는 못합니다.
제가 막힌 부분은 BIOS 펌웨어에서 로그인까지 견고한 신뢰 체인이 있는지 확인하여 OS가 변조된 경우 부팅되지 않거나 TPM이 암호화 전달을 거부하도록 보장하는 방법을 찾는 것입니다. 열쇠.
E예를 들어, 터미널의 누군가가 grub 프롬프트를 누르고 Linux를 부팅하여 비밀번호 없이 루트 로그인을 제공할 수 있다면 init=/bin/bash
내 하드 드라이브를 암호화하는 데 별로 쓸모가 없습니다 . 이 경우 암호화는 전혀 의미가 없습니다.
나는 상당히 구체적인 두 가지 점을 고수합니다.
- 일반적인 시스템 기반 배포판(Debian 또는 Ubuntu)이 처음에 TPM을 잠그는 방법입니다. 이는 어떤 파일이 변조되지 않도록 보호합니까?
- 변조를 방지하기 위해 부팅 순서에서 또 무엇을 적용해야 합니까?
- 예: grub EFI 바이너리 파일, EFI의 grub.cfg, 시작 항목 편집을 위한 grub 암호, initramfs,...
답변1
제가 막힌 부분은 BIOS 펌웨어에서 로그인까지 견고한 신뢰 체인이 있는지 확인하여 OS가 변조된 경우 부팅되지 않거나 TPM이 암호화 전달을 거부하도록 보장하는 방법을 찾는 것입니다. 열쇠.
이는 프로세스에 내장되어 있으며 --tpm-pcrs=
systemd-cryptenroll에 제공하는 옵션입니다.
TPM은 시스템 펌웨어, 부트 로더 및 경우에 따라 운영 체제에서 제공하는 다양한 이벤트의 메모리에 "이벤트 로그"를 유지합니다. 각 이벤트는 시스템의 일부를 "측정"합니다. 예를 들어 펌웨어는 grubx64.efi 실행 파일이 로드될 때 해시를 기록하고 GRUB는 모든 명령을 기록하고 (아마도?) 실행 중인 커널 이미지를 기록합니다. ; 커널은 initrd의 해시와 명령줄의 해시를 기록합니다. 각 이벤트는 TPM 메모리에 저장된 해시 체인을 "확장"합니다.
이러한 모든 측정의 대상은 각각 SHA 해시 값을 보유하는 PCR("플랫폼 구성 레지스터") 세트입니다. 각 이벤트는 다음 공식을 사용하여 PCR 중 하나를 확장합니다.
new_value = H(old_value || event_data_hash)
따라서 PCR의 최종 해시는 해당 PCR에 대한 전체 이벤트 체인을 확인합니다. 마치 단일 Git 커밋 해시가 그에 이르는 커밋의 전체 기록을 확인하는 것과 같습니다. (이벤트 로그는 하나이지만 이벤트당 하나의 PCR만 업데이트되므로 각 PCR은 독립적인 해시 체인으로 작동합니다.)
PCR 자체는 아무 작업도 수행하지 않지만 "봉인" 작업을 사용하여 다음을 지정할 수 있습니다.정책특정 값을 갖기 위해 특정 PCR이 필요할 수 있습니다. 정책이 충족되지 않으면 TPM은 데이터 차단 해제를 거부합니다.
따라서 TPM에서 LUKS 볼륨 키를 봉인(암호화)하라는 요청을 받을 때마다 사용자가 지정한 내용에 따라 정책이 systemd-cryptenroll
포함됩니다 . --tpm-pcrs=
정확히 보호되는 대상은 선택한 PCR에 따라 다릅니다.
예를 들어 PCR[4]에는 실행 중인 각 .efi 실행 파일을 측정하는 펌웨어 생성 이벤트가 포함됩니다. (자체 내장된 부트로더가 있는 "EFI 스텁"으로 실행되는 경우 Linux 커널이 포함될 수 있습니다.) 업그레이드할 때마다 해시가 변경되므로 이는 성가실 수 있습니다. 따라서 BitLocker를 사용하면 Windows는 일반적으로 변조 방지를 보안 부팅과 연결합니다. 이벤트가 포함된 PCR[7]로자격증실행 파일에 서명하는 데 사용됩니다. Microsoft의 "공식 Windows 자사 인증서"로 서명된 모든 것이 통과됩니다.
그런 다음 최신(5.17+) Linux 커널을 사용하여 initramfs도 측정하려는 경우 정책에 PCR[9]을 포함할 수 있습니다. 커널 명령줄의 경우 systemd-boot는 PCR[8]을 업데이트합니다. (GRUB이 언제 사용되는지는 잘 모르겠습니다.) 최근 시스템 개발자들은 커널과 initramfs가 포함된 "통합 커널 이미지"에 더 중점을 두고 있으며 전체 패키지가 함께 번들로 제공되는 것으로 확인됩니다. 단일 .efi 바이너리.
(나는 가지고있다오래된 프로젝트일반 기능 외에도 이벤트 로그를 텍스트 형식으로 덤프할 수도 있습니다. )
특히 Linux의 경우 PCR 인덱스 사용에 대한 확정되지 않은 가이드가 있습니다.여기.
우분투에서는 패키지tpm2 도구tpm2_eventlog
커널을 통해 TPM 이벤트 로그를 읽는 데 사용할 수 있는 명령이 포함되어 있습니다.
tpm2_eventlog /sys/kernel/security/tpm0/binary_bios_measurements
이를 통해 PCR 값을 생성하는 데 사용된 것이 무엇인지 정확하게 파악하고 어떤 파일과 설정이 변조되는 것을 효과적으로 방지할 수 있습니다.