web-dev-qa-db-ja.com

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

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

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

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

Broadcom wlドライバーは、カーネルモジュールとしてlspci -kに表示されますが、使用されていません。 Sudo modprobe wlRequired key not availableをスローします。

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

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

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

78
Pilot6

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

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

ほとんどの場合、grubメニューを使用してUEFI設定にアクセスできます。押す ESC 起動時にボタンを押して、grubメニューに入り、System Setupを選択します。セキュアブートオプションは、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が影響を受けます。

83
Pilot6

推奨 ユーザー@zwetsによると、(編集を加えて)コピーしています 回答 ここ:

カーネルバージョン4.4.0-20以降、unsignedカーネルモジュールはセキュアブートを有効にした状態での実行が許可されなくなりました。セキュアブートおよびもこれらのモジュールを実行したい場合は、次の論理ステップはsign それらのモジュール。

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

  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)

注2Sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/moduleが利用できない場合、sign-fileは代替です。

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

    Sudo mokutil --import MOK.der
    

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

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

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

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

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

追加リソース:virtualbox-dkmsがアップグレードするたびに自分用にbashスクリプトを作成し、署名されたモジュールを上書きします。 vboxsign元はGitHubにありました を確認してください。

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

作成した秘密キー(この例ではMOK.priv)はアクセスできる人なら誰でも使用できるため、安全に保管することをお勧めします。 chmod it、暗号化(gpg)、または別の安全な場所に保存することができます(r)。または、 このコメントに記載 のように、ステップ番号1のオプション-nodesを削除します。これにより、パスフレーズでキーが暗号化されます。

31
Majal

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

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

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

ASUSマザーボードの場合:

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

シム署名付き実行Sudo update-secureboot-policyでセキュアブートを無効にすることもできます。この wikiページ はこの方法を説明しています:

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

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

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

3
Kent Lin