Работа с консольным агентом
Консольный агент системы CodeScoring называется johnny и на данный момент предоставляется для скачивания совместно с on-premise версией системы.
Агент — это исполняемый бинарный файл. Готовые регулярные сборки есть для linux-совместимых систем. По запросу доступны сборки под Windows и MacOS.
Принцип работы
При работе в режиме сканирования директорий с исходным кодом, агент рекурсивно обходит
директорию указанную в параметрах запуска и осуществляет поиск и разбор манифестов известных пакетных менеджеров.
В режиме сканирования образов агент исследует файловую систему указанного образа, производя инвентаризацию компонентного состава.
По окончанию работы формируется sbom файл и в консоль выводится информация о найденных уязвимостях.
Возможности агента
Доступные и необходимые опции запуска агента можно посмотреть непосредственно при его вызове.
./johnny
Usage:
johnny [OPTIONS] [path-or-image-name]
johnny - CLI tool for dependency analysis for vulnerabilities and
license compliance issues. Works in connection with CodeScoring SCA.
CodeScoring website: https://codescoring.ru
Documentation: https://docs.codescoring.ru
Exit codes:
- 0: successful run, no issues
- 1: some issues found, action required
- 2: run failure
Version: 2023.5.0
Application Options:
--api_token= API token for integration with CodeScoring
server
--api_url= CodeScoring server url (e.g.
https://codescoring.mycompany.com)
--project= Project name in CodeScoring
--ignore= Ignore paths (--ignore first --ignore
"/**/onem?re")
--debug Output detailed log
--with-hashes Search for direct inclusion of dependencies
using file hashes
--only-hashes Search only for direct inclusion of
dependencies using file hashes
--no-summary Do not print summary
--export-vulns-to-csv= Path to csv file for local summary result
--stage= Policy stage (build, dev, source, stage,
test, prod, proxy) (default: build)
--version Show Version
--gdt-match= section in gradle dependency tree for scan
(default: compileClasspath)
--scan-archives Scan archives. Supported types: '.jar',
'.rar', '.tar', '.tar.bz2', '.tbz2',
'.tar.gz', '.tgz', '.tar.xz', '.txz',
'.war', '.zip', '.aar', '.egg', '.hpi',
'.nupkg', '.whl'
--image Scan image (use argument
[path-or-image-name] as image name or path
to tar)
Help Options:
-h, --help Show this help message
Arguments:
path-or-image-name: Scan path or image name
В параметре --api_url
должен быть указан полный адрес on-premise инсталляции. Значение для --api_token
можно взять в профиле пользователя инсталляции.
Указание параметра --project
позволит при сканировании применить политики относящиеся к выбранному проекту.
При запуске агент:
- Рекурсивно проходит по всему содержимому указанной директории (если указан конкретный манифест, обрабатывает только его)
- Идентифицирует файлы манифестов и разбирает их
- Хеширует каждый файл (при запуске с
--with-hashes
)
- Формирует запрос к инсталляции
- После получения результата показывает суммарную информацию по найденным манифестам, зависимостям, уязвимостям, сработавшим политикам и более подробную информацию по каждой уязвимости и сработавшей политике
- Дополнительно в текущей директории формируется файл
bom.json
, содержащий полный Software Bill of Materials в формате CycloneDX Json.
В зависимости от результата работы и параметров запуска агент возвращает соответствующий exit code.
Пример запуска на директорию:
./johnny --api_token <api_token> --api_url <api_url> --ignore .tmp --ignore fixtures --ignore .git .
Сканирование образов
Агент поддерживает функциональность сканирования образов в стандартах OCI и Docker и может быть запущен одним из перечисленных способов с указанием:
-
пути до tar-архива созданного с использованием docker save:
-
названия образа находящегося в демоне Docker, Podman:
-
названия образа из публичного Docker HUB:
-
названия образа из приватного registry:
Перед работой с приватным репозиторием нужно выполнить команду
docker login
Запуск с помощью Docker
Для работы запуска через Docker в данный момент нужна активная авторизация в registry с образами нашей системы.
Пример вызова на текущей директории
docker run -v \
$(pwd):/code \
<registry-address>/johnny-depp \
--api_token <api_token> \
--api_url <api_url> \
--ignore .tmp --ignore fixtures --ignore .git \
.
Добавление в Gitlab CI
Пример для добавления в .gitlab-ci.yaml
stages:
- test
sca:
stage: test
script:
- docker pull <registry-address>/johnny-depp:latest
- >
docker run -v $(pwd):/code
<registry-address>/johnny-depp
--api_token $JOHNNY_API_TOKEN
--api_url $JOHNNY_API_URL
--ignore .git
--ignore fixtures
--ignore parsers
.
artifacts:
paths:
- bom.json
when: always
expire_in: 1 week
Добавление в Jenkins pipeline
Пример для добавления в pipeline
pipeline {
agent any
environment {
CODESCORING_REGISTRY_URL='registry-one.codescoring.ru'
CODESCORING_AGENT_IMAGE='registry-one.codescoring.ru/johnny-depp:2022.47.0'
CODESCORING_REGISTRY_CREDENTIALS=credentials('cs-registry-creds')
CODESCORING_API_URL='https://localhost:8080'
}
stages {
stage("Login to Codescoring docker registry") {
steps {
sh """
docker login -u "$CODESCORING_REGISTRY_CREDENTIALS_USR" "$CODESCORING_REGISTRY_URL" -p "$CODESCORING_REGISTRY_CREDENTIALS_PSW"
"""
}
}
stage('Run CodeScoring Agent') {
steps {
sh """
docker run -v \$(pwd):/code --rm ${CODESCORING_AGENT_IMAGE} --api_token ${CODESCORING_API_TOKEN} --api_url ${CODESCORING_API_URL} --ignore .tmp --ignore fixtures --ignore .git .
"""
}
}
}
}