再コンパイルせずにカーネルのシステムキーリングに公開鍵を追加するにはどうすればよいですか?

再コンパイルせずにカーネルのシステムキーリングに公開鍵を追加するにはどうすればよいですか?

カーネルモジュールの署名に使用された鍵ペアの公開鍵をsystem_keyringに追加したいと思います。しかし、問題があります。

コマンドでcat /proc/keys | grep system_keyringsystem_keyringエントリ(ID)を取得しました。ただし、次のように公開鍵を追加しようとすると、keyctl padd asymmetric "" 0xXXXXXXXX</test/signing_key.x509「許可拒否」エラーが発生します。

これは、「module_signing.txt」で説明されている制限のためです。https://01.org/linuxgraphics/gfx-docs/drm/admin-guide/module-signing.html:

ただし、カーネルでは.system_keyringにのみキーを追加できることに注意してください。もし新しいキーのX.509ラッパーは、キーが追加されたときに.system_keyringにすでに存在していたキーで有効に署名されます。

ただし、すでに.system_keyringにあるキーを使用して「X.509ラッパー」に署名する方法を説明する文書が見つかりません。

そしてそのキーリングにあるキーはただ公開鍵のようです。そのため、キーリングから公開鍵を抽出し、その公開鍵を使用して「X.509ラッパー」に署名できても機能しないと思います。

とにかくここには助けが必要です。それとも、カーネルを再構築せずにRedHatに署名し、ユーザーのインストールにインストールできるように、カーネルモジュールをRedHatに送信する方法についてのヒントを与えることができると言ってもどうなりますか?

答え1

システムキーリングは、次の5つのソースからコンテンツを取得します。

  • コンパイル時にカーネルに組み込まれたキー(明らかに再コンパイルなしでは変更できません)
  • UEFIセキュアブート変数db- ファームウェアによっては、この変数を変更できない場合があります。
  • UEFIセキュアブート変数dbx- 前の変数と同じですがブラックリストなので、ここにキーを追加したくありません.
  • 組み込みキーshim.efi- 再コンパイルなしでは変更できず、すでにセキュアブートを制御できる場合を除き、後でシムに再署名する必要があります。PK=多くの問題
  • UEFI変数MOK(by shim.efi) - これはおそらく最善の希望です。

キーをMOKにインポートするには、まずキーが起動shim.efiプロセスに参加していることを確認する必要があります(参考資料を参照efibootmgr -v)。

次に、DER形式のモジュールから署名されたキー/証明書を取得し、次をmokutil使用してインポートプロセスを開始します。

mokutil --import your_signing_key.pub.der

このコマンドは、新しいインポートパスワードを設定するように求められます。このパスワードは次のステップで使用され、以前に存在していたパスワードではありません。いつものように、新しいパスワードを設定すると、mokutilパスワードを2回入力するように求められます。

その後、次回システムを再起動すると、shim.efi新しいMOKキーをインポートする準備ができていることがわかります。インポートパスワードを入力するように求められます。前のステップで設定しました。これが一度完了すると、新しいキーはUEFI MOK変数に永続的に保存され、カーネルは自動的にそれをシステムキーリングに含めます。

UEFIを使用していない場合、カーネルを再コンパイルしないと、システムキーリングに新しいキーを追加することはできません。ただし、セキュアブートが有効になっていない場合、カーネルは署名がないか、署名を検証できないカーネルモジュールをロードすることを許可します。これは単にカーネル汚染フラグを設定して非リリースカーネルであることを示すだけです。モジュールがロードされました。荷物を積んだ。

源泉:RHEL 7カーネル管理ガイド、第2.8章「セキュアブート用のカーネルモジュールの署名」

関連情報