Публикация репозитория F-Droid с использованием модуля аппаратной безопасности
Posted on 2020-10-05 by
Ниже приводится руководство по публикации приложений через F-Droid с помощью аппаратного модуля безопасности (HSM). HSM, используемый в этом сообщении, - это Nitrokey HSM2. Другие аппаратные токены должны обладать аналогичной функциональностью, но для взаимодействия с HSM вам придется использовать другие команды.
Хранение ключей подписи в HSM обеспечивает значительные преимущества с точки зрения безопасности. Как только ключ генерируется внутри HSM, он никогда не может быть извлечен в виде обычного текста. Вместо этого данные, которые необходимо подписать, отправляются в HSM, который производит подпись с помощью внутреннего ключевого материала. Также применяются некоторые технологии защиты от несанкционированного вскрытия, что делает физическое извлечение ключа очень сложным.
Ключ подписи для приложения Android является частью идентификации приложения. В качестве меры безопасности обновление для приложения может быть установлено только в том случае, если новый apk подписан тем же закрытым ключом, что и старый. Хранение ключей в HSM гарантирует, что даже если злоумышленник скомпрометирует вашу инфраструктуру, он не сможет украсть ключи подписи. Фактически, никогда не возникает никаких сомнений в том, что злоумышленник мог получить доступ к ключам. Для этого необходимо украсть физический HSM, что, по крайней мере, очевидно. Однако злоумышленник все равно может использовать HSM для подписи вредоносных приложений.
F-Droid имеет два этапа подписания. Подписываются все apk, а также индекс хранилища. Все эти ключи в идеале должны храниться в HSM.
Дисклеймер: Я спросил Nitrokey, могут ли они спонсировать несколько HSM Nitrokey, чтобы заставить рабочий процесс публикации F-Droid работать с ними. Они согласились прислать мне три штуки и попросили написать в блоге статью о моих результатах.
Шаг 0: Подготовка Nitrokey HSM2
Настоятельно рекомендуется инициализировать Nitrokey ключом шифрования устройства (DKEK) перед использованием. Это позволяет создавать резервные копии ключей и восстанавливать их на другой Nitrokey, инициализированный тем же DKEK, в случае отказа оборудования. Это также необходимо для импорта существующих ключей подписи в HSM (см. ниже).
Пошаговое руководство по настройке и возможные варианты управления ресурсами DKEK и парольными фразами можно найти здесь
Излишне говорить, что хранить DKEK следует в очень надежном месте.
(необязательно) Шаг 1: Импорт существующих ключей в HSM
Nitrokey HSM2 может импортировать только те ключи, которые “обернуты” (зашифрованы) правильным DKEK, поэтому для импорта простого ключа из хранилища ключей java этот ключ необходимо сначала вручную обернуть DKEK. Производитель SmartCard, используемых в Nitrokey HSMs (CardContact), имеет инструмент под названием smartcard-shell, который может это сделать. Инструмент не очень удобен в использовании (это java GUI инструмент, написанный на javascript). Я перенес этот процесс на небольшой инструмент командной строки python, который можно найти здесь.
Шаг 2: Настройка репозитория F-Droid
Вам следует использовать последнюю версию F-Droid 2.0a или установить ее с git master. Недавно были устранены некоторые проблемы с использованием HSM.
Инициализируйте новый репозиторий следующим образом, это позволит установить необходимые конфигурационные файлы для использования fdroid с HSM
$ fdroid init --keystore NONE # NONE означает использование хранилища ключей HSM
Затем вам нужно будет изменить keystorepass
в config.py, который должен
быть установлен на пин-код смарт-карты Nitrokeys. Если вы импортировали
существующий ключ подписи репозитория, его нужно установить как
repo_keyalias
. В противном случае вы можете создать новый ключ
непосредственно на HSM (измените keydname
на то, как должны выглядеть
данные сертификата для вашего репозитория)
$ fdroid update --create-key # Это займет некоторое время...
Шаг 3: Подписать приложение и опубликовать индекс
С этого момента все должно работать как обычно, пока Nitrokey подключен к
вашей машине. F-Droid будет автоматически использовать его при публикации
приложений с помощью fdroid publish
и при создании подписанного индекса
репозитория с помощью fdroid update
.
А как насчет подписания большого количества приложений?
Nitrokey HSM2 имеет ограниченное пространство для ключей подписи, он может хранить до 38 2048-битных RSA-ключей. Существует work-in-progress MR, использующий функциональность обернутого ключа для загрузки ключей подписи приложений в HSM только по требованию. Это позволяет использовать неограниченное количество различных ключей с одним Nitrokey. (Большое спасибо Джейсону Доненфельду (zx2c4) за эту идею!)