Автоматическая подпись модулей для распространения в Linux

Вопрос или проблема

Я новичок в написании модулей Linux (драйверов) и цифровых подписей, поэтому, пожалуйста, исправьте меня, если я неправильно что-то понимаю.

Когда я выполняю команду make modules_install для своего модуля, я получаю следующую ошибку (veikk — это имя модуля):

В main.c:160:
- Ошибка SSL:02001002:системная библиотека:fopen:Нет такого файла или каталога: ../crypto/bio/bss_file.c:72
- Ошибка SSL:2006D080:BIO процедуры:BIO_new_file:нет такого файла: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: Нет такого файла или каталога

Я искал учебные материалы по подписи модулей, но был сильно сбит с толку относительно того, как распространять подписанный модуль. Есть учебники по ручной подписи модулей (например, этот, этот, этот), но все они, похоже, касаются постустановки и подразумевают создание и регистрацию ключа в ядре. Похоже, что ядро хочет автоматически подписать модуль при установке, используя certs/signing_key.pem (поэтому возникает ошибка).

С помощью совета, приведенного в вопросе Unix Stack Exchange, мне удалось исправить ошибку. Это создает файл x509.genkey, а затем создает файлы signing_key.pem и signing_key.x509 в каталоге certs в каталоге ядра.

printf "[ req ]\ndefault_bits = 4096\ndistinguished_name = req_distinguished_name\nprompt = no\nstring_mask = utf8only\nx509_extensions = myexts\n\n[ req_distinguished_name ]\nCN = Modules\n\n[ myexts ]\nbasicConstraints=critical,CA:FALSE\nkeyUsage=digitalSignature\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid" > x509.genkey
openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out $(BUILD_DIR)/certs/signing_key.x509 -keyout $(BUILD_DIR)/certs/signing_key.pem

После выполнения этой команды и make modules_install модуль, похоже, устанавливается правильно. Результат выполнения modinfo veikk показывает действительную подпись:

filename:       /lib/modules/5.1.5-arch1-2-ARCH/extra/veikk.ko.xz
license:        GPL
srcversion:     A82263B16A25C763382D8B9
alias:          hid:b0003g*v00002FEBp00000003
alias:          hid:b0003g*v00002FEBp00000002
alias:          hid:b0003g*v00002FEBp00000001
depends:        hid
retpoline:      Y
name:           veikk
vermagic:       5.1.5-arch1-2-ARCH SMP preempt mod_unload
sig_id:         PKCS#7
signer:         Modules
sig_key:        27:E8:FC:4A:4E:15:0C:AF:40:D5:A1:A4:10:E5:B5:55:BF:AF:EB:66
sig_hashalgo:   sha512
signature:      AC:AF:49:16:D4:AD:D9:7B:C5:52:A5:9F:F8:46:1C:DF:93:71:05:00:
4D:BF:96:96:3C:D1:11:19:6F:AC:D5:27:7D:E3:EE:8D:6C:BB:17:F4:
53:D3:FD:EE:85:22:97:57:BB:27:23:9C:8A:04:79:75:99:C4:A0:E6:
29:AF:20:15:87:EA:41:D2:26:00:2B:A1:39:68:28:FE:05:F5:F1:B1:
42:F8:FF:66:C0:6C:B5:17:A1:E7:F4:65:0A:17:64:99:9E:11:86:C0:
94:E7:D5:83:59:50:BE:0D:33:B8:A2:64:66:4F:70:A3:EB:E4:FB:B4:
52:D9:26:9C:57:CC:0D:D6:53:51:C2:90:D6:51:13:83:B6:22:EC:C9:
DF:15:1D:1E:34:BD:7A:2D:8F:13:2D:78:8C:D3:EA:43:0B:6C:8D:DA:
9A:DA:A1:74:03:FC:D8:72:D0:96:54:52:60:AB:7A:BB:3C:D0:F4:8C:
B7:92:21:B1:D8:02:01:6B:9B:AD:11:1A:90:5B:21:94:12:B7:5A:15:
10:6B:92:FA:74:F5:49:A2:4A:65:FF:4E:B6:9B:08:7B:BD:E5:85:9D:
98:52:A2:E4:D7:B4:0D:90:0D:62:7E:CE:6B:F8:8B:0C:33:76:1E:01:
C7:0D:29:8C:97:BC:E1:35:58:2B:55:3F:6E:D9:36:46:50:76:74:67:
1F:B2:F6:C3:6B:24:4D:C1:7E:8D:14:4D:10:2D:1D:80:3C:82:02:1C:
A6:87:14:8B:A0:3C:21:EA:DD:A7:CD:9C:D0:1B:DF:84:53:BF:0A:B6:
DA:50:C4:AA:FF:90:44:47:4B:9F:8A:1C:C3:14:5D:A3:B5:A4:5F:6F:
E1:E0:E2:51:B1:1E:5C:7E:95:70:72:76:3A:9D:53:10:F5:F0:3F:CD:
E5:2B:EF:E4:3D:DB:64:65:9B:AE:E6:23:6E:4E:F1:4B:94:17:FF:FF:
06:A0:79:84:E1:BE:24:9D:93:B9:D4:94:41:76:92:D5:5B:8F:F6:4F:
98:B9:24:6F:01:CD:4F:49:52:15:48:79:4A:F3:46:CF:8A:AC:21:A9:
64:81:AC:01:15:80:06:F4:C3:9D:8A:C0:48:A6:53:C5:81:C2:DD:B1:
C6:B9:80:B8:A9:C2:89:B8:20:C5:89:81:90:15:86:78:F7:09:3F:FD:
F6:AC:54:57:8C:E0:B4:62:E0:78:CB:59:63:FA:E6:E2:8C:78:59:31:
92:E5:B5:E3:75:FE:F6:8F:82:3B:D6:5B:B1:84:E9:A8:9E:A4:B0:03:
99:8D:41:55:FF:11:A8:B6:A3:B9:EA:1D:5C:58:F7:D2:A6:F4:3A:C9:
B1:E6:83:10:B7:E5:E4:15:28:2C:62:96

Мой вопрос: Является ли это рекомендуемым (и безопасным) способом подписания драйвера? Предпочтительно, чтобы конечным пользователям не приходилось беспокоиться о хлопотах с подписанием драйверов самостоятельно при установке.

Поскольку моё понимание немного размыло, вот несколько вопросов, которые я не понимаю:

  • Является ли это автоматическое подписание при сборке таким же безопасным, как и учебники выше по ручной подписи драйвера после установки? То есть я генерирую ключ, чтобы его подписать, но этот ключ никогда (по крайней мере явно) не загружается в ядро.
  • Как обычно распределяются и подписываются драйвера? Я ожидал, что крупные компании с проприетарными драйверами для Linux каким-то образом подпишут свои модули, такие как Nvidia.
  • Существует ли способ предварительно подписать модуль (на моей стороне)? Это кажется маловероятным, потому что модуль должен быть создан для любой системы, на которой он будет использоваться.

Я хотел бы оставить Secure Boot включенным (выключение позволяет загружать неподписанный модуль, но клиенты предпочитают иметь Secure Boot включенным).

Я создал arch-sign-modules, чтобы упростить процесс запуска ядра с подписанными как In Tree, так и Out of Tree модулями ядра. В настоящее время он поддерживает сборку:

  • linux-lts
  • linux-hardened
  • linux-zen

с поддержкой zfs / nvidia / lkrg Out of Tree модулей ядра.

Теперь можно установить пользовательское подписанное ядро с помощью 3 команд.

Ответственность за установку вашего модуля лежит на администраторе, который должен удостовериться, что он принят ядром.

Обычно это делегируется дистрибутиву, который, если он настроен для безопасной загрузки, также сгенерирует ключ владельца машины на целевой системе и установит его публичную часть в соответствующий хранилище ключей. Где именно устанавливается закрытый ключ, зависит от дистрибутива, поэтому вам следует использовать метод установки, специфичный для дистрибутива.

В Debian и у многих других dkms обрабатывает это автоматически для вас, и если ваш модуль упакован для Debian, он распространяется как исходное дерево, которое автоматически собирается для всех установленных ядер, а полученный модуль подписывается.

Как автор модуля, сомневаться в дистрибутиве обычно создает больше работы.

Ответ или решение

Создание подписи для автоматической установки модулей в Linux может быть сложной задачей для новичков, особенно в контексте обеспечения безопасности и поддержки механизма Secure Boot. Давайте рассмотрим ваши вопросы и озабоченности по поводу подписания модулей и их распространения.

1. Автоматическая подпись модуля: безопасность и целесообразность

Автоматическая подпись модуля при его сборке, как вы уже проделали с использованием команд OpenSSL для генерации ключей, является подходом, который можно использовать на этапе разработки. Однако, существует несколько аспектов, которые стоит учесть:

  • Безопасность ключа: Ключи, которые вы генерируете, должны храниться в безопасном месте. Если кто-то получит доступ к вашему закрытому ключу, это может привести к уязвимостям. Убедитесь, что ваши ключи действуют только в том контексте, в котором они нужны, и что вы используете механизмы управления доступом.

  • Качество реализации: Более строгие подходы к подписыванию, как описано в учебных пособиях, могут предусматривать проверку ключей и сертификатов. Хотя автоматическая подпись работает, ручное или более детализированное подписание может обеспечить дополнительный уровень гарантии.

2. Распространение и подписание драйверов

Драйверы обычно подписываются и выпускаются следуя политике конкретного дистрибутива. Крупные компании, такие как NVIDIA, используют следующие методы:

  • DKMS (Dynamic Kernel Module Support): Этот инструмент позволяет автоматически пересобирать и подписывать модули для разных версий ядра. DKMS может работать с Secure Boot, автоматически генерируя и используя Machine Owner Key (MOK), что упрощает процесс для конечных пользователей.

  • Пакетирование: В дистрибутивах, как Debian, существуют инструменты для пакетирования, которые автоматизируют подпись модуля и интеграцию с системой. Это позволяет пользователям устанавливать модули без необходимости заниматься вопросами подписи самостоятельно.

3. Предварительная подпись модуля

Предварительная подпись модуля возможна, но:

  • Зависимость от конфигурации системы: Каждый модуль обычно должен соответствовать конфигурации и версии ядра системы, на которой он будет работать. Это может усложнить предварительную подпись, так как при загрузке модуля он должен соответствовать условиям конкретной системы.

  • Рекомендации по подписям: Рекомендуется, чтобы вы фантазировали о ваших методах работы с дистрибутивами. Использование общепринятых подходов, таких как создание пакета для вашего модуля с использованием стандартов, принятой в сообществе, значительно упростит жизнь вам и вашим пользователям.

Заключение

Ваша текущая реализация автоматической подписи модуля может сработать, но для повышения безопасности и комфорта пользователей стоит рассмотреть более стандартизированные подходы, такие как использование DKMS и следование методам распространения, предписанным вашим дистрибутивом. Обратите внимание на документацию дистрибутива и используйте существующие инструменты для автоматизации и упрощения процесса для конечных пользователей. Это позволит избежать неполадок и повысит уровень безопасности вашего программного обеспечения.

Оцените материал
Добавить комментарий

Капча загружается...