21.5. IMA 및 EVM 활성화

무결성 측정 아키텍처(IMA) 및 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.943873] ima: No TPM chip found, activating TPM-bypass!
    [ 0.944566] ima: Allocated hash algorithm: sha256
    [ 0.944579] ima: No architecture policies found
    [ 0.944601] evm: Initialising EVM extended attributes:
    [ 0.944602] evm: security.selinux
    [ 0.944604] evm: security.SMACK64 (disabled)
    [ 0.944605] evm: security.SMACK64EXEC (disabled)
    [ 0.944607] evm: security.SMACK64TRANSMUTE (disabled)
    [ 0.944608] evm: security.SMACK64MMAP (disabled)
    [ 0.944609] evm: security.apparmor (disabled)
    [ 0.944611] evm: security.ima
    [ 0.944612] evm: security.capability
    [ 0.944613] evm: HMAC attrs: 0x1
    [ 1.314520] systemd[1]: systemd 252-18.el9 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS -FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
    [ 1.717675] device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be recorded in the IMA log.
    [ 4.799436] systemd[1]: systemd 252-18.el9 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS -FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)

절차

  1. 현재 부팅 항목에 대한 수정 모드에서 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) 측정 정책 및 평가 단계를 사용합니다. 평가 단계는 이전 및 현재 측정값이 일치하지 않는 파일에 대한 액세스를 금지합니다.

  2. 재부팅하여 변경 사항을 적용합니다.
  3. 선택 사항: 매개변수가 커널 명령줄에 추가되었는지 확인합니다.

    # cat /proc/cmdline
    BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-1.el9.x86_64 root=/dev/mapper/rhel-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M 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
  4. EVM 키를 보호하기 위해 커널 마스터 키를 생성합니다.

    # keyctl add user kmk "$(dd if=/dev/urandom bs=1 count=32 2> /dev/null)" @u
    748544121

    kmk 는 커널 공간 메모리에 전적으로 유지됩니다. kmk 의 32바이트 긴 값은 /dev/urandom 파일에서 임의의 바이트에서 생성되고 사용자(@u) 인증 키에 배치됩니다. 키 일련 번호는 이전 출력의 첫 번째 행에 있습니다.

  5. kmk 를 기반으로 암호화된 EVM 키를 만듭니다.

    # keyctl add encrypted evm-key "new user:kmk 64" @u
    641780271

    명령은 kmk 를 사용하여 64바이트 긴 사용자 키( evm-key)를 생성하고 암호화하여 사용자(@u) 인증 키에 배치합니다. 키 일련 번호는 이전 출력의 첫 번째 행에 있습니다.

    중요

    EVM 하위 시스템 이름이 예상하고 있으므로 사용자 키 이름을 evm-key 로 지정해야 합니다.

  6. 내보낸 키의 디렉터리를 만듭니다.

    # mkdir -p /etc/keys/
  7. kmk 를 검색하고 암호화되지 않은 값을 새 디렉터리로 내보냅니다.

    # keyctl pipe $(keyctl search @u user kmk) > /etc/keys/kmk
  8. evm-key 를 검색하고 암호화된 값을 새 디렉터리로 내보냅니다.

    # keyctl pipe $(keyctl search @u encrypted evm-key) > /etc/keys/evm-key

    evm-key 는 이전에 커널 마스터 키로 암호화되었습니다.

  9. 선택 사항: 새로 생성된 키를 확인합니다.

    # 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
  10. 선택 사항: 예를 들어 시스템을 재부팅한 후 인증 키에서 키가 제거된 경우 새 키를 생성하는 대신 이미 내보낸 kmkevm-key 를 가져올 수 있습니다.

    1. kmk 를 가져옵니다.

      # keyctl add user kmk "$(cat /etc/keys/kmk)" @u
      451342217
    2. evm-key 를 가져옵니다.

      # keyctl add encrypted evm-key "load $(cat /etc/keys/evm-key)" @u
      924537557
  11. EVM을 활성화합니다.

    # echo 1 > /sys/kernel/security/evm
  12. 전체 시스템의 레이블을 다시 지정합니다.

    # find / -fstype xfs -type f -uid 0 -exec head -n 1 '{}' >/dev/null \;
    주의

    시스템의 레이블을 다시 지정하지 않고 IMA 및 EVM을 활성화하면 시스템의 대부분의 파일에 액세스할 수 없게 될 수 있습니다.

검증

  • EVM이 초기화되었는지 확인합니다.

    # dmesg | tail -1
    […​] evm: key initialized