The Go Blog
Запущен модульный зеркальный сервер и база данных контрольных сумм
Мы рады сообщить, что наш модульное зеркало,
индекс и
база данных контрольных сумм теперь готовы к использованию в продакшене! Команда go
будет использовать модульное зеркало и базу данных контрольных сумм по умолчанию для
пользователей Go 1.13 с модулями. См.
proxy.golang.org/privacy для получения информации о конфиденциальности
этих сервисов и
документации команды go
для получения сведений о конфигурации, включая то, как отключить использование этих серверов или
использовать другие. Если вы полагаетесь на закрытые модули, см.
документацию по настройке вашей среды.
В этой статье будут описаны эти сервисы и преимущества их использования, а также подведены итоги некоторых моментов из доклада Go Module Proxy: Life of a Query на Gophercon 2019. См. запись доклада, если вы заинтересованы в полном выступлении.
Модульное зеркало
Модули — это наборы Go-пакетов,
которые версионируются вместе, и содержимое каждой версии неизменно.
Эта неизменность открывает новые возможности для кэширования и аутентификации.
Когда команда go get запускается в режиме модулей, ей необходимо загрузить модуль, содержащий
запрашиваемые пакеты, а также любые новые зависимости, введённые этим модулем,
обновляя при необходимости файлы
go.mod и
go.sum.
Загрузка модулей из системы контроля версий может быть затратной по времени и занимаемому месту:
команда go может быть вынуждена загрузить полную историю коммитов репозитория, содержащего транзитивную зависимость,
даже если она не используется при сборке, просто чтобы определить её версию.
Решением является использование модульного прокси, который использует API, лучше подходящий
для нужд команды go (см. go help goproxy). Когда команда go get запускается
в режиме модулей с прокси, она работает быстрее, запрашивая только конкретные метаданные модуля или исходный код,
не беспокоясь о других вещах. Ниже приведён пример того, как команда go может использовать прокси с go get,
запрашивая список версий, затем информацию, файл mod и zip-файл для последней тегированной версии.
Зеркало модуля — это особый вид модульного прокси, который кэширует метаданные и исходный код в собственной системе хранения, позволяя зеркалу продолжать обслуживание исходного кода, который больше недоступен из оригинальных мест. Это может ускорить загрузку и защитить вас от исчезающих зависимостей. Дополнительную информацию см. в Go Modules в 2019 году.
Команда Go поддерживает зеркало модулей, размещённое по адресу proxy.golang.org, которое команда go будет использовать по умолчанию для пользователей модулей, начиная с 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 и основана на Прозрачном журнале (или "дереве Меркла"), реализованном с использованием Trillian. Основное преимущество дерева Меркла заключается в том, что оно устойчиво к подделке и обладает свойствами, которые не позволяют недобросовестному поведению остаться незамеченным, что делает его более надёжным по сравнению с простой базой данных. Команда go использует это дерево для проверки доказательств "включения" (что конкретная запись существует в журнале) и доказательств "согласованности" (что дерево не было подделано) перед тем, как добавлять новые строки go.sum в файл go.sum вашего модуля. Ниже приведён пример такого дерева.
База данных контрольных сумм поддерживает
набор конечных точек, используемых командой go для запроса и проверки строк go.sum. Конечная точка /lookup предоставляет «подписанную голову дерева» (STH) и запрашиваемые строки go.sum. Конечная точка /tile предоставляет фрагменты дерева, называемые плитками (tiles), которые команда go может использовать для доказательств. Ниже приведен пример того, как команда go может взаимодействовать с базой данных контрольных сумм, выполняя /lookup версии модуля, а затем запрашивая необходимые для доказательств плитки.
Эта база данных контрольных сумм позволяет команде go безопасно использовать иной непроверенный прокси. Поскольку существует аудируемый уровень безопасности, расположенный поверх неё, прокси или сервер-источник не могут намеренно, произвольно или случайно начать предоставлять вам неверный код, не будучи замеченными. Даже автор модуля не может перемещать свои теги или иным образом изменить биты, связанные с конкретной версией, от одного дня к другому, не будучи замеченным.
Если вы используете Go 1.12 или более раннюю версию, вы можете вручную проверить файл go.sum против базы данных контрольных сумм с помощью
gosumcheck:
<code>$ go get golang.org/x/mod/gosumcheck $ gosumcheck /path/to/go.sum </code>
Помимо проверки, выполняемой командой go, сторонние аудиторы могут отслеживать базу данных контрольных сумм, перебирая журнал в поисках недопустимых записей. Они могут работать совместно и обмениваться информацией о состоянии дерева по мере его роста, чтобы убедиться, что оно не было скомпрометировано, и мы надеемся, что сообщество Go будет запускать таких аудиторов.
Индекс модулей
Индекс модулей обслуживается index.golang.org и представляет собой публичную рассылку новых версий модулей, доступных через proxy.golang.org. Это особенно полезно для разработчиков инструментов, которые хотят хранить собственный кэш того, что доступно в proxy.golang.org, или быть в курсе последних модулей, используемых людьми.
Обратная связь или ошибки
Мы надеемся, что эти сервисы улучшат ваш опыт работы с модулями, и приглашаем вас сообщать о проблемах, если вы столкнётесь с трудностями или захотите оставить отзыв!
Следующая статья: Выпущен Go 1.13
Предыдущая статья: Переход к Go Modules
Индекс блога