Воспроизводимая установка Debian

Есть ли способ создать чистый образ на основе Debian (я хочу его для контейнера, но он также может быть для виртуального) с пользовательским выбором пакетов, которые были бы бинарными точно такими же, как установленные пакеты и параметры debconf подобные?

В основном для этого было бы два применения:

  • Образ, в котором указаны точные версии пакетов, которые он содержит, может быть проверен независимо (с использованием моментальных снимков или пересборки пакетов, насколько Debian удалось сделать эти сборки воспроизводимыми)
  • Простая проверка того, есть ли у какого-либо из пакетов новая версия, так как образ можно просто пересобирать каждую ночь, а его контрольная сумма будет меняться только после того, как в пакетах произойдут фактические изменения.

Он может быть собран из базового образа, опубликованного Debian (например, образ докера debian:stable) и apt или с использованием debootstrap (IIRC, базовый образ Debian также создан с помощью debootstrap) или другого подходящего компоновщика.


person Jan Hudec    schedule 11.05.2020    source источник
comment
Это частая причина того, что образы докеров не воспроизводятся, apt может привести к исправлению ошибок, которые потенциально могут изменить поведение ваших образов, и затруднить сравнение развернутой версии, созданной на вашем диске. См., например, Q: действительно воспроизводимые контейнеры Docker и Вопрос: как выполнить детерминированную сборку для Docker   -  person Att Righ    schedule 23.06.2021
comment
Дубликат: stackoverflow.com/questions/61903495/   -  person Att Righ    schedule 23.06.2021
comment
@AttRigh, а не дубликат; принятый ответ на этот вопрос здесь совершенно неприемлем, потому что он касается только версий пакетов, но не касается других проблем бинарного равенства, таких как детерминированное написание конфигураций или стабильные временные метки.   -  person Jan Hudec    schedule 24.06.2021
comment
классно классно. Меня не интересует идентичное поведение (которое, конечно же, подразумевается бинарной эквивалентностью), чем бинарная эквивалентность. Возможно, наградили не тем билетом.   -  person Att Righ    schedule 24.06.2021
comment
@AttRigh Debian пытается сделать сами пакеты воспроизводимыми: wiki.debian.org/ReproducibleBuilds. Но тогда менеджер пакетов также должен быть воспроизводимым, и я не уверен, что кто-то когда-либо пробовал.   -  person Jan Hudec    schedule 24.06.2021
comment
Я вижу ценность этого. Я видел несколько докладов, в которых говорилось, как это позволяет вам проверять, соответствуют ли бинарные пакеты исходному коду, поэтому верьте, что они не были подделаны. Для ряда случаев использования это не важно, потому что вы можете установить конкретную выпущенную версию пакета pip, который существует в кеше, и получить гарантированно идентичное поведение.   -  person Att Righ    schedule 24.06.2021
comment
@AttRigh … и образ Docker также в некотором смысле является пакетом, поэтому также имеет смысл сделать его воспроизводимым, чтобы проверить отсутствие неожиданных влияний со стороны среды сборки — и образ Docker создается путем установки пакетов (не независимо от того, Debian, RedHat или Alpine). Как и образ ВМ (например, в OVF).   -  person Jan Hudec    schedule 24.06.2021


Ответы (2)


Если вы хотите это гарантировать, создайте свой образ один раз, сохраните его с помощью docker save или docker push где-нибудь, а затем используйте этот образ в качестве базового.

docker save: https://docs.docker.com/engine/reference/commandline/save/
docker push: https://docs.docker.com/engine/reference/commandline/push/

РЕДАКТИРОВАТЬ: это не сработает, см. комментарии ниже.

person Roman Pavelka    schedule 29.06.2021
comment
У меня нет проблем с сохранением изображения, но это полностью упускает суть. Я хочу убедиться, что нет непредвиденных факторов окружающей среды, а это значит, что я хочу построить его дважды, а затем убедиться, что они одинаковы. - person Jan Hudec; 29.06.2021
comment
Что ж, тогда должно быть достаточно сравнить идентификатор изображения, потому что это должен быть sha256 объекта конфигурации Image JSON, который также содержит sha256 дайджесты содержимого всех слоев: windsock.io/explaining-docker-image-ids Должен ли я обновить свой ответ? - person Roman Pavelka; 29.06.2021
comment
Достаточно было бы сравнить идентификатор изображения, если сборка была детерминированной. Но это не так. Все файлы будут иметь разные метки времени, и они являются частью хэша. На самом деле, это может быть самым большим препятствием на пути создания детерминированной сборки (воспроизводимые сборки Debian делают фальшивые временные метки). Затем есть порядок сериализации различных вещей, где алгоритмы хеширования часто преднамеренно засолены. - person Jan Hudec; 29.06.2021
comment
Блин, вы правы, я об этом не подумал. Поможет ли это ниже подделать время? manpages.ubuntu.com/manpages/trusty/man1/datefudge.1. html - person Roman Pavelka; 29.06.2021
comment
Не совсем. 1. вы не можете предварительно загрузить что-либо в процессы в контейнере (сборка тоже является контейнером), 2. докер запускает контейнер из демона, поэтому вы также не можете ничего предварительно загрузить в него, и 3. он не подделывает файл временные метки в любом случае. - person Jan Hudec; 29.06.2021
comment
Я понимаю. Моя последняя идея состоит в том, чтобы вручную вычислить sha256 содержимого всех файлов в дереве без учета метки времени. Затем сравните деревья с соответствующими хэшами контента. - person Roman Pavelka; 29.06.2021
comment
Контрольные суммы образов OCI — это просто контрольные суммы манифестов, а те, в свою очередь, включают контрольные суммы файлов .tar с содержимым, но можно написать инструмент, который будет переупаковывать образ каноническим образом, отбрасывая временные метки в процесс. Например, пакеты npm теперь записываются с постоянными отметками времени в файлах .tar. Как и пакеты Debian с инструментами воспроизводимых сборок. - person Jan Hudec; 30.06.2021

Вы можете использовать mmdebstrap, который по умолчанию должен создавать воспроизводимые установки (если установлена ​​переменная среды SOURCE_DATE_EPOCH), иначе я думаю, что это будет считаться ошибкой.

Также есть вики-страница, отслеживающая это для других инструментов в Debian, по адресу https://wiki.debian.org/ReproducibleInstalls.

person Guillem Jover    schedule 01.08.2021