2016-07-24 5 views
-1

Мы используем пакеты RPM для развертывания нашего продукта в среде наших клиентов. Чтобы сделать RPM полностью автономным, мы персонализируем RPM в соответствии с условиями конкретного клиента. Таким образом, клиенту необходимо установить RPM, не следуя никакому мастеру для редактирования файлов конфигурации.RPM - изменение пакета после подписания

Моя проблема заключается в следующем: Подписываем пакет RPM перед его персонализацией. Процесс персонализации включает добавление информации в файл RPM (без добавления заголовков RPM, просто добавления необработанных данных). Эта модификация (естественно) нарушает подпись пакета.

Что я ищу - это трюк, позволяющий мне модифицировать файл, не нарушая подпись.

Вот что я пытался до сих пор:

  1. «ведущая» часть пакета содержит зарезервированные байты, которые могут быть использованы, но очень ограничен в размерах и не масштабируется.
  2. Добавление расширенных атрибутов файла - очень проста в использовании, но атрибуты исчезают при копировании файла (для сохранения атрибутов существуют специальные флажки, но мы не можем обеспечить их использование).
  3. Мы подумали о том, чтобы вставить фиктивный заголовок в RPM и обмануть код RPM, чтобы не проверять его, но не знаете, как это сделать.
  4. Подписание пакета ПОСЛЕ того, как была выполнена персонализация - также не масштабируема, потому что это означает, что нам нужно подписать пакет для каждого клиента, а не только один раз.

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

Любые идеи?

Спасибо!

+0

Кто бы ни опросил мой вопрос - это действительно нецелесообразно, чтобы просто downvote, не давая никаких оправданий. У моего вопроса создается впечатление, что до начала исследования не проводилось никаких исследований? – kernelony

ответ

2

Если вы действительно ДОЛЖНЫ изменить * .rpm при сохранении существующих подписей, добавьте теги в заголовок подписи, предпочтительно с номерами тегов между десятичными ~ 275 и 999. Оба существующих сигнатурных текста (заголовок и заголовок + полезная нагрузка) не будут затронуты дополнительными тегами/данными в заголовке подписи.

Обратите внимание, что более поздние версии RPM были вынуждены явно перечислять теги и типы и данные, чтобы предотвратить обнаружение segfaults с помощью fuzzing. Но даже в этом случае есть тег дополнения (0x3fffffff из памяти), который может быть заполнен дополнительными данными. Опять же - iirc - последние версии rpm также подтверждают, что заполнение - все 0x00, поэтому предостережение emptor.

Между тем вы не описали, что такое «персонализация», и любые теги, добавленные в заголовок подписи, будут отброшены, когда пакет будет установлен. Также обратите внимание, что код для перезаписи заголовка подписи в * .rpm немного сложнее из-за заполнения, чтобы заголовок метаданных, следующий за заголовком подписи, выравнивался по 8 байт.

Я предлагаю вам обнаружить, что дополнительный файл, содержащий «персонализацию», является лучшим инженерным подходом. Искусство взлома знать, когда остановиться ;-)

+0

Я бы предпочел использовать отдельный файл для конфигурации ... он стал более чистым. Это просто противоречит тому, как наш продукт работает сегодня на других ОС, поэтому мне было настоятельно предложено сохранить его таким образом. Большое спасибо за ответ, я рассмотрю его (+1 от меня) – kernelony

+0

Если я могу спросить, как добавить тег в заголовок подписи? Я не нашел для этого инструмента. Должен ли я писать для этого проприетарный код? – kernelony

+0

Существует не инструмент, но есть API RPM для загрузки/выгрузки заголовков и добавления/удаления тегов. Его не очень сложное кодирование. Инструмент отсутствует, потому что нет необходимости расширять пакеты * .rpm без отставки. –

3

5-й вариант заключается в создании пакета, который включает ваши изменения и зависит от подписанного пакета. Подписываете ли вы ваш пакет, конечно, зависит от того, как он распространяется.

Если пакет изменяет файлы в оригинальном RPM, вы можете работать вокруг этого (конфликтующего использования имен файлов), делая %pre и %preun скриптлетов переименовать исходные файлы в версию резервного копирования и добавление символической ссылки на ваши замены. Это мешает проверке исходного содержимого пакета, но ваши изменения должны быть чем-то, что вы можете проверить в каждом конкретном случае.

+0

Спасибо за ваш ответ. Если я правильно вас понимаю, вы имеете в виду создание дополнительного пакета RPM и его распространение. Однако я хотел бы использовать один файл. Мне не нужно изменять какой-либо упакованный файл, BTW. – kernelony

+0

Этот ответ - способ сделать это. Вы не переупаковываете RPM 'httpd' у поставщика ОС, потому что тогда вы находитесь в бизнесе по исправлению безопасности. Вы создаете RPM с именем «httpd-config-myorg», который 'Requires'' httpd' и попадает в файлы конфигурации. Если другой RPM не правильно помещает файлы конфигурации, вы используете '% pre','% post' и '% triggerin', как указано выше. –

+0

Возможно, мне что-то не хватает, но как насчет пакета «httpd-config-myorg»? Вам тоже не нужно подписывать его? Если вы это сделаете, то снова вам придется повторять процедуру подписания для каждого клиента. – kernelony

1

Подписание пакета ПОСЛЕ персонализация имеет место - также не масштабируется, потому что это означает, что мы должны подписать пакет для каждого клиента, а не только один раз.

Почему это не масштабируется? Просто потому, что rpmsign хочет, чтобы вы вводили кодовую фразу? Посмотрите на obs-sign https://en.opensuse.org/openSUSE:Build_Service_Signer (доступно в Suse, Fedora и Epel). Он способен автоматизировать подписание и все же сохранять его в безопасности.

+0

Нет, потому что процесс подписи не полностью автоматизирован. Кроме того, сущность, которая добавляет персонализацию (и хранит данные клиентов), в настоящее время не имеет возможности подписываться (у нее нет доступа к закрытому ключу). Спасибо за ссылку, я посмотрю (+1) – kernelony

+0

С obs-sign секретный ключ (может быть) хранится на другой машине, где у вас нет доступа. Вы просто вычисляете дайджест на клиенте, вы отправляете его на сервер подписи (он проверяет белый IP-адрес) и отправляет обратно подпись, которую клиент вводит в заголовок RPM. Вы можете получить открытый ключ, но закрытый ключ никогда не покидает сервер подписи. – msuchy

+0

Интересно, спасибо. Как вы вводите дайджест в RPM? Есть ли встроенная команда для этого? (например, rpm --addsign?) – kernelony

Смежные вопросы