Insmodによりキーがサービスから拒否されました

Insmodによりキーがサービスから拒否されました

私はAlmaLinux 9(RedHat 9レプリカ)を実行していて、新しいカーネルモジュールをコンパイルしました。 UEFIとセキュアブートが有効になっている仮想マシンで実行されています。モジュールを挿入すると、次のエラーが発生します。

insmod: ERROR: could not insert module npreal2.mod: Key was rejected by service

他の投稿でUEFI /セキュリティブートに関連していると結論付けました。そのため、セキュアブートを無効にし、insmodが次のように報告しました。

insmod: ERROR: could not insert module npreal2.mod: Invalid module format

セーフモードをオフにして再コンパイルしようとしましたが、insmodが機能しましたが、セキュアブートを無効にする必要がありました。このモジュールを安全に起動するにはどうすればよいですか?

に関する投稿があります。フラッグハブ独自のMOKキーの生成に関しては、これはDKMSに固有のようです。

答え1

これで(コメントで議論した後)、機能するが署名されていないnpreal2.koカーネルモジュールがあるので、セキュアブートの問題を解決できます。

まず、MOKとして使用するX.509鍵ペア(公開鍵と対応する秘密鍵)を生成する必要があります。これを行うには、まず次の最小OpenSSL設定ファイルを作成します~/x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
x509_extensions = myexts

[ req_distinguished_name ]
O = ModuleType
CN = ModuleType module signing key

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid

このCN =行はMOKの認識可能なデフォルト名を定義しますので、必要に応じて入力してください。このO =行には組織の名前が表示されますが、必要に応じて行全体を省略できます。

これでキーペアを作成できます。

openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 \
    -batch -config x509.genkey -outform DER \
    -out signing_key.x509 \
    -keyout signing_key.priv

このコマンドは、作成日から 10 年間、名目上有効な鍵ペアを生成します。これを変更するには、-daysパラメータを変更してください。

これで、2つのファイルが必要です。

  • signing_key.x509MOK(マシン所有者キー)として登録する公開キーです。
  • signing_key.priv直接ビルドしたカーネルモジュールに署名するために使用する必要がある対応する秘密鍵。この秘密鍵はいいえパスワードで保護されているので安全に保管してください。

MOKで登録するには、パッケージがインストールされていることをsigning_key.x509確認してから、次の手順を実行します。mokutil

sudo mokutil --import signing_key.x509

このコマンドは、鍵登録プロセスの使い捨てパスワードの設定を要求します。これが完了すると、MOK登録の最初のステップが完了します。 MOK登録を完了するには再起動する必要があります。

再起動すると、shimx64.efiMOK登録プロセスが開始されたことを検出したり、オプションを含むEnroll MOK単純なテキストベースのメニューとともにブルースクリーンが表示されますContinue boot

Enroll MOKMOK登録の2番目のステップを開始する場合に選択します。その後、登録したいハッシュとキーラインを確認してからはい/いいえを確認しCN =、最後に上記の最初の登録段階で設定した使い捨てパスワードを確認する機会が提供されます。登録が成功した場合、パスワードは不要です。 Linuxに戻るには、ブルースクリーンメニューから「再起動」を選択します。

(登録プロセスの2番目のステップは、システムに物理的に同等のアクセス権を持つ人だけがプロセスを完了できるように再起動中に発生します。パスワードは、登録中のキーが最初のステップで使用されたキーであることを確認します。によって挿入されていません)。

キー登録が成功したことを確認するには、rootとして実行できます。 MOK、ここに含まれているディストロキー、ファームウェアの製造元、およびMicrosoftキーなど、システムがsudo keyctl list %:.platform認識するすべてのセキュアブートキーを表示する必要があります。shimx64.efi

または、実行してsudo mokutil -l配布キーとMOKの詳細なリストを取得することもできます。

これでカーネルモジュールに署名する準備が整いました。

/usr/src/kernels/$(uname -r)/scripts/sign-file sha256 \
    ~/signing_key.priv \
    ~/signing_key.x509 \
    /some/where/npreal2.ko   # adjust the paths as needed

署名を確認するには:これには、MOK名を含む行sudo modinfo ./npreal2.koと長い16進ブロックを含める必要があります。signer:CN =signature:

もちろん、sudo insmod npreal2.koセキュアブートが有効になっているモジュールをロードできます。

源泉:https://www.redhat.com/sysadmin/secure-boot-systemtap

関連情報