16 December 2021

Secure BootのUbuntu 18.04にVMWare Playerをインストールする(自己証明した鍵をUEFI BIOSのMokListに登録する)

Secure Bootが有効なマシンのUbuntuで、VMware Playerを起動しようとすると、次のようなエラーが出てしまう

Could not open /dev/vmmon: No such file or directory.
Please make sure that the kernel module `vmmon' is loaded.

これは、正しく署名されていないカーネル・モジュール vmmon.ko と vmnet.ko がロードされていないためだ。

モジュールがロードされていないことを確認する

lsmodでvmmonとvmnetが表示されていないことを確認

$ lsmod | grep vm
kvm_intel             253952  0
kvm                   659456  1 kvm_intel
iwlmvm                385024  0
mac80211              856064  1 iwlmvm
iwlwifi               339968  1 iwlmvm
cfg80211              712704  3 iwlmvm,iwlwifi,mac80211
nvme                   49152  3
nvme_core             106496  5 nvme

カーネル・モジュールのファイルが存在していることを念のため確認

$ modinfo -n vmmon
/lib/modules/5.4.0-91-generic/misc/vmmon.ko
$ ls /lib/modules/5.4.0-91-generic/misc/
vmmon.ko  vmnet.ko

Machine-Owner Key(MOK)の署名をカーネル・モジュールに施す

ここからの作業は、次のWebページを参考にしている

・『"Cannot open /dev/vmmon: No such file or directory" error when powering on a VM (2146460)
・『Ubuntu 20.04 に VMWare Player をインストールする

まず、Machine-Owner Key(=MOK) として使う自己署名証明書(秘密鍵と公開鍵のペア)を作成する

$ openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VMware/"
Generating a RSA private key
.............+++++
.........................................................................................+++++
writing new private key to 'MOK.priv'
-----

参考)作成された鍵の内容をテキスト表示するには

$ openssl x509 -inform der  -in MOK.der -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            4d:9b:cd:13:28:10:11:d8:78:b1:7e:eb:f2:c5:0d:ca:38:b3:63:1e
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = VMware
        Validity
 〜 以下省略

VMwareのvmnetとvmmonカーネル・モジュール ファイルに署名する

$ sudo /usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmmon)

$ sudo /usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vmnet)

UbuntuのSHIMX64にMachine-Owner Key(=MOK) をインストールする

現在、MOKデータベースに追加リクエスト中のMOKが存在しないことを念のため確認

$ sudo mokutil --list-new
MokNew is empty

MOKの公開鍵(MOK.der)を新規追加候補として登録する。パスワードを聞かれるが、これは次回のブートアップ時にUEFI BIOSから呼び出されるmmx64.efi(MokManager)のMOKインポート画面で入力するものなので、ここで新たに設定したパスワードはその時まで覚えておくこと。

$ sudo mokutil --import MOK.der
input password: 
input password again: 

MOKが新規インポート候補に登録されたことを確認

$ sudo mokutil --list-new
[key 1]
SHA1 Fingerprint: a8:60:2c:93:b5:13:95:e4:95:33:53:0a:ae:26:64:f5:eb:b3:74:b6
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            4d:9b:cd:13:28:10:11:d8:78:b1:7e:eb:f2:c5:0d:ca:38:b3:63:1e
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=VMware
        Validity
            Not Before: Dec 16 13:31:18 2021 GMT
            Not After : Nov 22 13:31:18 2121 GMT
        Subject: CN=VMware
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:cc:ea:1e:0c:41:c4:e1:b0:03:4a:76:96:c8:a7:
                    20:9c:ab:1a:14:69:27:84:e8:1d:2a:17:33:c3:97:
                    a2:b1:1d:bb:52:04:01:4f:fc:42:27:fd:ab:4d:05:
                    03:57:04:17:c2:1e:f3:e3:81:22:77:35:f0:46:f6:
                    9a:58:0f:bd:de:71:42:a5:81:64:04:32:3c:ee:39:
                    53:23:d8:c8:70:e6:2a:10:b5:5c:4e:50:ff:9f:4b:
                    01:61:86:0b:ff:1e:a5:64:b7:92:04:55:fe:92:f8:
                    16:f1:b0:df:8c:9f:6d:ab:1e:1f:ff:c5:99:d9:f6:
                    25:82:d8:7d:52:bc:59:81:db:c0:c0:72:82:fa:65:
                    86:73:38:e8:17:57:5a:df:4d:98:88:2c:96:0e:98:
                    ca:48:67:61:65:5a:a4:93:4c:f5:4e:d4:67:ca:b5:
                    8b:41:69:10:22:f5:8a:8d:07:e1:8e:8e:d3:c5:7d:
                    6c:88:6a:b9:2f:d4:87:44:7b:8e:59:1f:21:d1:68:
                    22:30:85:d7:94:aa:49:b9:07:bd:a1:62:3a:b4:a5:
                    cb:43:d0:73:09:22:95:9a:ff:85:81:51:38:a6:0e:
                    d3:5b:a2:ef:b6:69:15:74:f7:44:bd:bd:c2:37:61:
                    13:7c:29:8c:81:f2:c5:c6:a1:dc:09:03:65:1a:29:
                    97:fd
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                31:36:87:94:ED:7A:CA:55:5F:23:CB:D4:F7:CD:C4:E1:28:DE:B5:F6
            X509v3 Authority Key Identifier: 
                keyid:31:36:87:94:ED:7A:CA:55:5F:23:CB:D4:F7:CD:C4:E1:28:DE:B5:F6

            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         a2:96:88:05:25:5e:0e:6a:38:72:9c:b5:70:50:e7:69:c2:73:
         96:3d:d1:44:5d:81:dd:13:6a:55:44:50:48:7a:0e:9c:47:18:
         c3:a2:52:97:64:16:72:3e:96:ca:38:3b:f6:80:10:72:17:4a:
         17:5a:1f:f5:ca:3e:72:95:78:82:77:f0:8b:0b:99:b1:35:d4:
         e1:fb:0b:5e:c4:30:5b:40:49:09:ac:d7:33:a6:bc:14:ad:0f:
         f9:06:74:e0:d1:e1:fb:8c:53:2e:6b:1b:26:fe:88:53:45:fc:
         29:24:f5:d4:5d:3a:5b:8a:dc:b4:47:d8:8b:c6:1c:28:12:36:
         a8:4a:7b:c0:37:e2:06:38:eb:16:99:7c:a7:be:1e:2c:06:bf:
         bb:22:a7:9e:3b:09:d7:3b:f7:2d:d6:43:92:8e:e1:57:2b:0c:
         a7:50:39:e5:81:31:2b:fc:7f:c6:0b:c3:c5:ef:96:00:e9:11:
         b6:e1:fb:40:9b:d6:b5:01:f2:47:3c:8f:4b:cb:e9:90:89:5e:
         a1:69:15:b3:49:6f:ae:90:0d:16:eb:45:6e:a3:20:27:97:23:
         ab:54:2a:0c:63:b4:c2:81:62:c0:6b:23:b6:82:a2:d7:9f:fd:
         62:70:0d:33:22:ed:45:f4:bb:2e:eb:d2:16:8f:49:87:20:22:
         d7:19:94:07

ここで、マシンを再起動する。

セキュア・ブートの起動シーケンスは

1) UEFI BIOS
2) shimx64.efi --- UEFI BIOSに格納されているMicrosoftの署名があるのでUEFI BIOSから実行許可される
3) mmx64.efi --- MOKデータベースの追加認証を読み込む
4) grubx64.efi --- MOKデータベースに格納されているCanonicalの署名があるのでshimx64から実行許可される
5) カーネル・モジュール --- 今回問題としている自己署名がMOKデータベースにあれば読み込み可能となる

という順序で、今回のMOKインポートは 起動シーケンスの 3) で処理され、データベースに追加されることになる。

MokManagerが表示されたら、『 Enroll MOK 』メニューを選択して、新規インポート候補とされているMOKをインストールする。

20211216-uefi-mok01.jpg
MokManagerでのMOKインポート画面 → Enroll MOK を選択

いきなりインポートすることも出来るが、念のため内容を表示して、さきほど mokutil --list-new で表示されたものであることを確認

20211216-uefi-mok02.jpg
インストール前にMOKの内容を表示

20211216-uefi-mok03.jpg
MOKインストール時には、mokutil --installで設定したパスワードを聞かれる

参考資料

なお、MOKはマシン本体(UEFI BIOS)の鍵リストに格納されるのではなく、UbuntuのSHIMX64が扱うMOKデータベースに格納される。

念のため、マシン自体のキーを表示してみると...

20211216-uefi-mok04.jpg
マシン自体のキー領域には今回のMOKが格納されるわけではない(マシンのメーカーとMicrosoftのキーだけが格納されている)

この辺りの詳細は、『 Testing Secure Boot 』 が参考になる。

登録済みのMOKを削除する

登録した時のMOK.derファイルが手元になければ、システムからエクスポートして使う。エクスポートは次のように行う。2つエクスポートされるので、削除する方を選択すること。

$ mokutil --export

また、現在登録されているMOKをダンプするには

$ mokutil --list-enrolled
[key 1]
SHA1 Fingerprint: 76:a0:92:06:58:00:bf:37:69:01:c3:72:cd:55:a9:0e:1f:de:d2:e0
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            b9:41:24:a0:18:2c:92:67
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=GB, ST=Isle of Man, L=Douglas, O=Canonical Ltd., CN=Canonical Ltd. Master Certificate Authority
 
... 以下省略

MOKを削除

$ mokutil --delete KEY.der

鍵データベースの一覧を表示する

鍵データベースは次のようにして得られる

$ sudo keyctl show %:.builtin_trusted_keys
Keyring
 593808705 ---lswrv      0     0  keyring: .builtin_trusted_keys
 497843067 ---lswrv      0     0   \_ asymmetric: Build time autogenerated kernel key: 6df576664badec8d59c89a2936dfd283c277107b
 697325536 ---lswrv      0     0   \_ asymmetric: Canonical Ltd. Kernel Module Signing: 88f752e560a1e0737e31163a466ad7b70a850c19
 526565397 ---lswrv      0     0   \_ asymmetric: Canonical Ltd. Live Patch Signing: 14df34d1a87cf37625abec039ef2bf521249b969

$ sudo keyctl show %:.platform
Keyring
 176066445 ---lswrv      0     0  keyring: .platform
 630299454 ---lswrv      0     0   \_ asymmetric: Lenovo UEFI CA 2014: 4b91a68732eaefdd2c8ffffc6b027ec3449e9c8f
 114710310 ---lswrv      0     0   \_ asymmetric: VMware: 31368794ed7aca555f23cbd4f7cdc4e128deb5f6
   2984028 ---lswrv      0     0   \_ asymmetric: Canonical Ltd. Master Certificate Authority: ad91990bc22ab1f517048c23b6655a268e345a63
 938841673 ---lswrv      0     0   \_ asymmetric: Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53
 257869908 ---lswrv      0     0   \_ asymmetric: Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4
 261481554 ---lswrv      0     0   \_ asymmetric: Trust - Lenovo Certificate: bc19ccf68446c18b4a08dce9b1cb4deb

また、システム起動時にどの鍵が読み込まれたかは次のようにすれば表示できる

$ dmesg | grep 'X.509'
[    1.142212] Loading compiled-in X.509 certificates
[    1.142845] Loaded X.509 cert 'Build time autogenerated kernel key: 6df576664badec8d59c89a2936dfd283c277107b'
[    1.143351] Loaded X.509 cert 'Canonical Ltd. Live Patch Signing: 14df34d1a87cf37625abec039ef2bf521249b969'
[    1.143852] Loaded X.509 cert 'Canonical Ltd. Kernel Module Signing: 88f752e560a1e0737e31163a466ad7b70a850c19'
[    1.148951] integrity: Loading X.509 certificate: UEFI:db
[    1.148977] integrity: Loaded X.509 cert 'Lenovo UEFI CA 2014: 4b91a68732eaefdd2c8ffffc6b027ec3449e9c8f'
[    1.148978] integrity: Loading X.509 certificate: UEFI:db
[    1.149276] integrity: Loaded X.509 cert 'Trust - Lenovo Certificate: bc19ccf68446c18b4a08dce9b1cb4deb'
[    1.149277] integrity: Loading X.509 certificate: UEFI:db
[    1.149299] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
[    1.149300] integrity: Loading X.509 certificate: UEFI:db
[    1.149320] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
[    1.150005] integrity: Loading X.509 certificate: UEFI:MokListRT
[    1.150172] integrity: Loaded X.509 cert 'Canonical Ltd. Master Certificate Authority: ad91990bc22ab1f517048c23b6655a268e345a63'
[    1.150172] integrity: Loading X.509 certificate: UEFI:MokListRT
[    1.150330] integrity: Loaded X.509 cert 'VMware: 31368794ed7aca555f23cbd4f7cdc4e128deb5f6'
[    6.570590] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    6.570780] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'