четверг, 18 марта 2021 г.

Модули в Golang: аутентификации модулей, база данных контрольных сумм

База данных контрольных сумм - это глобальный источник строк go.sum. Команда go может использовать это во многих ситуациях для обнаружения неправильного поведения прокси или исходных серверов.

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

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

Команда go взаимодействует с базой данных контрольных сумм, используя особый протокол.

Ниже указаны запросы, на которые должна отвечать база данных контрольных сумм. Для каждого пути $base - это часть пути URL-адреса базы данных контрольных сумм, $module - это путь к модулю, а $version - это версия. Например, если URL-адрес базы данных контрольных сумм - https://sum.golang.org, а клиент запрашивает запись для модуля golang.org/x/text в версии v0.3.2, клиент отправит запрос GET для https://sum.golang.org/lookup/golang.org/x/text@v0.3.2.

Чтобы избежать неоднозначности при обслуживании из файловых систем без учета регистра, элементы $module и $version кодируются с учетом регистра, заменяя каждую прописную букву восклицательным знаком, за которым следует соответствующая строчная буква. Это позволяет хранить на диске модули example.com/M и example.com/m, поскольку первый кодируется как example.com/!m.

Части пути, окруженные квадратными скобками, например [.p/$W], обозначают необязательные значения.

Путь $base/latest

Возвращает подписанное закодированное древовидное описание для последнего журнала. Это подписанное описание имеет форму примечания, которое представляет собой текст, подписанный одним или несколькими ключами сервера, и его можно проверить с помощью открытого ключа сервера. В описании дерева указан размер дерева и хеш-код заголовка дерева этого размера. Эта кодировка описана в golang.org/x/mod/sumdb/tlog#FormatTree.

Путь $base/lookup/$module@$version

Возвращает номер записи журнала для записи о $module в $version, за которыми следуют данные для записи (то есть строки go.sum для $module в $version) и подписанное закодированное древовидное описание, содержащее запись.

Путь $base/tile/$H/$L/$K[.p/$W]

Возвращает [log tile](плитка журнала)(https://research.swtch.com/tlog#serving_tiles), которая представляет собой набор хешей, которые создают раздел журнала. Каждая плитка определяется в двумерной координате на уровне плитки $L, $K-й слева, с высотой плитки $H. Необязательный суффикс .p/$W указывает на частичную плитку журнала, содержащую только $W хешей. Клиенты должны вернуться к получению полной плитки, если частичная плитка не найдена.

Путь $base/tile/$H/data/$K[.p/$W]

Возвращает данные записи для листовых хешей в /tile/$H/0/$K[.p/$W] (с буквальными элементами данных пути).

Если команда go обращается к базе данных контрольных сумм, то первым шагом является получение данных записи через конечную точку /lookup. Если версия модуля еще не записана в журнал, база данных контрольных сумм попытается получить ее с исходного сервера перед ответом. Эти /lookup данные предоставляют сумму для этой версии модуля, а также его позицию в журнале, который информирует клиента о том, какие плитки следует выбрать для выполнения проверки. Перед добавлением новых строк go.sum в файл go.sum главного модуля команда go выполняет проверки "включения" (наличие определенной записи в журнале) и "согласованности" (отсутствие изменений в дереве). Важно, чтобы данные из /lookup никогда не использовались без предварительной аутентификации по подписанному хешу дерева и аутентификации подписанного хеша дерева по временной шкале подписанных хешей дерева.

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

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

Переменная среды GOSUMDB определяет имя используемой базы данных контрольных сумм и, при необходимости, ее открытый ключ и URL-адрес, например:

GOSUMDB="sum.golang.org"
GOSUMDB="sum.golang.org+<publickey>"
GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"

Команде go известен открытый ключ sum.golang.org, а также то, что имя sum.golang.google.cn (доступно на территории материкового Китая) подключается к базе данных контрольных сумм sum.golang.org; использование любой другой базы данных требует явного указания открытого ключа. По умолчанию используется URL-адрес https://, за которым следует имя базы данных.

GOSUMDB по умолчанию использует sum.golang.org, базу данных контрольных сумм Go, управляемую Google.

Если GOSUMDB выключен или go get вызывается с флагом -insecure, база данных контрольных сумм не запрашивается, и все нераспознанные модули принимаются, за счет отказа от гарантии безопасности проверенных повторяющихся загрузок для всех модулей. Лучший способ обойти базу данных контрольных сумм для определенных модулей - использовать переменные среды GOPRIVATE или GONOSUMDB.

Команду go env -w можно использовать для установки этих переменных для будущих вызовов команды go.


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


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

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