4.9.5. 신뢰할 수 있는 암호화 키
신뢰할 수 있고 암호화된 키는 커널 키링 서비스를 활용하는 커널에서 생성된 가변 길이의 대칭 키입니다. 키가 암호화되지 않은 형태로 사용자 공간에 표시되지 않는다는 사실은 무결성을 확인할 수 있음을 의미하며, 이는EVM(Extended verification module)에 의해 실행 중인 시스템의 무결성을 검증하고 확인할 수 있음을 의미합니다. 사용자 수준 프로그램은 암호화된 Blob 형식의 키만 액세스할 수 있습니다.
신뢰할 수 있는 키에는 키를 만들고 암호화(seal)하는 데 사용되는 신뢰할 수 있는 플랫폼 모듈 (TPM) 칩이 필요합니다. TPM 은 스토리지 루트 키(SRK)라는 2048비트
RSA
키를 사용하여 키를 봉인합니다.
그 외에도, 신뢰할 수 있는 키는 TPM 의플랫폼 구성 레지스터 (PCR) 값의 특정 세트를 사용하여 봉인될 수도 있습니다. PCR 에는 BIOS, 부트 로더 및 운영 체제를 반영하는 무결성 관리 값 세트가 포함되어 있습니다. 즉, PCR-sealed 키는 암호화된 정확히 동일한 시스템에서 TPM 에서만 해독할 수 있습니다. 그러나 PCR-sealed 신뢰할 수 있는 키가 로드되면(인증 키에 추가) 연결된 PCR 값이 확인되면 새 커널(예: 새 커널이 부팅될 수 있도록) 새 (또는 향후) PCR 값으로 업데이트할 수 있습니다. 단일 키는 각각 다른 PCR 값을 가진 여러 Blob으로 저장할 수도 있습니다.
암호화된 키에는 TPM 이 필요하지 않으므로 커널
AES
암호화를 사용하므로 신뢰할 수 있는 키보다 더 빨라집니다. 암호화된 키는 커널 생성 임의 번호를 사용하여 생성되고 마스터 키로 사용자 공간 Blob으로 내보낼 때 암호화됩니다. 이 마스터 키는 신뢰할 수 있는 키 또는 사용자 키가 될 수 있습니다. 마스터 키가 신뢰할 수 있는 키가 아닌 경우 암호화 키는 암호화하는 데 사용되는 사용자 키만큼만 안전합니다.
4.9.5.1. 키 작업
키를 사용하여 작업을 수행하기 전에 신뢰할 수 있고 암호화된 키 커널 모듈이 시스템에 로드되어야 합니다. 다른 RHEL 커널 아키텍처에 커널 모듈을 로드하는 동안 다음 사항을 고려하십시오.
x86_64
아키텍처를 사용하는 RHEL 커널의 경우 TRUSTED_KEYS 및 ENCRYPTED_KEYS 코드는 코어 커널 코드의 일부로 빌드됩니다. 결과적으로x86_64
시스템 사용자는 신뢰할 수 있고 암호화된 키 모듈을 로드하지 않고도 이러한 키를 사용할 수 있습니다.- 다른 모든 아키텍처의 경우 키를 사용하여 작업을 수행하기 전에 신뢰할 수 있고 암호화된 키 커널 모듈을 로드해야 합니다. 커널 모듈을 로드하려면 다음 명령을 실행합니다.
~]# modprobe trusted encrypted-keys
keyctl 유틸리티를 사용하여 신뢰할 수 있고 암호화된 키를 생성, 로드, 내보내기 및 업데이트할 수 있습니다. keyctl 사용에 대한 자세한 내용은 keyctl(1) 을 참조하십시오.
참고
TPM (예: 신뢰할 수 있는 키를 만들고 봉인하는 경우)을 사용하려면 활성화 및 활성 상태여야 합니다. 이는 일반적으로 시스템의 BIOS 설정 또는 유틸리티의 tpm-tools 패키지에 있는 tpm_setactive 명령을 사용하여 수행할 수 있습니다. 또한 TrouSers 애플리케이션을 설치해야 하며, TPM 과 통신하기 위해 실행되는 TrouSers 제품군의 일부인
tcsd
데몬을 설치해야 합니다.
TPM 을 사용하여 신뢰할 수 있는 키를 만들려면 다음 구문으로 keyctl 명령을 실행합니다.
~]$ keyctl add trusted name "new keylength [options]" keyring
위의 구문을 사용하여 예제 명령을 다음과 같이 구성할 수 있습니다.
~]$ keyctl add trusted kmk "new 32" @u
642500861
위의 예제에서는 길이가 32바이트(256비트)인
kmk
라는 신뢰할 수 있는 키를 생성하고 사용자 인증 키(@u
)에 배치합니다. 키 길이는 32~128바이트(256비트에서 1024비트)를 가질 수 있습니다. show 하위 명령을 사용하여 커널 인증 키의 현재 구조를 나열합니다.
~]$ keyctl show
Session Keyring
-3 --alswrv 500 500 keyring: _ses
97833714 --alswrv 500 -1 \_ keyring: _uid.1000
642500861 --alswrv 500 500 \_ trusted: kmk
print 하위 명령은 암호화된 키를 표준 출력에 출력합니다. 키를 사용자 공간 Blob으로 내보내려면 파이프 하위 명령을 다음과 같이 사용합니다.
~]$ keyctl pipe 642500861 > kmk.blob
사용자 공간 Blob에서 신뢰할 수 있는 키를 로드하려면 Blob을 인수로 다시 추가합니다.To load the trusted key from the user-space blob, use the add command again with the blob as an argument:
~]$ keyctl add trusted kmk "load `cat kmk.blob`" @u
268728824
그런 다음 TPM-sealed trusted key를 사용하여 암호화 된 보안 키를 만들 수 있습니다. 다음 명령 구문은 암호화된 키를 생성하는 데 사용됩니다.
~]$ keyctl add encrypted name "new [format] key-type:master-key-name keylength" keyring
위의 구문을 기반으로 이미 생성된 신뢰할 수 있는 키를 사용하여 암호화된 키를 생성하는 명령을 다음과 같이 구성할 수 있습니다.
~]$ keyctl add encrypted encr-key "new trusted:kmk 32" @u
159771175
TPM 을 사용할 수 없는 시스템에서 암호화된 키를 만들려면 임의의 숫자 시퀀스를 사용하여 사용자 키를 생성한 다음 실제 암호화된 키를 봉인하는 데 사용됩니다.
~]$ keyctl add user kmk-user "`dd if=/dev/urandom bs=1 count=32 2>/dev/null`" @u
427069434
그런 다음 random-number 사용자 키를 사용하여 암호화된 키를 생성합니다.
~]$ keyctl add encrypted encr-key "new user:kmk-user 32" @u
1012412758
list 하위 명령을 사용하여 지정된 커널 인증 키의 모든 키를 나열할 수 있습니다.
~]$ keyctl list @u
2 keys in keyring:
427069434: --alswrv 1000 1000 user: kmk-user
1012412758: --alswrv 1000 1000 encrypted: encr-key
중요
마스터 신뢰할 수 있는 키로 봉인되지 않은 암호화된 키는 암호화하는 데 사용되는 사용자 마스터 키(random-number 키)만큼만 안전합니다. 따라서 마스터 사용자 키는 부팅 프로세스 중 가능한 한 안전하게 로드되어야 하며 부팅 프로세스 중 초기에 가급적이어야 합니다.