web-dev-qa-db-ja.com

セキュアブートを維持しながらVirtualBoxをインストールする

セキュアブートを維持しながら、Ubuntu 16.04にVirtualBoxをインストールしようとしています。 Synapticを介してインストールすると、SecureBootを削除するように求められました。Noと言いました。

buntu 16.04へのアップグレード後に「vboxdrv」をロードできませんでした(セキュアブートを維持したい) および https://stegard.net/2016/10/virtualbox -secure-boot-ubuntu-fail / どちらもほぼ同じです(2番目のリンクのように/ rootディレクトリにMOKファイルを残しました)。すべて正常に動作するようで、再起動し、パスワードを再入力して、再起動しました。すべて良い

しかし、その後、VirtualBoxを使用しようとしても機能しません。ターミナルから実行すると、次のようになります:

WARNING: The character device /dev/vboxdrv does not exist.
     Please install the virtualbox-dkms package and the appropriate
     headers, most likely linux-headers-generic.

     You will not be able to start VMs until this problem is fixed.

ただし、これらの2つのパッケージは既にインストールされており、最新の状態です。

他の投稿の一番上の回答のコメントでは、これらの指示に従う前にvirtualbox-dkmsを再インストールするように言われています。試しましたが、同じ結果になりました。

私はここで答えを試しました: VirtualBoxのインストールの問題 セキュアブートを無効にするかどうかを尋ねるプロンプトが再び表示され、Noと言います。

modprobeを実行すると、次のようになります:modprobe: ERROR: could not insert 'vboxdrv': Required key not available

SecureBootを有効にした状態でVirtualBoxを動作させる方法についてのアイデア(削除するように言わないでください...)

ありがとう

5
ddeunagomez

これらの手順のいずれも試していません。ただし、これは別の方法で行いますが、これはvery退屈な方法です。私が書いた大きなページを参照しているので、この説明はそれよりも簡単に見えるでしょう。私の手順は次のとおりです。

  1. セキュアブートを制御する-私の場合、ファームウェアに独自のセキュアブート公開キーを埋め込むようにコンピューターを構成しました。このように、ShimやMOKを使用する必要はありません。この手順を使用するコンピューターからMicrosoftのキーを削除し、自分のキーとCanonicalのキーを追加しましたが、好きなキーを設定できます。あなたの質問の目的にとって重要な部分は、それを機能させるためにあなたが生成するの秘密鍵とあなたが保持するの鍵を含める必要があるということです。また、標準コンポーネントの署名に使用されるキー(Canonicalのキー、Microsoftの公開市場キー、またはその両方)も必要です。 Windowsでデュアルブートする場合、Microsoftが独自のブートローダーに署名するために使用する公開キーが必要になります。 私のこのページ を参照してください-しかし、これは退屈で面倒な手順なので、この部分を動作させるのにかなりの時間を費やすかもしれません。ほとんどのUEFIでは、標準のキーセットを簡単に復元できるため、この手順の試行に伴うリスクは低いことに注意してください。
  2. VirtualBoxモジュールに署名する-次のステップは、VirtualBoxカーネルモジュールに署名することです。これは、リンク先のページの記述とほぼ同じ方法で行われます。ただし、このプロセスの自動化に役立つスクリプトがあります(以下を参照)。
  3. VirtualBoxモジュールをロードします-モジュールに署名した後、それらをロードする必要があります。これは、再起動時に自動的に発生するはずです。ただし、再起動せずにVirtualBoxを使用する場合は、モジュールごとにmodprobeを明示的に使用する必要があります(vboxdrvvboxnetfltvboxpci、およびvboxnetadp) 。
  4. カーネル更新ごとに手順2〜3を繰り返します-カーネル更新後、手順2と3を繰り返す必要があります。

便宜上、1つのコマンドで手順2と3を実行するスクリプトを作成しました。 sign-vboxと呼びます。ここにあります:

#!/bin/bash
# sign-vbox script, copyright (c) 2017 by Rod Smith
# Distributed under the terms of the GPLv3

if [ "$#" -ne 1 ] && [ "$#" -ne 0 ]; then
    echo "Usage: $0 [ {kernel-version} ]"
    exit 1
fi

if [ "$#" == 0 ]; then
    kernel_version=$(uname -r)
else
    kernel_version="$1"
fi

sign_file=$(find /usr/src/ -name sign-file | tail -n 1)

if [ -z $sign_file ]; then
    echo "Can't find the sign-file binary! Exiting!"
    exit 1
else
    path_to_modules="/lib/modules/$kernel_version/updates/dkms"

    if [ ! -f $path_to_modules/vboxdrv.ko ]; then
        echo "Could not find $path_to_modules/vboxdrv.ko!"
        echo "Is the kernel version correct?"
        exit 1
    fi

    echo "Signing modules for $kernel_version"
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxdrv.ko
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxnetadp.ko
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxnetflt.ko
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxpci.ko
    modprobe vboxdrv
    modprobe vboxnetflt
    modprobe vboxpci
    modprobe vboxnetadp
    echo "Loaded vbox modules:"
    lsmod | grep vbox
fi

このスクリプトを使用するには、名前を入力するだけです。現在実行中のカーネルに関連付けられているVirtualBoxモジュールに署名します。カーネルバージョン番号を渡すと、そのカーネルバージョンに関連付けられているカーネルに署名する必要がありますが、カーネルバージョン番号の指定にエラーの余地はありません。 (カーネルが実行されている場合にuname -rが返すのと同じ形式を想定しています。)

スクリプトは、refind_local.keyで秘密(refind_local.cer)および公開(/etc/refind.d/keys/)キーを見つけることを期待していることに注意してください。 rEFIndを使用してローカルキーを使用しない限り、システムの場所を変更する必要があります。秘密鍵ファイルは、0400(-r--------)許可など、できる限り安全でなければなりません。ディレクトリ自体へのアクセスを制限することも役立ちます。さらに良いのは、このコマンドを実行するときにのみプラグインするUSB​​フラッシュドライブに置くことです。

また、私は自分の個人的な使用のためにこのスクリプトを書きました。特に予期しない方法で使用される場合は、おそらくバグがあります。確かに、必要なカーネルソースファイルがインストールされていないと、かなりひどく失敗します。

このスクリプトは、生成したキーファイル(MOKにロードしたパブリックファイル)を指定した場合、使用しようとしたMOKベースのメソッドで機能すると考えられます。ただし、これを約束することはできません。もちろん、あなたの問題は、不適切に署名されたカーネルモジュールまたはShim/MOK側の問題が原因である可能性があります。このスクリプトを使用すると、カーネルモジュールが適切に署名されていない場合にのみ役立ちます。

5
Rod Smith