Приложение 15. Спецификация Webhook
Авторизация
Bearer token
Если администратор выбрал аутентификацию по Bearer token и указал токен в поле Secret, то AppSec.Hub при отправке webhook добавляет к запросу HTTP заголовок вида:
Authorization: Bearer <Secret>
где <Secret>
- это значение токена, введенного администратором в поле Secret.
Более подробную информацию об использовании Bearer token можно найти здесь.
Basic authentication
Если администратор выбрал базовую аутентификацию (Basic authentication), то AppSec.Hub при отправке webhook добавляет к запросу HTTP заголовок вида:
Authorization: Basic <credentials>
где <credentials>
- это строка, полученная преобразованием пары логин/пароль в кодировку Base64: Base64(login:password)
.
Более подробную информацию об использовании базовой аутентификации можно найти здесь.
Атрибуты webhook
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
status |
+ | Статус выполненного запуска security pipeline | enum {"SUCCESS", "FAILED"} |
details |
+ | Пояснение к статусу, например, причина статуса “Failed” | string |
id |
+ | ID запуска security pipeline на сканирование | long |
type |
+ | Тип security pipeline, который был запущен на сканирование | enum {"CODEBASE", "ARTIFACT", "INSTANCE"} |
createTs |
+ | Дата и время запуска security pipeline | long |
duration |
+ | Длительность выполнения security pipeline в миллисекундах | integer |
application |
+ | Параметры приложения | object |
source |
+ | Параметры объекта сканирования | object |
qualityGates |
+ | Результат проверки Quality Gate по каждой практике | list {object} |
tagging |
— | Статус применения тегов. Если пропущен (или null ) - это означает, что тегирование не было установлено для данного security pipeline |
object |
summary |
+ | Статистика найденных уязвимостей | object |
report |
+ | Ссылки на отчеты с результатами скана | object |
Атрибуты приложения
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
id |
+ | Внутренний ID приложения | string |
name |
+ | Имя приложения | string |
code |
+ | Код приложения для внешней интеграции (Public ID) | string |
externalId |
— | ID приложения во внешнем реестре приложений | string |
Атрибуты объекта сканирования
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
codebase |
—* | Параметры кодовой базы | object |
artifact |
—* | Параметры артефакта | object |
instance |
—* | Параметры инстанса | object |
* Хотя бы один из объектов обязательно должен присутствовать.
Атрибуты кодовой базы
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
name |
+ | Наименование кодовой базы (в интерфейсе AppSec.Hub) | string |
url |
+ | URL кодовой базы (Checkout (fetch) URL) | string |
branch |
+ | Ветка, которая сканировалась в данном запуске security pipeline | string |
buildTool |
+ | Инструмент сборки | string |
commit |
— | Hash commit среза ветки, который сканировался в данном запуске | string |
Атрибуты артефакта
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
name |
+ | Наименование артефакта (в интерфейсе AppSec.Hub) | string |
type |
+ | Тип (формат) артефакта | enum {"MAVEN", "DOCKER", "RAW", "FILE", "NPM", "YUM"} |
properties |
+ | Атрибуты артефакта, которые напрямую связаны с его типом | object |
checksum |
+ | Набор контрольных сумм артефакта | object |
url |
+ | URL доступа к артефакту в репозитории | string |
Properties артефакта
Maven
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
repository |
+ | Наименование репозитория (Nexus RM) | string |
name |
+ | Наименование артефакта/компоненты в репозитории (Nexus RM) | string |
group |
+ | Наименование группы в репозитории (Nexus RM) | string |
extension |
+ | Расширение артефакта | string |
classifier |
— | Классификатор артефакта | string |
version |
+ | Версия артефакта | string |
Docker
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
repository |
+ | Наименование репозитория (Nexus RM) | string |
name |
+ | Наименование образа в репозитории (Nexus RM) | string |
baseUrl |
+ | Hostname репозитория | string |
port |
+ | Порт доступа к репозиторию/образу | string |
version |
+ | Версия (тег) образа | string |
RAW
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
repository |
+ | Наименование репозитория (Nexus RM) | string |
name |
+ | Наименование артефакта/компоненты в репозитории (Nexus RM) | string |
relativeUrl |
+ | Относительный URL с указанием версии артефакта и номера сборки | string |
extension |
+ | Расширение артефакта | string |
version |
— | Версия артефакта | string |
build |
— | Номер сборки | string |
File
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
relativeUrl |
+ | Относительный URL с указанием версии артефакта и номера сборки | string |
version |
— | Версия артефакта | string |
build |
— | Номер сборки | string |
NPM
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
repository |
+ | Наименование репозитория (Nexus RM) | string |
name |
+ | Наименование пакета NPM в репозитории (Nexus RM) | string |
version |
+ | Версия пакета | string |
YUM
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
repository |
+ | Наименование репозитория (Nexus RM) | string |
name |
+ | Наименование артефакта в репозитории (Nexus RM) | string |
relativeUrl |
+ | Относительный URL с указанием версии артефакта и номера сборки | string |
extension |
+ | Расширение артефакта | string |
version |
— | Версия артефакта | string |
build |
— | Номер сборки | string |
PyPi
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
repository |
+ | Наименование репозитория (Nexus RM) | string |
name |
+ | Наименование артефакта в репозитории (Nexus RM) | string |
version |
— | Версия артефакта | string |
Атрибуты контрольной суммы
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
md5 |
—* | Контрольная сумма по формату MD5 | string |
sha1 |
—* | Контрольная сумма по формату SHA1 | string |
sha256 |
—* | Контрольная сумма по формату SHA256 | string |
sha512 |
—* | Контрольная сумма по формату SHA512 | string |
* Хотя бы один из атрибутов обязательно должен присутствовать.
Атрибуты инстанса
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
name |
+ | Наименование стенда с развернутым приложением | string |
url |
+ | URL развернутого приложения | string |
stage |
+ | Стадия разработки, на которой используется стенд для тестирования | enum {"DEV", "FT", "IT", "UAT", "PROD"} |
Атрибуты Quality Gate
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
practice |
+ | ID применявшейся практики | enum {"SAST", "SCA", "DAST"} |
status |
+ | Результат проверки QG. Если указано: – N/A - QG либо не был указан в security pipeline, либо проверки данной практикой не выполнялись |
enum {"PASSED", "FAILED", "N/A"} |
violations |
- | Список нарушений, которые стали причиной status: FAILED |
list {string} |
Атрибуты тегирования
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
status |
+ | Статус установки тега на артефакт: – APPLIED - теги установлены;– FAILED - тегирование завершилось с ошибкой |
enum {"APPLIED", "FAILED"} |
artifact |
+ | Параметры артефакта | object |
tags |
+ | Список установленных (или назначенных на установку) тегов | list {string} |
Статистика найденных уязвимостей
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
new |
+ | Статистика по категории "новые уязвимости" (были детектированы только в текущем скане) | object |
repeated |
+ | Статистика по категории "повторные уязвимости" | object |
fixed |
+ | Статистика по категории "исправленные уязвимости" | object |
total |
+ | Статистика по категории "все открытые уязвимости" | object |
Статистика по категории найденных уязвимостей
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
critical |
+ | Количество уязвимостей с уровнем серьезности Critical | integer |
high |
+ | Количество уязвимостей с уровнем серьезности High | integer |
medium |
+ | Количество уязвимостей с уровнем серьезности Medium | integer |
low |
+ | Количество уязвимостей с уровнем серьезности Low | integer |
Атрибуты отчета
Атрибут | Обязат. атрибут |
Описание | Тип |
---|---|---|---|
raw |
+ | Ссылка на список уязвимостей, найденных в данном сканировании | string |
pdf |
— | Ссылка на отчёт в формате PDF | string |
excel |
— | Ссылка на отчёт в формате Excel | string |
Примеры
Успешное сканирование кодовой базы
{
"status": "SUCCESS",
"details": "QG is passed. Scan is finished.",
"id": 960,
"type": "CODEBASE",
"createTs": 1596601348251,
"duration": 52643,
"application": {
"id": 48,
"name": "DVJA",
"code": "DVJA",
"externalId": ""
},
"source": {
"codebase": {
"name": "dvja-master",
"url": "https://github.com/appsecco/dvja.git",
"branch": "master",
"buildTool": "maven",
"commit": "709d658dc5b6d6afcd46049c2f332ee3f515a67d"
}
},
"qualityGates": [{
"practice": "SAST",
"status": "PASSED",
"violations": null
}, {
"practice": "SCA",
"status": "N/A",
"violations": null
}, {
"practice": "DAST",
"status": "N/A",
"violations": null
}],
"tagging": {
"status": "APPLIED",
"artifact": {
"name": "dvja-war",
"type": "MAVEN",
"properties": {
"repository": "maven-releases",
"name": "dvja",
"group": "com.appsecco",
"extension": "war",
"version": "1.0"
},
"checksum": {
"sha512": "dedaa748ae1b0ee3d843dda8bed2ec7acc51ad42506a9fde387b4a9b638196cafcd0da37183beb5d1a947b263aaf7328dfbbe32a86c3a8b53a564fd27ec33b55",
"sha256": "5a78b5b999cb6b63f050266b10dc088cf7117eab504049a6d8d02ad857d160c0",
"sha1": "0bc46ca00ebb64f6da77bf6622fcd204451fedd6",
"md5": "efa317f19c70cbcd60aded38de811bb0"
},
"url": "https://nexus.your.company.com/repository/maven-releases/com/appsecco/dvja/1.0/dvja-1.0.war"
},
"tags": ["QG_SAST_FAIL"]
},
"summary": {
"new": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
},
"repeated": {
"critical": 0,
"high": 2,
"medium": 5,
"low": 89
},
"total": {
"critical": 0,
"high": 2,
"medium": 5,
"low": 89
},
"fixed": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
}
},
"report": {
"raw": "https://hub.your.company.com/#/appprofile/48/issues?scanId=960"
}
}
Неудачное сканирование кодовой базы
{
"status": "FAILED",
"details": "QG is not passed. Scan is finished. One ore more QG checks are not passed",
"id": 960,
"type": "CODEBASE",
"createTs": 1596601348251,
"duration": 52643,
"application": {
"id": 48,
"name": "DVJA",
"code": "DVJA",
"externalId": ""
},
"source": {
"codebase": {
"name": "dvja-master",
"url": "https://github.com/appsecco/dvja.git",
"branch": "master",
"buildTool": "maven",
"commit": "709d658dc5b6d6afcd46049c2f332ee3f515a67d"
}
},
"qualityGates": [{
"practice": "SAST",
"status": "FAILED",
"violations": ["Number of ALL SAST issues with HIGH severity (2) exceeds the limit (0)"]
}, {
"practice": "SCA",
"status": "N/A",
"violations": null
}, {
"practice": "DAST",
"status": "N/A",
"violations": null
}],
"tagging": {
"status": "APPLIED",
"artifact": {
"name": "dvja-war",
"type": "MAVEN",
"properties": {
"mavenArtifactType": "war",
"repositoryName": "maven-releases",
"mavenArtifact": "dvja",
"group": "com.appsecco",
"version": "1.0"
},
"checksum": {
"sha512": "dedaa748ae1b0ee3d843dda8bed2ec7acc51ad42506a9fde387b4a9b638196cafcd0da37183beb5d1a947b263aaf7328dfbbe32a86c3a8b53a564fd27ec33b55",
"sha256": "5a78b5b999cb6b63f050266b10dc088cf7117eab504049a6d8d02ad857d160c0",
"sha1": "0bc46ca00ebb64f6da77bf6622fcd204451fedd6",
"md5": "efa317f19c70cbcd60aded38de811bb0"
},
"url": "https://nexus.your.company.com/repository/maven-releases/com/appsecco/dvja/1.0/dvja-1.0.war"
},
"tags": ["QG_SAST_FAIL"]
},
"summary": {
"new": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
},
"repeated": {
"critical": 0,
"high": 2,
"medium": 5,
"low": 89
},
"total": {
"critical": 0,
"high": 2,
"medium": 5,
"low": 89
},
"fixed": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
}
},
"report": {
"raw": "https://hub.your.company.com/#/appprofile/48/issues?scanId=960"
}
}
Неудачное сканирование образа docker
{
"status": "FAILED",
"details": "QG is not passed. Scan is finished. One ore more QG checks are not passed",
"id": 958,
"type": "ARTIFACT",
"createTs": 1596601348251,
"duration": 52643,
"application": {
"id": 48,
"name": "DVJA",
"code": "DVJA",
"externalId": ""
},
"source": {
"artifact": {
"name": "java-web-project.docker",
"type": "DOCKER",
"properties": {
"baseUrl": "nexus.your.company.com",
"port": "443",
"repository": "docker-private",
"name": "java-web-project",
"version": "1.17"
},
"checksum": {
"sha512": "dedaa748ae1b0ee3d843dda8bed2ec7acc51ad42506a9fde387b4a9b638196cafcd0da37183beb5d1a947b263aaf7328dfbbe32a86c3a8b53a564fd27ec33b55",
"sha256": "5a78b5b999cb6b63f050266b10dc088cf7117eab504049a6d8d02ad857d160c0",
"sha1": "0bc46ca00ebb64f6da77bf6622fcd204451fedd6",
"md5": "efa317f19c70cbcd60aded38de811bb0"
},
"url": "https://nexus.your.company.com/repository/docker-private/v2/java-web-project/manifests/1.17"
}
},
"qualityGates": [{
"practice": "SAST",
"status": "N/A",
"violations": null
}, {
"practice": "SCA",
"status": "FAILED",
"violations": ["Number of ALL SCA Security issues with HIGH severity (15) exceeds the limit (0)", "Number of ALL SCA Security issues with CRITICAL severity (29) exceeds the limit (0)"]
}, {
"practice": "DAST",
"status": "N/A",
"violations": null
}
],
"tagging": {
"status": "APPLIED",
"artifact": {
"name": "java-web-project.docker",
"type": "DOCKER",
"properties": {
"baseUrl": "nexus.your.company.com",
"port": "443",
"repository": "docker-private",
"name": "java-web-project",
"version": "1.17"
},
"checksum": {
"sha512": "dedaa748ae1b0ee3d843dda8bed2ec7acc51ad42506a9fde387b4a9b638196cafcd0da37183beb5d1a947b263aaf7328dfbbe32a86c3a8b53a564fd27ec33b55",
"sha256": "5a78b5b999cb6b63f050266b10dc088cf7117eab504049a6d8d02ad857d160c0",
"sha1": "0bc46ca00ebb64f6da77bf6622fcd204451fedd6",
"md5": "efa317f19c70cbcd60aded38de811bb0"
},
"url": "https://nexus.your.company.com/repository/docker-private/v2/java-web-project/manifests/1.17"
},
"tags": ["QG_SCA_FAIL"]
},
"summary": {
"new": {
"critical": 29,
"high": 15,
"medium": 6,
"low": 86
},
"repeated": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
},
"fixed": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
},
"total": {
"critical": 29,
"high": 15,
"medium": 6,
"low": 86
}
},
"report": {
"raw": "https://hub.your.company.com/#/appprofile/48/issues?scanId=958"
}
}
Неудачное сканирование артефакта maven
{
"status": "FAILED",
"details": "QG is not passed. Scan is finished. One ore more QG checks are not passed",
"id": 958,
"type": "ARTIFACT",
"createTs": 1596601348251,
"duration": 52643,
"application": {
"id": 48,
"name": "DVJA",
"code": "DVJA",
"externalId": ""
},
"source": {
"artifact": {
"name": "dvja-war",
"type": "MAVEN",
"properties": {
"repository": "maven-releases",
"name": "dvja",
"group": "com.appsecco",
"extension": "war",
"version": "1.0"
},
"checksum": {
"sha512": "dedaa748ae1b0ee3d843dda8bed2ec7acc51ad42506a9fde387b4a9b638196cafcd0da37183beb5d1a947b263aaf7328dfbbe32a86c3a8b53a564fd27ec33b55",
"sha256": "5a78b5b999cb6b63f050266b10dc088cf7117eab504049a6d8d02ad857d160c0",
"sha1": "0bc46ca00ebb64f6da77bf6622fcd204451fedd6",
"md5": "efa317f19c70cbcd60aded38de811bb0"
},
"url": "https://nexus.your.company.com/repository/maven-releases/com/appsecco/dvja/1.0/dvja-1.0.war"
}
},
"qualityGates": [{
"practice": "SAST",
"status": "N/A",
"violations": null
}, {
"practice": "SCA",
"status": "FAILED",
"violations": ["Number of ALL SCA Security issues with HIGH severity (15) exceeds the limit (0)", "Number of ALL SCA Security issues with CRITICAL severity (29) exceeds the limit (0)"]
}, {
"practice": "DAST",
"status": "N/A",
"violations": null
}
],
"tagging": {
"status": "APPLIED",
"artifact": {
"name": "dvja-war",
"type": "MAVEN",
"properties": {
"repository": "maven-releases",
"name": "dvja",
"group": "com.appsecco",
"extension": "war",
"version": "1.0"
},
"checksum": {
"sha512": "dedaa748ae1b0ee3d843dda8bed2ec7acc51ad42506a9fde387b4a9b638196cafcd0da37183beb5d1a947b263aaf7328dfbbe32a86c3a8b53a564fd27ec33b55",
"sha256": "5a78b5b999cb6b63f050266b10dc088cf7117eab504049a6d8d02ad857d160c0",
"sha1": "0bc46ca00ebb64f6da77bf6622fcd204451fedd6",
"md5": "efa317f19c70cbcd60aded38de811bb0"
},
"url": "https://nexus.your.company.com/repository/maven-releases/com/appsecco/dvja/1.0/dvja-1.0.war"
},
"tags": ["QG_SCA_FAIL"]
},
"summary": {
"new": {
"critical": 29,
"high": 15,
"medium": 6,
"low": 86
},
"repeated": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
},
"fixed": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
},
"total": {
"critical": 29,
"high": 15,
"medium": 6,
"low": 86
}
},
"report": {
"raw": "https://hub.your.company.com/#/appprofile/48/issues?scanId=958"
}
}