Настройка сервиса
Основные параметры
Конфигурация OSA Proxy осуществляется через файл application.yml:
Пример конфигурационного файла
# Параметры CodeScoring
codescoring:
host: URL-адрес сервера CodeScoring
token: токен авторизации (с уровнем доступа User и выше)
work-mode: рабочий режим (применяется только к сканированию пакетов)
# warmup | Разогрев кэша сканирования без мониторинга запросов, без блокировки
# spectator | Разогрев кэша сканирования с мониторингом запросов, без блокировки
# moderate | Блокировка на основе политик с использованием результатов кэша, загрузка непроверенных компонентов разрешена
# strict | Блокировка на основе политик с использованием результатов кэша, загрузка непроверенных компонентов заблокирована
# strict_wait | Блокировка на основе политик, ожидание, пока компонент не будет отсканирован
proxy-manager-host: хост прокси-сервера
enable-status-line: true/false (добавляет сообщение о причине блокировки в строку состояния)
block-status-code: статус код для блокировки загрузки пакетов
block-on-codescoring-errors: блокирует загрузку пакета при 5xx status, ошибках сканирования (scan_failed)
override-block-url: true/false (заменяет URL в ссылке на причину блокировки на указанный в codescoring.host)
remove-blocked-versions: true/false (по умолчанию true; при true — заблокированные версии удаляются из манифеста, при false — помечаются как устаревшие)
# Настройки PyPI
pypi:
enabled: true
repository:
- name: internet-pypi
scan-manifest: true
scan-package: true
url-encoded-config: true
registry: https://pypi.org
packages-registry: https://files.pythonhosted.org
- name: arti-pypi
scan-manifest: true
scan-package: true
registry: http://localhost:8081/artifactory/api/pypi/pypi-remote
packages-registry: http://localhost:8081/artifactory/api/pypi/pypi-remote/packages
- name: nexus-pypi
scan-manifest: true
scan-package: true
registry: https://localhost:8081/repository/pypi-proxy
packages-registry: https://localhost:8081/repository/pypi-proxy/packages
# Настройки Maven
maven:
enabled: true
repository:
- name: internet-mvn
scan-manifest: true
scan-package: true
url-encoded-config: true
registry: https://repo1.maven.org/maven2
- name: arti-mvn
scan-manifest: false
scan-package: true
registry: http://localhost:8081/artifactory/maven-remote
- name: nexus-mvn
scan-manifest: false
scan-package: true
registry: http://localhost:8081/repository/maven-proxy
# Настройки NPM
npm:
enabled: true
repository:
- name: internet-npm
scan-package: true
scan-manifest: true
url-encoded-config: true
registry: https://registry.npmjs.org
- name: arti-npm
scan-package: true
scan-manifest: true
registry: http://localhost:8081/artifactory/api/npm/npm-remote
- name: nexus-npm
scan-package: true
scan-manifest: true
registry: http://localhost:8081/repository/npm-proxy
# Настройки NuGet
nuget:
enabled: true
repository:
- name: codescoring-nuget
scan-package: true
url-encoded-config: true
registry: https://api.nuget.org
- name: arti-nuget
scan-package: true
registry: http://localhost:8081/artifactory/api/nuget/v3/nuget-remote
- name: nexus-nuget
scan-package: true
scan-manifest: true
registry: http://localhost:8081/repository/nuget-v3-proxy
# Настройки GO
go:
enabled: true
repository:
- name: codescoring-go
scan-manifest: true
scan-package: true
url-encoded-config: true
registry: https://proxy.golang.org/
sumdb-registry: https://sum.golang.org
- name: arti-go
scan-package: true
scan-manifest: true
url-encoded-config: true
registry: http://localhost:8081/artifactory/api/go/go-virt
- name: nexus-go
scan-package: true
scan-manifest: true
url-encoded-config: true
registry: http://localhost:8081/repository/go-proxy/
# Настройка Debian
debian:
enabled: true
repository:
- name: codescoring-debian
scan-package: true
url-encoded-config: true
registry: https://ports.ubuntu.com/ubuntu-ports/
distro: plucky
- name: arti-debian
scan-package: true
url-encoded-config: true
registry: http://localhost:8081/artifactory/debian-remote
distro: plucky
- name: nexus-debian
scan-package: true
url-encoded-config: true
registry: http://localhost:8081/repository/debian11
distro: bullseye
# Настройка Alpine (APK)
alpine:
enabled: true
repository:
- name: codescoring-alpine
scan-package: true
registry: https://dl-cdn.alpinelinux.org/alpine
- name: arti-alpine
scan-package: true
registry: http://localhost:8081/artifactory/alpine-remote
# Настройка RPM
rpm:
enabled: true
repository:
- name: codescoring-rpm
scan-package: true
registry: https://repo.almalinux.org/almalinux
- name: arti-rpm
scan-package: true
registry: http://localhost:8081/artifactory/rpm-remote
# Настройка Docker Registry
docker:
enabled: true
repository:
- name: codescoring-docker
registry: https://registry-1.docker.io
auth-token-url: https://auth.docker.io
- name: arti-docker
registry: http://localhost:8081/artifactory/docker-remote
auth-token-url: http://localhost:8081
Особенности работы в Nexus Repository и JFrog Artifactory
- Для JFrog Artifactory рекомендуется выставить
Custom Base URL и использовать его в поле registry для корректной замены ссылок на пакеты внутри манифестов;
- В конфигурации
пакетный менеджер -> jfrog -> OSA proxy -> internet, в дополнительных настройках репозитория JFrog необходимо выставить флаг Bypass HEAD requests.
- Для Nexus Repository идентичного функционала нет, в манифестах будет использован хост и порт (если указан) из запроса. При наличии
reverse proxy рекомендуется использовать ссылку на него. Например: registry: https://nexushost.ru/repository/pypi-proxy.
Дополнительные настройки
Настройки уровня логирования
Пример настройки логирования
logging:
level:
ru:
codescoring: info
Просмотр заблокированных пакетов в логах
Чтобы найти заблокированные пакеты в логах приложения, убедитесь, что уровень логирования для ru.codescoring установлен на info или ниже. Компонент PolicyLogger выводит информацию о заблокированных пакетах в следующих форматах:
- Для пакетов, заблокированных политиками:
Policy '<policy_name>' blocked package '<package_name>' versions: [<versions>]
- Для пакетов OSA, заблокированных платформой:
Policy blocked package '<purl>' for endpoint '<endpoint>': <reason>
Логирование внешних запросов
Внешние запросы в сторонние реестры можно логировать с помощью логгера ru.codescoring.proxy.logging.RegistryRequestResponseLogger. Для этого необходимо установить уровень логирования trace для данного компонента.
Пример настройки логирования внешних запросов
logging:
level:
ru.codescoring.proxy.logging.RegistryRequestResponseLogger: trace
Режим обработки заблокированных версий в манифестах
Параметр codescoring.remove-blocked-versions управляет тем, как заблокированные версии пакетов отображаются в манифестах npm, PyPI и NuGet:
true (по умолчанию) — заблокированные версии полностью удаляются из манифеста. Пакетный менеджер не видит их и не предлагает пользователю.
false — заблокированные версии остаются в манифесте, но помечаются как устаревшие с указанием имени сработавшей политики:
- npm — поле
deprecated версии содержит имя политики;
- PyPI — атрибут
data-yanked ссылки на пакет содержит имя политики;
- NuGet — поле
deprecation.message записи содержит имя политики, listed устанавливается в false.
Пример настройки
codescoring:
remove-blocked-versions: false
Размер буфера для обработки больших манифестов
Пример настройки размера буфера
spring:
http:
codecs:
max-in-memory-size: 150MB (это настройка по умолчанию, уже включенная в приложение, увеличьте ее, если вы столкнулись с очень большими манифестами)
Политики повторных попыток и circuit breaker для запросов к платформе:
Настройка повторных попыток
Эта конфигурация определяет политику повторных попыток для сервиса codeScoringApi. Она настроена на обработку временных сбоев путем повторной попытки запроса до 3 раз.
Повторные попытки используют стратегию экспоненциального отступления, начиная с задержки в 1 секунду и удваивая ее с каждой попыткой. Эта политика применяется только к определенным исключениям, таким как WebClientRequestException.
Настройка Circuit Breaker
Circuit breaker (автоматический выключатель) для codeScoringApi действует как механизм быстрого отказа. Он отслеживает частоту сбоев и, если она достигает 50% (рассчитывается по последним 20 вызовам), он «открывается» и предотвращает дальнейшие запросы в течение 30 секунд. Это дает нижестоящему сервису время на восстановление. После периода ожидания он переходит в «полуоткрытое» состояние, позволяя пройти 5 пробным вызовам, чтобы определить, восстановился ли сервис.
Конфигурация Retry и Circuit Breaker может быть переопределена путем установки следующих свойств, например, для codeScoringApi.
Добавление truststore сертификатов
Пример добавления truststore сертификатов в application.yml
spring:
cloud:
gateway:
server:
webflux:
httpclient:
ssl:
trustedX509Certificates:
- /usr/local/share/ca-certificates/codescoring.crt
- /etc/ssl/certs/ca-certificates.crt
Добавление http proxy
Пример настройки http proxy
spring:
cloud:
gateway:
httpclient:
proxy:
host: proxy.host.ru
username: 'username'
port: 9091
password: 'password'
non-proxy-hosts-pattern: '(localhost|127.0.0.1|.*\.internal\.com)'