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"
このコマンドは、現在のブートエントリーの 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 748544121
kmk
は、すべてカーネル領域メモリー内に保持されます。kmk
の 32 バイトの Long 値は、/dev/urandom
ファイルの乱数バイト数から生成し、ユーザーの (@u
) キーリングに配置します。鍵のシリアル番号は、前の出力の 1 行目にあります。kmk
に基づいて暗号化された EVM 鍵を作成します。# keyctl add encrypted evm-key "new user:kmk 64" @u 641780271
kmk
を使用して 64 バイトの long 型ユーザーキー (evm-key
) を生成してユーザー (@u
) のキーリングに配置します。鍵のシリアル番号は、前の出力の 1 行目にあります。重要ユーザーキーの名前は evm-key (EVM サブシステムが想定して使用している名前) にする必要があります。
エクスポートする鍵のディレクトリーを作成します。
# 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