如何在不簽署或不編輯任何核心配置的情況下在 Ubuntu 16.04 中安裝任何模組。是否可以?任何幫助將不勝感激。
答案1
您可以停用安全啟動或對核心模組進行簽名。
就我個人而言,我在 BIOS 中停用安全啟動。
看https://wiki.ubuntu.com/SecurityTeam/SecureBoot
或手動簽署內核模組,請參閱
https://www.kernel.org/doc/Documentation/module-signing.txt
============================== KERNEL MODULE SIGNING FACILITY ==============================
內容
- 概述。
- 配置模組簽名。
- 產生簽名金鑰。
- 核心中的公鑰。
- 手動簽署模組。
- 簽名模組和剝離。
- 加載簽名模組。
- 無效簽名和未簽署的模組。
- 管理/保護私鑰。
======== 概述
核心模組簽名工具在安裝期間對模組進行加密簽名,然後在載入模組時檢查簽名。這可以透過禁止載入未簽署的模組或使用無效金鑰簽署的模組來提高核心安全性。模組簽名使將惡意模組載入到核心中變得更加困難,從而提高了安全性。模組簽名檢查由核心完成,因此不需要具有受信任的使用者空間位元。
該設施使用 X.509 ITU-T 標準憑證對所涉及的公鑰進行編碼。簽名本身並不以任何工業標準類型進行編碼。該設施目前僅支援 RSA 公鑰加密標準(儘管它是可插拔的並允許使用其他標準)。可以使用的雜湊演算法有 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512(演算法由簽章中的資料選擇)。
========================== 設定模組簽名
透過前往核心配置的「啟用可載入模組支援」部分並開啟來啟用模組簽名功能
CONFIG_MODULE_SIG "模組簽章驗證"
這有許多可用選項:
(1)「要求模組有效簽章」(CONFIG_MODULE_SIG_FORCE)
This specifies how the kernel should deal with a module that has a signature for which the key is not known or a module that is unsigned. If this is off (ie. "permissive"), then modules for which the key is not available and modules that are unsigned are permitted, but the kernel will be marked as being tainted, and the concerned modules will be marked as tainted, shown with the character 'E'. If this is on (ie. "restrictive"), only modules that have a valid signature that can be verified by a public key in the kernel's possession will be loaded. All other modules will generate an error. Irrespective of the setting here, if the module has a signature block that cannot be parsed, it will be rejected out of hand.
(2)「自動簽署所有模組」(CONFIG_MODULE_SIG_ALL)
If this is on then modules will be automatically signed during the modules_install phase of a build. If this is off, then the modules must be signed manually using:
腳本/簽名文件
(3)“模組應該使用哪種哈希演算法進行簽名?”
This presents a choice of which hash algorithm the installation phase will sign the modules with:
CONFIG_MODULE_SIG_SHA1 "使用 SHA-1 簽署模組" CONFIG_MODULE_SIG_SHA224 "使用 SHA-224 簽署模組" CONFIG_MODULE_SIG_SHA256 "使用 SHA-256 簽署模組" CONFIG_MODULE_SIG_3844U4256 簽署模組_ -5 簽署模組12英寸
The algorithm selected here will also be built into the kernel (rather than being a module) so that modules signed with that algorithm can have their signatures checked without causing a dependency loop.
(4)「模組簽署金鑰的檔案名稱或 PKCS#11 URI」(CONFIG_MODULE_SIG_KEY)
Setting this option to something other than its default of "certs/signing_key.pem" will disable the autogeneration of signing keys and allow the kernel modules to be signed with a key of your choosing. The string provided should identify a file containing both a private key and its corresponding X.509 certificate in PEM form, or — on systems where the OpenSSL ENGINE_pkcs11 is functional — a PKCS#11 URI as defined by RFC7512. In the latter case, the PKCS#11 URI should reference both a certificate and a private key. If the PEM file containing the private key is encrypted, or if the PKCS#11 token requries a PIN, this can be provided at build time by means of the KBUILD_SIGN_PIN variable.
(5)「預設係統密鑰環的附加 X.509 密鑰」(CONFIG_SYSTEM_TRUSTED_KEYS)
This option can be set to the filename of a PEM-encoded file containing additional certificates which will be included in the system keyring by default.
請注意,啟用模組簽章會將 OpenSSL 開發包的依賴項新增至執行簽署的工具的核心建置過程中。
======================= 產生簽章金鑰
需要加密金鑰對來產生和檢查簽章。私鑰用於產生簽名,相應的公鑰用於檢查簽名。私鑰僅在建置期間需要,之後可以刪除或安全儲存。公鑰內建於核心中,以便在載入模組時可以使用它來檢查簽名。
正常情況下,當 CONFIG_MODULE_SIG_KEY 與預設值相同時,如果檔案中不存在,核心建置將自動使用 openssl 產生一個新的金鑰對:
憑證/signing_key.pem
在建置 vmlinux 期間(金鑰的公共部分需要建置到 vmlinux 中),使用下列參數:
證書/x509.genkey
文件(如果尚不存在也會產生)。
強烈建議您提供自己的 x509.genkey 檔案。
最值得注意的是,在 x509.genkey 檔案中,應更改 req_distinguished_name 部分的預設值:
[ req_distinguished_name ] #O = 未指定公司 CN = 建置時自動產生的核心金鑰 #emailAddress = [電子郵件受保護]
產生的 RSA 金鑰大小也可以透過以下方式設定:
[ 要求 ] 預設位元 = 4096
也可以使用 Linux 核心原始碼樹根節點中的 x509.genkey 金鑰產生設定檔和 openssl 指令手動產生金鑰私有/公用檔案。以下是產生公鑰/私鑰檔案的範例:
openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \ -config x509.genkey -outform PEM -out kernel_key.pem \ -keyout kernel_key.pem
然後可以在 CONFIG_MODULE_SIG_KEY 選項中指定產生的 kernel_key.pem 檔案的完整路徑名,並且將使用其中的憑證和金鑰而不是自動產生的金鑰對。
========================= 核心中的公鑰
核心包含一個可由 root 使用者檢視的公鑰環。它們位於名為「.system_keyring」的金鑰環中,可以透過以下方式查看:
[root@deneb ~]# cat /proc/keys ... 223c7853 I-------- 1 perm 1f030000 0 0 keyring .system_keyring: 1 302d2d52 I------
1 perm 1f010000 0 0 asme核心簽章金鑰:d69a84e6bce3d216b979e9505b3e3ef9a7118079:X509.RSA a7118079 [] ...除了專為模組簽名產生的公鑰之外,還可以在 CONFIG_SYSTEM_TRUSTED_KEYS 設定選項引用的 PEM 編碼檔案中提供其他可信任憑證。
此外,架構代碼可以從硬體儲存中取得公鑰並也添加這些公鑰(例如,從UEFI金鑰資料庫)。
最後,可以透過執行以下操作來新增其他公鑰:
keyctl padd 非對稱 "" [.system_keyring-ID] <[金鑰檔案]
例如:
keyctl padd 不對稱「」 0x223c7853
但請注意,內核只允許將密鑰新增至 .system_keyring如果新金鑰的 X.509 包裝器由新增金鑰時已駐留在 .system_keyring 中的金鑰進行有效簽署。
========================= 手動簽名模組
若要手動簽署模組,請使用 Linux 核心原始碼樹中提供的腳本/簽署檔案工具。該腳本需要 4 個參數:
- 哈希演算法(例如 sha256)
- 私鑰檔名或 PKCS#11 URI
- 公鑰檔案名
- 待簽名的核心模組
以下是簽署內核模組的範例:
腳本/簽章檔 sha512 kernel-signkey.priv \ kernel-signkey.x509 module.ko
使用的哈希演算法不必與配置的匹配,但如果不匹配,則應確保哈希演算法內置於核心中或無需自身即可加載。
如果私鑰需要密碼或 PIN,可以在 $KBUILD_SIGN_PIN 環境變數中提供。
============================== 簽名模組與剝離
簽名模組的末尾簡單地附加了一個數位簽章。字串“~附加模組簽名~”。模組檔案結尾的 確認簽章存在,但不確認簽章有效!
簽署的模組很脆弱,因為簽名位於定義的 ELF 容器之外。因此,一旦計算並附加簽名,它們就不能被剝離。請注意,整個模組是簽名的有效負載,包括簽名時存在的所有偵錯資訊。
====================== 載入簽章模組
模組使用 insmod、modprobe、init_module() 或 finit_module() 加載,與未簽名模組完全相同,因為在用戶空間中不進行任何處理。簽名檢查全部在內核內完成。
=========================================== 無效簽章與未簽章模組
如果啟用 CONFIG_MODULE_SIG_FORCE 或在核心命令列上提供 module.sig_enforce=1,則核心將僅載入具有公鑰的有效簽章模組。否則,它也會載入未簽署的模組。核心擁有密鑰但被證明簽名不匹配的任何模組都將不允許載入。
任何具有無法解析簽章的模組都將被拒絕。
=========================================== 管理/保護私鑰
由於私鑰用於對模組進行簽名,因此病毒和惡意軟體可能會使用私鑰對模組進行簽名並危害作業系統。私鑰必須被銷毀或移動到安全位置,並且不能保存在核心原始碼樹的根節點中。
答案2
我也遇到了同樣的驅動程式載入問題。我只是module.sig_enforce=0
透過我的 grub linux 核心命令列。
以下是步驟:
永久添加核心啟動參數
登入系統並啟動終端機視窗(應用領域→配件→終端)。
在
$
提示字元下輸入命令:sudo gedit /etc/default/grub
出現提示時輸入您的密碼
[sudo]
。
如果該檔案/etc/default/grub
顯示為空或不存在,請參閱上面早期版本的說明。
在編輯器視窗中,使用箭頭鍵將遊標移到以 開頭的行,然後
GRUB_CMDLINE_LINUX_DEFAULT
編輯該行,將參數新增至單字 後面雙引號內的文字quiet splash
。我補充道module.sig_enforce=0
。 (請務必splash
在新增參數之前新增一個空格。)點選節省按鈕
關閉編輯器視窗。
在終端機視窗中出現
$
提示時,輸入:sudo update-grub
重新啟動系統。
嘗試加載你的模組,它對我有用。
答案3
Ubuntu 16.04 支援 pci_set_dma_mask 而不是 pci_dma_supported 來建立 PCI 驅動程式。錯誤的 API 使用將在載入驅動程式時列印安全啟動金鑰不匹配錯誤。
答案4
在核心 v5.4 上,您可以停用標誌MODULE_SIG_FORCE
,然後重建核心。