вторник, 9 марта 2021 г.

Модули в Golang: управление инструментами контроля версий с помощью GOVCS

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

Чтобы сбалансировать функциональность и безопасность, команда go по умолчанию будет использовать только git и hg для загрузки кода с общедоступных серверов. Она будет использовать любую известную систему контроля версий (bzr, fossil, git, hg, svn) для загрузки кода с частных серверов, определенных как пакеты хостинга, соответствующие переменной среды GOPRIVATE. Причина, по которой разрешено использование только Git и Mercurial, заключается в том, что эти две системы уделяли наибольшее внимание вопросам работы в качестве клиентов ненадежных серверов. Напротив, Bazaar, Fossil и Subversion в основном использовались в надежных, аутентифицированных средах и не так тщательно изучаются, как поверхности для атак.

Ограничения команд управления версиями применяются только при использовании прямого доступа к управлению версиями для загрузки кода. При загрузке модулей с прокси вместо этого команда go использует протокол GOPROXY, который всегда разрешен. По умолчанию команда go использует зеркало модуля Go (proxy.golang.org) для общедоступных модулей и возвращается к управлению версиями только для частных модулей или когда зеркало отказывается обслуживать общедоступный пакет (обычно по юридическим причинам). Следовательно, клиенты по-прежнему могут получить доступ к общедоступному коду, обслуживаемому из репозиториев Bazaar, Fossil или Subversion по умолчанию, потому что эти загрузки используют зеркало модуля Go, которое берет на себя риск безопасности выполнения команд управления версиями с использованием настраиваемой песочницы.

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

Общая форма переменной GOVCS - это разделенный запятыми список правил pattern:vcslist. Шаблон (pattern) - это glob шаблон, который должен соответствовать одному или нескольким ведущим элементам модуля или пути импорта. Vcslist - это список разрешенных команд управления версиями, разделенных вертикальной чертой, или all, чтобы разрешить использование любой известной команды, или off, чтобы ничего не разрешать. Обратите внимание, что если модуль соответствует шаблону с выключенным vcslist, он все равно может быть загружен, если исходный сервер использует схему мода, которая указывает команде go загрузить модуль с использованием протокола GOPROXY. Применяется самый ранний соответствующий шаблон в списке, даже если более поздние шаблоны также могут совпадать.

Например, рассмотрите:

GOVCS=github.com:git,evil.com:off,*:git|hg

С этой настройкой код с модулем или путем импорта, начинающимся с github.com/, может использовать только git; Пути на evil.com не могут использовать какие-либо команды управления версиями, а все другие пути (* соответствуют всем) могут использовать только git или hg.

Специальные шаблоны public и private соответствуют общедоступному и частному модулю или путям импорта. Путь является частным, если он соответствует переменной GOPRIVATE; в противном случае это public.

Если ни одно правило в переменной GOVCS не соответствует конкретному модулю или пути импорта, команда go применяет свое правило по умолчанию, которое теперь можно обозначить в нотации GOVCS как public:git|hg,private:all.

Чтобы разрешить неограниченное использование любой системы контроля версий для любого пакета, используйте:

GOVCS=*:all

Чтобы отключить любое использование контроля версий, используйте:

GOVCS=*:off

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

GOVCS был представлен в Go 1.16. Более ранние версии Go могут использовать любой известный инструмент контроля версий для любого модуля.


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


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

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