8.5. IMA 및 EVM 활성화
무결성 측정 아키텍처(IMA) 및 EVM(확장 확인 모듈)을 활성화하고 구성하여 운영 체제의 보안을 개선할 수 있습니다.
항상 IMA와 함께 EVM을 활성화합니다.
EVM만 활성화할 수 있지만 EVM 평가는 IMA 평가 규칙에 의해서만 트리거됩니다. 따라서 EVM은 SELinux 속성과 같은 파일 메타데이터를 보호하지 않습니다. 파일 메타데이터가 오프라인으로 변조되는 경우 EVM은 파일 메타데이터 변경만 방지할 수 있습니다. 파일 실행과 같은 파일 액세스를 차단하지 않습니다.
사전 요구 사항
Secure Boot는 일시적으로 비활성화되어 있습니다.
참고Secure Boot가 활성화되면
ima_appraise=fix
커널 명령줄 매개변수가 작동하지 않습니다.securityfs
파일 시스템은/sys/kernel/security/
디렉터리에 마운트되고/sys/kernel/security/integrity/ima/
디렉터리가 있습니다.mount
명령을 사용하여securityfs
가 마운트된 위치를 확인할 수 있습니다.# mount ... securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) ...
systemd
서비스 관리자는 부팅 시 IMA 및 EVM을 지원하도록 패치됩니다. 다음 명령을 사용하여 확인합니다.# grep <options> pattern <files>
예를 들어 다음과 같습니다.
# dmesg | grep -i -e EVM -e IMA -w [ 0.598533] ima: No TPM chip found, activating TPM-bypass! [ 0.599435] ima: Allocated hash algorithm: sha256 [ 0.600266] ima: No architecture policies found [ 0.600813] evm: Initialising EVM extended attributes: [ 0.601581] evm: security.selinux [ 0.601963] evm: security.ima [ 0.602353] evm: security.capability [ 0.602713] evm: HMAC attrs: 0x1 [ 1.455657] systemd[1]: systemd 239 (239-74.el8_8) running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy) [ 2.532639] systemd[1]: systemd 239 (239-74.el8_8) running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy)
절차
현재 부팅 항목에 대한 수정 모드에서 IMA 및 EVM을 활성화하고 사용자가 다음 커널 명령줄 매개변수를 추가하여 IMA 측정값을 수집하고 업데이트할 수 있습니다.
# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb ima_appraise=fix evm=fix"
이 명령을 사용하면 현재 부팅 항목에 대한 수정 모드에서 IMA 및 EVM을 활성화하고 사용자가 IMA 측정값을 수집하고 업데이트할 수 있습니다.
ima_policy=appraise_tcb
커널 명령줄 매개 변수를 사용하면 커널이 기본 trusted Computing Base(ECDHEB) 측정 정책 및 평가 단계를 사용합니다. 평가 단계는 이전 및 현재 측정값이 일치하지 않는 파일에 대한 액세스를 금지합니다.- 재부팅하여 변경 사항을 적용합니다.
선택 사항: 매개변수가 커널 명령줄에 추가되었는지 확인합니다.
# cat /proc/cmdline BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet ima_policy=appraise_tcb ima_appraise=fix evm=fix
커널 마스터 키를 생성하여 EVM 키를 보호합니다.
# keyctl add user kmk "$(dd if=/dev/urandom bs=1 count=32 2> /dev/null)" @u 748544121
kmk
는 커널 공간 메모리에 전적으로 유지됩니다.kmk
의 32바이트 긴 값은/dev/urandom
파일에서 임의의 바이트에서 생성되고 사용자(@u
) 인증 키에 배치됩니다. 키 일련 번호는 이전 출력의 첫 번째 행에 있습니다.kmk
를 기반으로 암호화된 EVM 키를 만듭니다.# keyctl add encrypted evm-key "new user:kmk 64" @u 641780271
명령은
kmk
를 사용하여 64바이트 긴 사용자 키(evm-key
)를 생성하고 암호화하여 사용자(@u
) 인증 키에 배치합니다. 키 일련 번호는 이전 출력의 첫 번째 행에 있습니다.중요이 이름은 EVM 하위 시스템 이름이 필요하며 작업 중이므로 사용자 키의 이름을 evm-key 로 지정해야 합니다.
내보낸 키에 사용할 디렉토리를 생성합니다.
# mkdir -p /etc/keys/
kmk
를 검색하고 암호화되지 않은 값을 새 디렉터리로 내보냅니다.# keyctl pipe $(keyctl search @u user kmk) > /etc/keys/kmk
evm-key
를 검색하고 암호화된 값을 새 디렉터리로 내보냅니다.# keyctl pipe $(keyctl search @u encrypted evm-key) > /etc/keys/evm-key
evm-key
는 이전에 커널 마스터 키로 암호화되었습니다.선택 사항: 새로 생성된 키를 확인합니다.
# keyctl show Session Keyring 974575405 --alswrv 0 0 keyring: ses 299489774 --alswrv 0 65534 \ keyring: uid.0 748544121 --alswrv 0 0 \ user: kmk 641780271 --alswrv 0 0 \_ encrypted: evm-key # ls -l /etc/keys/ total 8 -rw-r--r--. 1 root root 246 Jun 24 12:44 evm-key -rw-r--r--. 1 root root 32 Jun 24 12:43 kmk
선택 사항: 예를 들어 시스템을 재부팅한 후 인증 키에서 키가 제거된 경우 새 키를 생성하는 대신 이미 내보낸
kmk
및evm-key
를 가져올 수 있습니다.kmk
를 가져옵니다.# keyctl add user kmk "$(cat /etc/keys/kmk)" @u 451342217
evm-key
를 가져옵니다.# keyctl add encrypted evm-key "load $(cat /etc/keys/evm-key)" @u 924537557
EVM을 활성화합니다.
# echo 1 > /sys/kernel/security/evm
전체 시스템의 레이블을 다시 지정합니다.
# find / -fstype xfs -type f -uid 0 -exec head -n 1 '{}' >/dev/null \;
주의시스템의 레이블을 다시 지정하지 않고 IMA 및 EVM을 활성화하면 시스템의 대부분의 파일에 액세스할 수 없게 될 수 있습니다.
검증
EVM이 초기화되었는지 확인합니다.
# dmesg | tail -1 […] evm: key initialized