Red Hat Training

A Red Hat training course is available for RHEL 8

10.7. Integrity Measurement Architecture および Extended Verification Module の有効化

整合性測定アーキテクチャー (IMA) および拡張検証モジュール (EVM) は、カーネル整合性サブシステムに属し、さまざまな方法でシステムセキュリティーを強化します。オペレーティングシステムのセキュリティーを向上させるために、IMA と EVM を有効にして設定できます。

前提条件

  • Secure Boot 機能を一時的に無効にしている。

    注記

    Secure Boot 機能を有効にすると、ima_appraise=fix は機能しません。

  • securityfs ファイルシステムが /sys/kernel/security/ ディレクトリーにマウントされており、/sys/kernel/security/integrity/ima/ ディレクトリーが存在している。

    # mount
    ...
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    ...
  • systemd サービスマネージャーに、システムの起動時に IMA および EVM に対応するパッチがすでに適用されていることを確認します。

    # dmesg | grep -i -e EVM -e IMA
    [    0.000000] Command line: 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
    [    0.000000] kvm-clock: cpu 0, msr 23601001, primary cpu clock
    [    0.000000] Using crashkernel=auto, the size chosen is a best effort estimation.
    [    0.000000] Kernel command line: 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
    [    0.911527] ima: No TPM chip found, activating TPM-bypass!
    [    0.911538] ima: Allocated hash algorithm: sha1
    [    0.911580] evm: Initialising EVM extended attributes:
    [    0.911581] evm: security.selinux
    [    0.911581] evm: security.ima
    [    0.911582] evm: security.capability
    [    0.911582] evm: HMAC attrs: 0x1
    [    1.715151] systemd[1]: systemd 239 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)
    [    3.824198] fbcon: qxldrmfb (fb0) is primary device
    [    4.673457] PM: Image not found (code -22)
    [    6.549966] systemd[1]: systemd 239 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)

手順

  1. 以下のカーネルコマンドラインパラメーターを追加します。

    # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb ima_appraise=fix evm=fix"

    このコマンドは、現在のブートエントリーの fix モードで IMA および EVM を有効にしてユーザーが IMA 測定を収集し、更新できるようにします。

    ima_policy=appraise_tcb カーネルコマンドラインパラメーターにより、カーネルは、デフォルトの TCB (Trusted Computing Base) 測定ポリシーと評価手順を使用するようになります。評価部分は、以前の測定と現在の測定が一致しないファイルへのアクセスを禁止します。

  2. 再起動して変更を適用します。
  3. 必要に応じて、パラメーターがカーネルコマンドラインに追加されていることを確認します。

    # 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
  4. カーネルマスターキーを作成して、EVM 鍵を保護します。

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

    カーネルマスターキー (kmk) はすべて、カーネル領域メモリーに保持されます。カーネルマスターキー kmk の 32 バイトの Long 値は、/dev/urandom ファイルの乱数バイト数から生成し、ユーザーの (@u) キーリングに配置します。鍵のシリアル番号は、前の出力の 2 行目にあります。

  5. kmk 鍵をもとに暗号化された EVM 鍵を作成します。

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

    kmk を使用して 64 バイトの long 型ユーザーキー (evm-key) を生成してユーザー (@u) のキーリングに配置します。鍵のシリアル番号は、前の出力の 2 行目にあります。

    重要

    ユーザーキーの名前は evm-key (EVM サブシステムが想定して使用している名前) にする必要があります。

  6. エクスポートする鍵のディレクトリーを作成します。

    # mkdir -p /etc/keys/
  7. kmk 鍵を検索し、その値をファイルにエクスポートします。

    # keyctl pipe $(keyctl search @u user kmk) > /etc/keys/kmk

    このコマンドは、カーネルマスターキー (kmk) の非暗号化値を、以前に定義した場所 (/etc/keys/) にあるファイルに配置します。

  8. ユーザーキー evm-key を検索し、その値をファイルにエクスポートします。

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

    このコマンドは、ユーザーの 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. EVM をアクティベートします。

    # echo 1 > /sys/kernel/security/evm
  11. システム全体の再ラベル付け

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

    この手順を省略すると、IMA および EVM を有効にした後に、システム上のほとんどのファイルにアクセスできなくなる場合があります。

検証手順

  • 次のように入力して、EVM が初期化されたことを確認できます。

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

システムが再起動されると、キーはキーリングから削除されます。このような場合、すでにエクスポートされている kmk および evm-key キーをインポートできます。

手順

  1. ユーザー kmk キーを追加します (ステップ 7 で /etc/keys/kmk ファイルに既にエクスポートされています)。

    # keyctl add user kmk "$(cat /etc/keys/kmk)" @u
    451342217
    
    # keyctl show
    Session Keyring
      695566911 --alswrv      0     0  keyring: ses 58982213 --alswrv 0 65534 \ keyring: uid.0 451342217 --alswrv 0 0 \ user: kmk
  2. ユーザーの evm-key キーをインポートします (手順 8 で既に /etc/keys/evm-key ファイルにエクスポートされています)。

    # keyctl add encrypted evm-key "load $(cat /etc/keys/evm-key)" @u
    924537557
    
    # keyctl show
    Session Keyring
      695566911 --alswrv      0     0  keyring: ses 58982213 --alswrv 0 65534 \ keyring: uid.0 451342217 --alswrv 0 0 \ user: kmk
      924537557 --alswrv      0     0       \_ encrypted: evm-key