8.5. IMA と EVM の有効化
Integrity Measurement Architecture (IMA) と Extended Verification Module (EVM) を有効にして設定することで、オペレーティングシステムのセキュリティーを向上できます。
必ず IMA と一緒に EVM を有効にしてください。
EVM を単独で有効にすることもできますが、EVM 評価は IMA 評価ルールによってのみトリガーされます。したがって、SELinux 属性などのファイルメタデータが EVM によって保護されません。ファイルメタデータがオフラインで改ざんされた場合、EVM はファイルメタデータの変更を防ぐことしかできません。ファイルの実行などのファイルアクセスは妨げません。
前提条件
セキュアブートが一時的に無効になっている。
注記セキュアブートが有効になっている場合、
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)手順
現在のブートエントリーの fix モードで 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カーネルコマンドラインパラメーターにより、カーネルは、デフォルトの TCB (Trusted Computing Base) 測定ポリシーと評価手順を使用するようになります。評価手順では、以前の測定と現在の測定が一致しないファイルへのアクセスを禁止します。- 再起動して変更を適用します。
オプション: カーネルコマンドラインに追加されたパラメーターを確認します。
# 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 748544121kmkは、すべてカーネル領域メモリー内に保持されます。kmkの 32 バイトの Long 値は、/dev/urandomファイルの乱数バイト数から生成し、ユーザーの (@u) キーリングに配置します。鍵のシリアル番号は、前の出力の 1 行目にあります。kmkに基づいて暗号化された EVM 鍵を作成します。# keyctl add encrypted evm-key "new user:kmk 64" @u 641780271kmkを使用して 64 バイトの long 型ユーザーキー (evm-key) を生成してユーザー (@u) のキーリングに配置します。鍵のシリアル番号は、前の出力の 1 行目にあります。重要ユーザーキーの名前は evm-key (EVM サブシステムが想定して使用している名前) にする必要があります。
エクスポートする鍵のディレクトリーを作成します。
# mkdir -p /etc/keys/kmkを検索し、その暗号化されていない値を新しいディレクトリーにエクスポートします。# keyctl pipe $(keyctl search @u user kmk) > /etc/keys/kmkevm-keyを検索し、その暗号化された値を新しいディレクトリーにエクスポートします。# keyctl pipe $(keyctl search @u encrypted evm-key) > /etc/keys/evm-keyevm-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 451342217evm-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