Настройка Hex

OSA Proxy поддерживает сканирование Hex-пакетов и подписанных protobuf-манифестов. При сканировании манифеста сервис проверяет подпись upstream-репозитория, обрабатывает версии и подписывает изменённый ответ собственным RSA-ключом.

Настройка OSA Proxy

Создайте стабильный RSA-ключ и храните его в secret storage:

openssl genpkey -algorithm RSA \
  -pkeyopt rsa_keygen_bits:3072 \
  -out osa-hex-signing.pem

Не генерируйте новый ключ при каждом запуске OSA Proxy. После смены ключа клиенты с сохранённым старым публичным ключом перестанут принимать подписанные манифесты. Все реплики OSA Proxy должны использовать один и тот же приватный ключ.

Ключ можно передать строкой через signing-private-key или указать путь к PEM-файлу через signing-private-key-file. Например, для секрета из Vault:

hex:
  enabled: true
  signing-private-key: ${HEX_SIGNING_PRIVATE_KEY:}
  repository:
    - name: codescoring-hex
      registry: https://repo.hex.pm
      scan-manifest: true
      scan-package: true
      remove-blocked-versions: false
      work-mode: strict_wait

Для смонтированного файла используйте:

hex:
  enabled: true
  signing-private-key-file: ${HEX_SIGNING_PRIVATE_KEY_FILE:/run/secrets/osa-hex-signing.pem}

Если заданы оба параметра, signing-private-key имеет приоритет, а файл не читается. Один из двух параметров обязателен, когда хотя бы у одного Hex-репозитория включён scan-manifest.

Публичную часть ключа настраивать не нужно: OSA Proxy вычисляет её при запуске и отдаёт по адресу /{repository-name}/public_key. Публичный ключ upstream-репозитория сервис также получает автоматически и хранит только в памяти.

Подключение Mix

Для примера репозиторий OSA Proxy доступен по адресу https://osa-proxy.example.com/codescoring-hex.

curl -fsS \
  https://osa-proxy.example.com/codescoring-hex/public_key \
  -o /tmp/osa-hex-public-key.pem

mix hex.repo add osa-proxy \
  https://osa-proxy.example.com/codescoring-hex \
  --public-key /tmp/osa-hex-public-key.pem

mix hex.repo set hexpm \
  --url https://osa-proxy.example.com/codescoring-hex \
  --public-key /tmp/osa-hex-public-key.pem

Команда mix hex.repo add создаёт локальный alias osa-proxy, через который Hex получает политику зависимостей. Команда mix hex.repo set направляет запросы к стандартному репозиторию hexpm через OSA Proxy.

Режим remove-blocked-versions: false

По умолчанию remove-blocked-versions: true: OSA Proxy физически удаляет заблокированный release из protobuf-манифеста.

При false release остаётся в манифесте и получает стандартную отметку Hex retired: security. В сообщении указывается имя блокирующей политики CodeScoring. Сама отметка retired показывает предупреждение, но не запрещает Hex установить версию. Поэтому для блокировки при resolution необходимо включить встроенную подписанную policy OSA Proxy. Требуется Hex 2.5 или новее.

Включить policy для одной команды:

HEX_POLICY=osa-proxy/codescoring \
  mix run --no-mix-exs -e 'Mix.install([:jason], force: true)'

Или сохранить её в конфигурации Hex:

mix hex.config policy osa-proxy/codescoring

В значении osa-proxy/codescoring:

  • osa-proxy — локальное имя репозитория из команды mix hex.repo add;
  • codescoring — имя встроенной policy.

Hex получает policy запросом GET https://osa-proxy.example.com/codescoring-hex/policies/codescoring. Policy исключает из нового resolution версии с причиной retirement security, включая версии, которые были отмечены так upstream-репозиторием.

Уже зафиксированные версии

Policy не заменяет версии, уже записанные в mix.lock. Для проверки блокировки выполните resolution без старого lock-файла или используйте чистое окружение. При успешной фильтрации Hex выводит, что policy скрыла версию, и выбирает следующую разрешённую версию.

Страница была полезна?