Во время полностью автоматизированного развертывания на физическом оборудовании (с использованием pxeboot / preseed / kickstart для установки и настройки минимальной системы для начальной загрузки) нам необходимо развернуть определенные секреты, такие как наш ключ проверки Chef и секретный ключ для доступа к защищенным данным приложения.
В наших средах виртуальных машин мы можем предварительно запечь образы с уже установленными ими, поэтому при развертывании узла у него уже есть файлы локально, и им никогда не придется пересекать сеть, однако для физических серверов, на которых мы создаем прямо из образов сетевой загрузки, мы у меня нет возможности сделать это.
Я пытаюсь придумать как безопасный, так и автоматический способ развертывания этих секретов на серверах, которые подготовлены таким образом, чтобы мы знали, что они не могли оказаться в неправильном месте.
Наша среда подготовки знает обо всех наших физических серверах и о том, были ли они подготовлены или нет - мы создаем определения узлов на нашем сервере Chef, которые включают MAC-адрес основного интерфейса, используемого для PXEBooting, а затем устанавливаем флаг на узле, как только он был подготовлен. Мы используем это только для того, чтобы предлагать файлы PXEBoot узлам, которые еще не были подготовлены, и поэтому мы можем указать в определениях наших узлов релиз / ОС / роли блоков.
Наша текущая рабочая идея - это очень простой веб-сервис, который (через HTTPS) будет передавать секреты узлам, которые еще не были подготовлены. Однако у этого есть ряд недостатков и проблем, которые я вижу. Моя основная забота заключается в том, что наша единственная защита - это проверка MAC-адреса, а MAC-адреса могут быть подделаны (я твердо убежден, что вы никогда не должны считать свою внутреннюю сеть безопасной, хотя это, вероятно, другое обсуждение).
Наша текущая среда подготовки - это Ubuntu 12.04 и 14.04 с PXEboot / Preseeding на выделенных серверах подготовки, хотя мы могли бы адаптировать другие решения для соответствия нашей среде.
Меня в основном беспокоит пара глобальных секретов, доступ к которым также требуется всем узлам, наша идеальная конечная цель - не иметь этих глобальных секретов и иметь секреты для каждого узла, в настоящее время я исследование инструмента для достижения этой цели но на данный момент мы должны иметь дело с текущей настройкой.
Так как же люди безопасно и автоматически распределяют глобальные секреты в средах подготовки? Любые советы или указатели, как это сделать?
Перед загрузкой ОС не так много умных устройств, кроме BMC (небольшая подсистема на материнской плате, которая реализует IPMI / iDRAC / iLO / и т. Д.), Но этого может быть достаточно, в зависимости от того, насколько вы хотите ему доверять .
Вы можете написать к нему ключ (по сети, используя зашифрованный канал IPMI 2.0, или, если это не вариант, надеюсь, через управляющую LAN или VLAN (бах)) во время предзагрузочной последовательности, а затем иметь будущий сервер загрузите ванильную / заглушку ОС, которая просто загружает ОС и не содержит секретов или конфиденциальной информации внутри.
После загрузки прото-сервер может связываться со своим собственным BMC (root не требует аутентификации локально), читать ключ с помощью ipmitool или чего-то еще, а затем разговаривать с материнским кораблем с ключами, прочитанными, обеспечивая уверенность в том, что это тот, кто это говорит является; затем может начаться окончательная подготовка. Используя этот (свободно признанный :)) хакер, вы также можете использовать отдельные ключи для каждой системы.
Возможные места для хранения ключей на BMC включают MAC-адрес (~ 48 бит пространства ключей на порт Ethernet должно быть достаточно для всех (sic!)), Строку сообщества SNMP и т. Д. Все можно сбросить до разумных значений после первоначальная подготовка и легко изменяются.
Реализация этого скромно простой, со сценарием для генерации ключей для каждого сервера, командой ipmitool для установки соответствующих ключей на целевых объектах, сценарием в небольшом базовом образе ОС, который считывает локальные ключи и использует их для аутентификации на материнском корабле , а затем окончательная подготовка. Несомненно, более сложная, чем обычно, подготовка, но иногда за душевное спокойствие приходится платить.