
Сервис, который сканирует вашу инфраструктуру как код на предмет распространенных уязвимостей.
| Аспект | Информация |
|---|
| Название инструмента | IaC Scan Runner |
| Docker-образ | xscanner/runner |
| Пакет PyPI | iac-scan-runner |
| Документация | docs |
| Связь с нами | [email protected] |
IaC Scan Runner — это REST API сервис, предназначенный для сканирования пакетов IaC (Infrastructure as Code) и выполнения различных проверок кода с целью поиска возможных уязвимостей и улучшений. Подробнее в документации.
В этом разделе объясняется, как запустить REST API.
Вы можете запустить REST API, используя публичный Docker-образ xscanner/runner:
# run IaC Scan Runner REST API in a Docker container and
# navigate to localhost:8080/swagger or localhost:8080/redoc
$ docker run --name iac-scan-runner -p 8080:80 xscanner/runner
Или вы можете собрать образ локально и запустить его следующим образом:
# build Docker container (it will take some time)
$ docker build -t iac-scan-runner .
# run IaC Scan Runner REST API in a Docker container and
# navigate to localhost:8080/swagger or localhost:8080/redoc
$ docker run --name iac-scan-runner -p 8080:80 iac-scan-runner
Для запуска через CLI IaC Scan Runner:
# install the CLI
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install iac-scan-runner
# print OpenAPI specification
(.venv) $ iac-scan-runner openapi
# install prerequisites
(.venv) $ iac-scan-runner install
# run IaC Scan Runner REST API
(.venv) $ iac-scan-runner run
Для локального запуска из исходного кода:
# Export env variables
export MONGODB_CONNECTION_STRING=mongodb://localhost:27017
export SCAN_PERSISTENCE=enabled
export USER_MANAGEMENT=enabled
# Setup MongoDB
$ docker run --name mongodb -p 27017:27017 mongo
# install prerequisites
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install -r requirements.txt
(.venv) $ ./install-checks.sh
# run IaC Scan Runner REST API (add --reload flag to apply code changes on the way)
(.venv) $ uvicorn src.iac_scan_runner.api:app
В этой части будет показано одно из возможных развёртываний и краткие примеры использования API-вызовов.
Сначала клонируем репозиторий iac scan runner и запускаем API.
$ git clone https://github.com/xlab-si/iac-scan-runner.git
$ docker compose up
После этого вы можете использовать различные конечные точки API, обращаясь к localhost:8000. Также можно перейти по адресу localhost:8000/swagger или localhost:8000/redoc и протестировать все конечные точки API там. В этом примере мы будем использовать curl для вызова конечных точек API.
curl -X 'POST' \
'http://0.0.0.0/project?creator_id=test' \
-H 'accept: application/json' \
-d ''
нам будет возвращён идентификатор проекта. Для этого примера идентификатор проекта — 1e7b2a91-2896-40fd-8d53-83db56088026.
curl -X 'PUT' \
'http://0.0.0.0:8000/projects/1e7b2a91-2896-40fd-8d53-83db56088026/checks/ansible-lint/disable' \
-H 'accept: application/json'
curl -X 'POST' \
'http://0.0.0.0:8000/projects/1e7b2a91-2896-40fd-8d53-83db56088026/scan?scan_response_type=json' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F '[email protected];type=application/zip'
Вот и всё.
В определённый момент может потребоваться включить новые инструменты проверки в рабочий процесс сканирования, чтобы обеспечить более широкий охват стандартов IaC и типов проектов. Поэтому в данном подразделе описана последовательность необходимых шагов для этой цели. Однако шаги необходимо выполнять вручную, как будет описано, но в будущем планируется автоматизировать эту процедуру через API и предоставить удобный интерфейс, который поможет пользователю при импорте новых инструментов, становящихся частью доступного каталога, составляющего рабочий процесс сканирования. На рисунке 16 изображены необходимые шаги, которые нужно предпринять для расширения рабочего процесса сканирования новым инструментом.
Шаг 1 – Добавление класса, специфичного для инструмента, в каталог checks
Сначала необходимо добавить новый класс Python, специфичный для инструмента, в каталог checks внутри исходного кода IaC Scan Runner:
iac-scan-runner/src/iac_scan_runner/checks/new_tool.py
Класс нового инструмента наследует существующий класс Check, который обеспечивает обобщение инструментов рабочего процесса сканирования. Кроме того, необходимо предоставить реализацию следующих методов:
Шаг 2 – Добавление экземпляра класса инструмента проверки в конструкторе ScanRunner После того как новый класс, производный от Check, добавлен в исходный код IaC Scan Runner, необходимо также изменить исходный код его главного класса, называемого ScanRunner. Что касается изменений этого класса, сначала требуется импортировать класс, специфичный для инструмента, создать новый экземпляр класса инструмента проверки и добавить его в словарь проверок IaC внутри def init_checks(self). A. Импорт класса инструмента проверки from iac_scan_runner.checks.tfsec import TfsecCheck B. Создание нового экземпляра объекта инструмента проверки внутри init_checks """Initiate predefined check objects""" new_tool = NewToolCheck() C. Добавление его в словарь self.iac_checks внутри init_checks
self.iac_checks = {
new_tool.name: new_tool,
…
}
Шаг 3 – Добавление инструмента проверки в матрицу совместимости внутри класса Compatibility С другой стороны, внутри файла src/iac_scan_runner/compatibility.py также необходимо расширить словарь, представляющий матрицу совместимости. Возможны два случая: а) новый тип файла должен быть добавлен как ключ вместе со списком соответствующих инструментов в качестве значения; б) новый инструмент должен быть добавлен в список совместимости для существующего типа файла.
compatibility_matrix = {
"new_type": ["new_tool_1", "new_tool_2"],
…
"old_typeK": ["tool_1", … "tool_N", "new_tool_3"]
}
Шаг 4 – Обеспечение поддержки сводки результатов Наконец, последний шаг в последовательности необходимых изменений для расширения рабочего процесса сканирования — это модификация класса ResultsSummary (src/iac_scan_runner/results_summary.py). А именно, требуется добавить фрагмент кода в его метод summarize_outcome, который будет искать определённые строки, специфичные для инструмента и используемые для идентификации, прошла проверка или нет. Внутри цикла, проходящего по совместимым проверкам, для каждого нового инструмента следует включить следующую структуру if-else:
if check == "new_tool":
if outcome.find("Check pass string") > -1:
self.outcomes[check]["status"] = "Passed"
return "Passed"
else:
self.outcomes[check]["status"] = "Problems"
return "Problems"
Эта работа лицензирована в соответствии с Apache License 2.0.
Вы можете связаться с командой xOpera, отправив письмо на [email protected].
Этот проект получил финансирование от исследовательской и инновационной программы Европейского Союза Horizon 2020 в рамках Соглашения о гранте № 101000162 (PIACERE).