
Serviço que verifica sua Infraestrutura como Código em busca de vulnerabilidades comuns.
| Aspecto | Informação |
|---|
| Nome da ferramenta | IaC Scan Runner |
| Imagem Docker | xscanner/runner |
| Pacote PyPI | iac-scan-runner |
| Documentação | docs |
| Fale conosco | [email protected] |
O IaC Scan Runner é um serviço de API REST usado para analisar pacotes de IaC (Infraestrutura como Código) e realizar várias verificações de código para encontrar possíveis vulnerabilidades e melhorias. Explore a documentação para mais informações.
Esta seção explica como executar a API REST.
Você pode executar a API REST usando a imagem pública Docker xscanner/runner da seguinte forma:
# execute a API REST do IaC Scan Runner em um container Docker e
# navegue para localhost:8080/swagger ou localhost:8080/redoc
$ docker run --name iac-scan-runner -p 8080:80 xscanner/runner
Ou você pode construir a imagem localmente e executá-la da seguinte forma:
# construa o container Docker (isso levará algum tempo)
$ docker build -t iac-scan-runner .
# execute a API REST do IaC Scan Runner em um container Docker e
# navegue para localhost:8080/swagger ou localhost:8080/redoc
$ docker run --name iac-scan-runner -p 8080:80 iac-scan-runner
Para executar usando a CLI do IaC Scan Runner:
# instale a CLI
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install iac-scan-runner
# imprima a especificação OpenAPI
(.venv) $ iac-scan-runner openapi
# instale os pré-requisitos
(.venv) $ iac-scan-runner install
# execute a API REST do IaC Scan Runner
(.venv) $ iac-scan-runner run
Para executar localmente a partir do código fonte:
# Exporte as variáveis de ambiente
export MONGODB_CONNECTION_STRING=mongodb://localhost:27017
export SCAN_PERSISTENCE=enabled
export USER_MANAGEMENT=enabled
# Configure o MongoDB
$ docker run --name mongodb -p 27017:27017 mongo
# instale os pré-requisitos
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install -r requirements.txt
(.venv) $ ./install-checks.sh
# execute a API REST do IaC Scan Runner (adicione a flag --reload para aplicar alterações de código em tempo real)
(.venv) $ uvicorn src.iac_scan_runner.api:app
Esta parte mostrará uma das possíveis implantações e pequenos exemplos de como usar as chamadas da API.
Primeiramente, clonaremos o repositório do iac scan runner e executaremos a API.
$ git clone https://github.com/xlab-si/iac-scan-runner.git
$ docker compose up
Depois disso, você pode usar diferentes endpoints da API chamando localhost:8000. Você também pode navegar para localhost:8000/swagger ou localhost:8000/redoc e testar todos os endpoints da API lá. Neste exemplo, usaremos curl para chamar os endpoints da API.
curl -X 'POST' \
'http://0.0.0.0/project?creator_id=test' \
-H 'accept: application/json' \
-d ''
O id do projeto será retornado para nós. Para este exemplo, o id do projeto é 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'
É isso.
Em determinado momento, pode ser necessário incluir novas ferramentas de verificação no fluxo de trabalho de verificação, com o objetivo de fornecer uma cobertura mais ampla dos padrões de IaC e tipos de projeto. Portanto, nesta subseção, uma sequência de etapas necessárias para esse fim é identificada e descrita. No entanto, as etapas precisam ser realizadas manualmente, conforme descrito, mas está planejado automatizar esse procedimento no futuro via API e fornecer uma interface amigável que auxilie o usuário ao importar novas ferramentas que se tornarão parte do catálogo disponível que compõe o fluxo de trabalho de verificação. A Figura 16 ilustra as etapas necessárias a serem seguidas para estender o fluxo de trabalho de verificação com uma nova ferramenta.
Etapa 1 – Adicionar a classe específica da ferramenta ao diretório checks
Primeiro, é necessário adicionar uma nova classe Python específica da ferramenta ao diretório checks dentro do código fonte do IaC Scan Runner:
iac-scan-runner/src/iac_scan_runner/checks/new_tool.py
A classe de uma nova ferramenta herda a classe Check existente, que fornece a generalização das ferramentas do fluxo de trabalho de verificação. Além disso, é necessário fornecer implementação dos seguintes métodos:
Etapa 2 – Adicionar a instância da classe da ferramenta de verificação dentro do construtor ScanRunner
Uma vez que a nova classe derivada de Check é adicionada ao código fonte do IaC Scan Runner, também é necessário modificar o código fonte de sua classe principal, chamada ScanRunner. Quanto às modificações desta classe, é necessário primeiro importar a classe específica da ferramenta, criar uma nova instância da classe da ferramenta de verificação e adicioná-la ao dicionário de verificações de IaC dentro de def init_checks(self).
A. Importando a classe da ferramenta de verificação
from iac_scan_runner.checks.tfsec import TfsecCheck
B. Criando nova instância do objeto da ferramenta de verificação dentro de init_checks
"""Iniciar objetos de verificação predefinidos"""
new_tool = NewToolCheck()
C. Adicionando-a ao dicionário self.iac_checks dentro de init_checks
self.iac_checks = {
new_tool.name: new_tool,
…
}
Etapa 3 – Adicionar a ferramenta de verificação à matriz de compatibilidade dentro da classe Compatibility
Por outro lado, dentro do arquivo src/iac_scan_runner/compatibility.py, o dicionário que representa a matriz de compatibilidade também deve ser estendido. Existem dois casos possíveis: a) um novo tipo de arquivo deve ser adicionado como chave, juntamente com a lista de ferramentas relevantes como valor b) uma nova ferramenta deve ser adicionada à lista de compatibilidade para o tipo de arquivo existente.
compatibility_matrix = {
"new_type": ["new_tool_1", "new_tool_2"],
…
"old_typeK": ["tool_1", … "tool_N", "new_tool_3"]
}
Etapa 4 – Fornecer suporte para sumarização de resultados
Finalmente, a última etapa na sequência de modificações necessárias para a extensão do fluxo de trabalho de verificação é modificar a classe ResultsSummary (src/iac_scan_runner/results_summary.py). Precisamente, é necessário anexar uma parte do código ao seu método summarize_outcome que procurará por strings específicas que são específicas da ferramenta e podem ser usadas para identificar se a verificação passou ou falhou. Dentro do loop que percorre as verificações compatíveis, para cada nova ferramenta, a seguinte estrutura de if-else deve ser incluída:
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"
Este trabalho é licenciado sob a Apache License 2.0.
Você pode entrar em contato com a equipe xOpera enviando um e-mail para [email protected].
Este projeto recebeu financiamento do programa de investigação e inovação Horizon 2020 da União Europeia, sob o Acordo de Subvenção n.º 101000162 (PIACERE).