Вопрос или проблема
Недавно мы исследовали, как настроить TPM на наших хостах с Linux: когда они загружаются, параметры grub и ядро проверяются с помощью контрольной суммы, и если контрольная сумма соответствует ожидаемой, модуль TPM расшифровывает ключ, используемый для расшифровки корневой файловой системы, и машина загружается. Если произошло какое-либо вмешательство, ключ не расшифровывается, и компьютер не загружается. Приятно и безопасно.
В том же ключе я хотел бы хранить секреты (например, ключи для TLS-сертификатов, возможно, даже сами TLS-сертификаты) на нашем сервере FreeIPA и предоставлять их хосту только после его аутентификации. Намерение состоит в том, чтобы передать сертификаты Nginx (или другому веб-серверу) без хранения их на диске (ramdisk вполне подойдёт), как описано на сайте nginx (поискать «Безопасное распределение SSL-личных ключей с NGINX» в Google).
Я также нашел статью (поискать «Шифрование и расшифровка файла с помощью SSH-ключей» в Google) о том, как использовать открытый SSH-ключ для шифрования файла, и это заставило меня задуматься, можно ли сделать что-то подобное здесь, используя безопасность Kerberos и FreeIPA.
В кратце, существует ли способ сделать это с помощью существующих команд ipa
, аутентифицируя операции с использованием файла /etc/krb5.keytab
хоста, чтобы это можно было сделать в режиме без присутствия?
Спасибо!
ИЗМЕНЕНИЕ: Чтобы быть более конкретным, я хочу получить строку, содержащую сертификат TLS с подделкой LetsEncrypt и его зашифрованный ключ (который затем я смогу загрузить на сервер Nginx) без участия человека в процессе расшифровки.
- Шаг первый: хост должен автоматически аутентифицироваться на LDAP-сервере (это необязательно, если строка зашифрована). Он уже это делает, но я не уверен, как это использовать для своего приложения.
- Шаг второй: получить строку, которая хранится в LDAP (возможно, в jpegPhoto или audio, или если хранится в объекте хоста, то в каком-либо другом атрибуте)
- Шаг третий: расшифровать строку (один из способов – использовать пару ssh-ключей необычным образом: https://www.bjornjohansen.com/encrypt-file-using-ssh-key. Возможно, Kerberos можно использовать (или злоупотребить) подобным образом?)
- Шаг четвертый: поместить строку в нужное место; блог Nginx предлагает файл на файловой системе tempfs, хотя я бы предпочел использовать ключевую цепочку ядра.
- Шаг пятый: запустить Nginx, который был настроен, как описано в https://www.nginx.com/blog/secure-distribution-ssl-private-keys-nginx/
Поскольку FreeIPA уже работает с сертификатами (см. ipa help cert
), я надеялся, что работать с произвольными сертификатами (в отличие от генерируемых FreeIPA) не будет слишком сложно.
Изменение^2: Оказалось, что у FreeIPA есть функция для работы с такими секретами, которая называется Сейфы. Нет необходимости запихивать данные в несвязанные атрибуты LDAP, нет необходимости создавать какую-то шифровку, и это может связывать секреты с сервисными принципалами, пользователями или группами! Всё это содержится в тексте помощи (ipa help vault
), но поскольку это ближе к концу алфавита, я никогда не читал так далеко. Они конкурируют с AWS за титул «наибольшее количество функций, упакованных в один CLI». 🙂
Оказалось, что у FreeIPA есть функция для работы с такими секретами, которая называется Сейфы. Нет необходимости запихивать данные в несвязанные атрибуты LDAP, нет необходимости создавать какую-то шифровку, и это может связывать секреты с сервисными принципалами, пользователями или группами!
Всё это содержится в тексте помощи (ipa help vault
), но поскольку это ближе к концу алфавита, я никогда не читал так далеко. FreeIPA конкурирует с AWS за титул «наибольшее количество функций, упакованных в один CLI». 🙂
Мне всё еще нужно выяснить точные аргументы CLI, вот почему я пока не подумал добавить это как ответ.
Изменение: Сделать это сложнее, чем я думал, потому что вам нужно запустить ipa-kra-install
для его установки. https://www.freeipa.org/page/V4/Password_Vault_1.0
Ответ или решение
Конечно, давайте разберёмся с вопросом о "Запечатывании" секретов с помощью FreeIPA и возможными шагами для достижения вашей цели.
Использование Vault в FreeIPA для хранения секретов
FreeIPA предлагает функциональность для работы с секретами через механизм, известный как Vault. Это решение позволяет безопасно хранить и распределять конфиденциальные данные, такие как TLS-сертификаты и ключи, без необходимости вручную управлять ими.
Шаги для реализации
-
Установка KRA (Key Recovery Authority):
Прежде всего, необходимо установить компонент KRA. Для этого выполните команду:ipa kra-install
Это создаст хранилище для ваших секретов и активирует соответствующие функции в FreeIPA.
-
Создание хранилища секретов:
Используя командуipa vault
, вы можете создать новое хранилище секретов для TLS-сертификатов и их ключей. Например:ipa vault-add --desc "Хранилище для TLS-сертификатов" my_tls_vault
-
Сохранение секретов в Vault:
После успешного создания хранилища, вы можете добавлять секреты в него:ipa vault-set --vault my_tls_vault --secret "ваш_синтезированный_сертификат_и_ключ"
-
Настройка прав доступа:
Определите, какие пользователи или сервисы смогут получать доступ к вашему хранилищу. Например, для назначения прав доступа служебному аккаунту, выполните:ipa vault-add-permission my_tls_vault --principals my_service_principal
-
Аутентификация:
На хосте аутентификация может осуществляться через Kerberos с использованием/etc/krb5.keytab
. Убедитесь, что ваш сервис может аутентифицироваться без вмешательства человека, используя ключи:kinit -k my_service_principal
-
Извлечение секретов:
После успешной аутентификации вы можете извлечь сохранённые секреты из Vault:ipa vault-get --vault my_tls_vault
Результаты можно перенаправить в файл, расположенный в
tmpfs
, либо сразу передать в процесс, который нуждается в этих данных. -
Интеграция с Nginx:
В зависимости от вашего конфигурационного файла Nginx, нет необходимости хранить секреты на диске. Вместо этого вы можете использовать временные файлы или системные методы (например,keyring
), чтобы передавать секреты, используя вывод команды из шага 6.Примерная структура конфигурации для использования секретов:
ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem;
Убедитесь, что эти файлы создаются из вашего временного хранилища при каждом перезапуске сервиса.
Заключение
С использованием Vault в FreeIPA вы сможете безопасно хранить и управлять TLS-секретами, минимизируя риск компрометации ключей. Данная архитектура также позволит упрощать процессы автоматизации, гарантируя, что доступ к конфиденциальным данным будет предоставляться только аутентифицированным службам в процессе.
Обязательно ознакомьтесь с документацией FreeIPA для детального понимания CLI команд и возможностей Vault. Теперь у вас есть все необходимые шаги для эффективного запечатывания и разблокирования секретов в вашей системе.