web-dev-qa-db-ja.com

再コンパイルせずに公開キーをカーネルのシステムキーリングに追加する方法

カーネルモジュールに署名するために使用したキーペアの公開キーをsystem_keyringに追加します。ただし、問題があります。

cat /proc/keys | grep system_keyringのコマンドで、system_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_keyringifにキーを追加することのみを許可することに注意してください。新しいキーのX.509ラッパーは、キーが追加された時点で、.system_keyringにすでに常駐しています。

ただし、.system_keyringにすでに存在するキーを使用して「X.509ラッパー」に署名する方法を説明するドキュメントは見つかりません。

また、その鍵リングの鍵は公開鍵だけだと思います。そのため、キーリングから公開鍵を抽出し、その公開鍵で「X.509ラッパー」に署名できたとしても、うまくいくとは思いません。

とにかく、ここで助けが必要です。または、カーネルモジュールをRedHatにサブミットして、RedHatによって署名され、カーネルを再構築せずにユーザーのインストールにインストールできるようにするためのヒントが何かある場合でも、

2
Weishan Yang

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

  • コンパイル時にカーネルに埋め込まれたキー(明らかに再コンパイルしないと変更できません)
  • UEFIセキュアブート変数db-ファームウェアによっては、これを変更できる場合とできない場合があります
  • UEFIセキュアブート変数dbx-以前のものと同じですが、これはブラックリストであるため、とにかくここにキーを追加する必要はありません。
  • shim.efiに埋め込まれたキー-再コンパイルしないと変更できません。セキュアブートを制御していない限り、後でシムを再署名する必要がありますPK =面倒すぎる
  • UEFI変数MOKshim.efiによって使用されます)-これが最善の方法です。

キーをMOKにインポートするには、最初にshim.efiが起動プ​​ロセスに含まれていることを確認する必要があります(efibootmgr -vを参照)。

次に、モジュールがDER形式で署名されているキー/証明書を取得し、mokutilコマンドを使用してインポートプロセスを開始します。

mokutil --import your_signing_key.pub.der

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

次に、システムを再起動すると、shim.efiは新しいMOKキーをインポートする準備ができていることを確認し、インポートパスワードを入力する必要があります前のステップで設定します。これを一度行った後、新しいキーは永続的にUEFI MOK変数に格納され、カーネルは自動的にそれをシステムキーリングに含めます。

UEFIを使用していない場合、カーネルを再コンパイルしないと、システムのキーリングに新しいキーを追加できません。しかし、その一方で、セキュアブートが有効になっていない場合、カーネルは署名のない、または検証不可能な署名のあるカーネルモジュールのロードを許可します-カーネルの汚染フラグの1つを設定して、非配布カーネルモジュールがロードされました。

出典: RHEL 7 Kernel Administration Guide、Chapter 2.8 "Signing Kernel Modules for Secure Boot"

3
telcoM