サードパーティのカーネルモジュールをインストールするとき、またはカーネルをアップグレードした後に「必要なキーが利用できません」と表示されるのはなぜですか?


79

この問題は、セキュアブートが有効になっているUEFIシステムでのみ発生します。

VirtualBox、Nvidia、BroadcomドライバーなどのDKMSモジュールをインストールしようとすると、インストールされず、それらRequired key not availableを試そうとすると取得しmodprobeます。

VirtualBox vboxdrvは、ロードされていないことを訴えます。

Broadcom wlドライバーはlspci -kカーネルモジュールとして表示されますが、使用されていません。sudo modprobe wl投げRequired key not availableます。

また、gitソースからいくつかのカーネルモジュールをインストールすると、この問題が発生する場合があります。

この問題は、カーネルの更新後、ワイヤレスアダプタが無効になった、再起動後の黒い画面などとして表示される場合があります。

どうすれば修正できますか?


回答:


85

Ubuntuカーネル4.4.0-20以降、EFI_SECURE_BOOT_SIG_ENFORCEカーネル設定が有効になっています。これにより、UEFIセキュアブートが有効になっている場合、署名されていないサードパーティのモジュールをロードできなくなります。

この問題を修正する最も簡単な方法は、UEFI(BIOS)設定でセキュアブート無効にすることです。

ほとんどの場合、grubメニューを使用してUEFI設定にアクセスできます。押してESCブート上のボタンは、GRUBメニューに入ると、システム設定を選択します。セキュアブートオプションは、UEFIの[セキュリティ]または[ブート]セクションにある必要があります。

UEFIに直接アクセスできますが、ハードウェアによって異なります。コンピュータのマニュアルを読んで、そこに到達する方法を確認してください。それであってもよいDel、またはF2ブート、または何か他のものに。

別の方法は、を使用してセキュアブートを無効にすることmokutilです。

Ubuntuカーネルビルド4.4.0-21.37以降では、これを実行することで修正できます

sudo apt install mokutil
sudo mokutil --disable-validation

パスワードを作成する必要があります。パスワードは少なくとも8文字の長さが必要です。再起動後、UEFIはセキュリティ設定を変更するかどうかを尋ねます。「はい」を選択します。

次に、以前に作成したパスワードの入力を求められます。一部のUEFIファームウェアは、完全なパスワードを要求せず、1文字目、3文字目などの一部の文字を入力するように要求します。注意してください。これを理解していない人もいます。私も最初の試みからそれを得なかった;-)

更新:このカーネル構成は、サポートされているすべてのUbuntuカーネルで有効になりました。Ubuntu 16.04、15.10、および14.04が影響を受けます。


これは私にはうまくいきません。@Sputnikの答えはそうです。それでも、mokutilがパスワードを要求する理由と、いつ必要になるのかを知りたいのですが。
アルウィンケスラー

8
@AlwinKesler MOKデータベースへの変更が実際に実行される前に、再起動後に検証するパスワードを要求します。これがないと、不正なプロセスがMOKデータベース内のキーを変更して、次回の再起動後に有効になる可能性があります。また、プラットフォームは、変更を要求する人がリブート後に物理的に存在する人と同じであることを「認識」しているため、マシンに物理的にアクセスし、ブート時のシステムパスワードを知るなどのハードウェアセキュリティ対策に合格しています。
zwets

@ Pilot6:技術的な問題のため、私はまだUbuntu 14.04 LTSを使用しています。答えを更新してくれてありがとう。
ラヴィ・ジョシ

3
Ubuntu 18.04で作業しました。なぜnvidiaドライバーのインストールが何らかの手段で機能しなかったのか、16.04に戻ったとしても動作しなかったのは私の人生を理解できませんでした。ああ!これで修正されました。多くの時間が無駄になりました。
ネイト

1
私のUbuntuシステムは本当に遅れていました。これはまったく新しいラップトップであるため、意味がありません。CPUがすべてを実行しており、ビデオカードが常にアイドル状態であることに気付きました。このリンクも役に立ちました-linuxbabe.com/ubuntu/install-nvidia-driver-ubuntu-18-04
Peter Drinnan

32

提案されたユーザ@zwetsで、私は(編集で)コピーしてる答えをここに:

カーネルバージョン4.4.0-20以降、署名されていないカーネルモジュールはセキュアブートを有効にした状態での実行を許可されません。あなたはセキュアブートを維持したいと思います場合もこれらのモジュールを実行し、その後、次の論理的なステップはしてあるサインこれらのモジュールを。

それでは試してみましょう。

  1. 署名キーを作成する

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
    
  2. モジュールに署名する

    sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module
    

注1:単一のドライバー/モジュールに署名するファイルが複数ある/path/to/module場合があるため$(modinfo -n <modulename>)、たとえば、$(modinfo -n vboxdrv)

注2:利用できないsudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/module場合の代替手段sign-fileです。

  1. キーをセキュアブートに登録する

    sudo mokutil --import MOK.der
    

    再起動後に後で使用するためにパスワードを入力します

  2. Reboot指示に従ってMOK(マシン所有者キー)を登録します。これは写真付きのサンプルです。システムがもう一度再起動します。

キーが適切に登録されている場合は、の下に表示されsudo mokutil --list-enrolledます。

あなたのモジュールがUbuntu 16.04(カーネル4.4.0-21で)でこのように動作するかどうかを教えてください。

リソース:モジュール署名のFedoraおよびUbuntu実装に関する詳細なWebサイト記事。(彼らはそれに取り組んできました);-)

追加リソース:virtualbox-dkmsアップグレードのたびに自分用のbashスクリプトを作成したため、署名済みモジュールが上書きされます。vboxsign元々GitHubでチェックしてみてください。

セキュリティ(追加)意識のための追加の注意:;-)

作成した秘密キー(MOK.privこの例では)は、アクセスできるすべてのユーザーが使用できるため、安全に保管することをお勧めします。あなたはありchmod、それは、(暗号化gpg)、それを、またはどこか安全な(r)を保管してください。または、このコメント記載されているように-nodes、ステップ1のオプションを削除します。これにより、パスフレーズでキーが暗号化されます。


Ubuntu 14.10では、キーを事前に登録してドライバーに署名しているにもかかわらず、ソースからコンパイルされたbroadcomドライバーをインストールしようとする「必要なキーが利用できません」と表示され続けました。検証を無効にしました。
マーク

1
これは、VirtualBoxおよびUbuntu 16.04で機能しました。
YtvwlD

1
手順3で次のエラーが表示されます。「このシステムではEFI変数はサポートされていません」。「dmesg」にはefiエントリがありません(「dmesg | grep efi」には結果がありません)他に何ができますか?ありがとう
-musbach

パスを$(modinfo -n modulename)で置き換えることができます
シェーン

Ubuntu 18.04では、念のため、そのモジュールと、Sophos AVの同じディレクトリにある他のすべてのモジュールに署名したにもかかわらず、talpa_syscallhook.koモジュールのinsmodが「必要なキーが利用できません」と言っています。すべてのmokキーを一覧表示すると、キーが表示されるため、キーは正常に登録されました。進め方に関するアイデアはありますか?
フランマルゾア

6

次の手順でBIOSでセキュアブート(UEFI)を無効にできます。

  1. マシンを再起動してBIOSメニューに入ります(私の場合はF2を押します)

  2. セキュアブートを検索し、レガシーに変更します

ASUSマザーボードの場合:

  • 詳細モードに移動します(F7)
  • [ブート]セクションの下の[セキュアブート]オプションに移動します
  • 「Windows UEFIモード」を「その他のOS」に変更します
  • 保存して再起動し、設定を適用します(F10)

2
セキュアブートと「レガシー」は異なる設定です。
-Pilot6

しかし、UEFIの代わりに「レガシーブート」を有効にしている場合、セキュアブートが有効になっていないことを意味しますか?
超常現象

@Supernormal、はい、これは私が理解していることです。
スプートニク

3

shim署名された実行でセキュアブートを無効にすることもできsudo update-secureboot-policyます。このWikiページでは、この方法について説明しています

  • ターミナルを開き(Ctrl + Alt + T)、sudo update-secureboot-policyを実行して、[はい]を選択します。
  • 8〜16桁の仮パスワードを入力します。(たとえば、12345678、このパスワードは後で使用します
  • 同じパスワードをもう一度入力して確認します。
  • システムを再起動し、ブルースクリーンが表示されたら(MOK管理
  • [セキュアブート状態の変更]を選択します
  • ステップ2で選択したパスワードを入力し、Enterを押します。
  • [はい]を選択して、シム署名のセキュアブートを無効にします。
  • Enterキーを押して、手順全体を完了します。

再度シム署名でセキュアブートを有効にできます。実行するだけ

sudo update-secureboot-policy --enableを実行し、上記の手順に従います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.