суббота, 2 ноября 2019 г.

Зеркало модуля и база данных контрольных сумм

Зеркало модуля и база данных индексов и контрольных сумм готова к работе! Команда go будет использовать зеркало модуля и базу данных контрольной суммы по умолчанию для пользователей модулей Go 1.13.

В этом посте будут описаны эти сервисы и преимущества их использования.

Зеркало модуля

Модули представляют собой наборы пакетов Go, которые имеют совместную версию, и содержимое каждой версии является неизменным. Эта неизменность предоставляет новые возможности для кэширования и аутентификации. Когда go get запускается в режиме модуля, он должен извлечь модуль, содержащий запрошенные пакеты, а также любые новые зависимости, введенные этим модулем, обновляя файлы go.mod и go.sum по мере необходимости. Извлечение модулей из системы контроля версий может быть дорогостоящим с точки зрения задержки и хранения в вашей системе: команде go может потребоваться выгрузить полную историю коммитов хранилища, содержащего транзитивную зависимость, даже не участвующую в сборке, а просто для разрешения версии.

Решение состоит в том, чтобы использовать прокси модуля, который говорит на API, который лучше подходит для нужд команды go. Когда go get запускается в режиме модуля с прокси, он будет работать быстрее, только запрашивая конкретные метаданные модуля или исходный код, в которых он нуждается, не заботясь об остальном. Ниже приведен пример того, как команда go может использовать прокси с go get, запрашивая список версий, затем файл info, mod и zip для последней версии с тегами.

Зеркало модуля - это особый вид прокси модуля, который кэширует метаданные и исходный код в своей собственной системе хранения, позволяя зеркалу продолжать обслуживать исходный код, который больше не доступен из исходных расположений. Это может ускорить загрузку и защитить вас от исчезновения зависимостей.

Команда Go поддерживает зеркало модуля, размещенное на proxy.golang.org, которое команда go будет использовать по умолчанию для пользователей модулей начиная с версии 1.13. Если вы используете более раннюю версию команды go, вы можете использовать эту службу, установив GOPROXY=https://proxy.golang.org в вашей локальной среде.

База данных контрольных сумм

Модули представили файл go.sum, представляющий собой список хэшей SHA-256 исходного кода и файлов go.mod для каждой зависимости при первой загрузке. Команда go может использовать хэши для обнаружения неправильного поведения исходного сервера или прокси, который дает вам другой код для одной и той же версии.

Ограничение этого файла go.sum заключается в том, что он работает полностью с доверием при первом использовании. Когда вы добавляете версию зависимости, которую вы никогда раньше не видели, в свой модуль (возможно, путем обновления существующей зависимости), команда go извлекает код и добавляет строки в файл go.sum на лету. Проблема в том, что эти строки go.sum не проверяются на чьи-либо еще: они могут отличаться от строк go.sum, которые команда go только что сгенерировала для кого-то другого, возможно, из-за того, что прокси-сервер преднамеренно предоставил вредоносный код, предназначенный для вас.

Решение Go - это глобальный источник строк go.sum, называемый базой данных контрольных сумм, который гарантирует, что команда go всегда добавляет одинаковые строки в каждый файл go.sum. Всякий раз, когда команда go получает новый исходный код, она может проверить хэш этого кода в этой глобальной базе данных, чтобы убедиться, что хэши совпадают, гарантируя, что все используют один и тот же код для данной версии.

База данных контрольных сумм обслуживается sum.golang.org и построена на Transparent Log (или "дерево Меркле") хэшей, поддерживаемом Trillian. Основное преимущество дерева Меркле заключается в том, что оно защищено от несанкционированного доступа и обладает свойствами, которые не позволяют ненадлежащему поведению оставаться незамеченным, что делает его более надежным, чем простая база данных. Команда go использует это дерево для проверки доказательств "включения" (что в журнале существует конкретная запись) и доказательств "согласованности" (что дерево не было подделано) перед добавлением новых строк go.sum в ваш go.sum файл модуля. Ниже приведен пример такого дерева.

База данных контрольных сумм поддерживает набор конечных точек, используемых командой go для запроса и проверки строк go.sum. Конечная точка /lookup предоставляет "signed tree head" (STH) и запрошенные строки go.sum. Конечная точка /tile предоставляет фрагменты дерева, называемые tiles, которые команда go может использовать для доказательства. Ниже приведен пример того, как команда go может взаимодействовать с базой данных контрольных сумм, выполняя /lookup версии модуля, а затем запрашивая tiles, необходимые для доказательств.

Эта база данных контрольных сумм позволяет команде go безопасно использовать ненадежный прокси-сервер. Поскольку над ним находится контролируемый уровень безопасности, прокси-сервер или исходный сервер не могут преднамеренно, произвольно или случайно начать вводить неверный код, не будучи пойманным. Даже автор модуля не может перемещать свои теги или иным образом изменять биты, связанные с конкретной версией, из одного дня в другой без обнаружения изменений.

Если вы используете Go 1.12 или более раннюю версию, вы можете вручную сравнить файл go.sum с базой данных контрольных сумм с помощью gosumcheck:

$ go get golang.org/x/mod/gosumcheck
$ gosumcheck /path/to/go.sum

В дополнение к проверке, выполненной командой go, сторонние аудиторы могут контролировать базу данных контрольных сумм, просматривая журнал в поисках неверных записей. Они могут работать вместе и обмениваться информацией о состоянии дерева по мере его роста, чтобы гарантировать, что оно остается бескомпромиссным.

Индекс модулей

Индекс модулей обслуживается index.golang.org и является общедоступным источником новых версий модулей, которые становятся доступны через proxy.golang.org. Это особенно полезно для разработчиков инструментов, которые хотят иметь свой собственный кэш того, что доступно на proxy.golang.org, или быть в курсе некоторых из новейших модулей, которые используют люди.


Читайте также:


Комментариев нет:

Отправить комментарий