Como Validar Infraestrutura no Azure com Checkov e Terraform (Passo a Passo 2025)
Este tutorial demonstra como utilizar o Checkov para validar configurações inseguras em uma infraestrutura criada com Terraform no Azure.
Requisitos
- Conta no Azure
- Terraform instalado
- Python instalado (se for instalar o Checkov via pip)
- Checkov instalado:
Via pip:
pip install checkov
Via Docker:
docker run -t -v $(pwd):/tf bridgecrew/checkov -d /tf
Estrutura do Lab
Vamos provisionar:
- 1 Resource Group
- 1 Virtual Network + Subnet
- 1 NSG com a porta 22 aberta (SSH)
- 1 Network Interface
- 1 Linux Virtual Machine com senha habilitada (sem SSH key)
Código Terraform (main.tf)
Crie um arquivo chamado main.tf
com o seguinte conteúdo:
provider "azurerm" {
features {}
}
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = ">= 3.0.0"
}
}
}
resource "azurerm_resource_group" "rg" {
name = "rg-checkov-vm"
location = "eastus"
}
resource "azurerm_virtual_network" "vnet" {
name = "vnet-checkov"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
resource "azurerm_subnet" "subnet" {
name = "subnet-checkov"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = ["10.0.1.0/24"]
}
resource "azurerm_network_security_group" "nsg" {
name = "nsg-checkov"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "AllowSSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
resource "azurerm_network_interface" "nic" {
name = "nic-checkov"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.subnet.id
private_ip_address_allocation = "Dynamic"
}
}
resource "azurerm_linux_virtual_machine" "vm" {
name = "vm-checkov"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
size = "Standard_B1s"
admin_username = "azureuser"
network_interface_ids = [
azurerm_network_interface.nic.id,
]
admin_password = "P@ssword1234!" # <- má prática proposital
disable_password_authentication = false
os_disk {
name = "disk-checkov"
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "18.04-LTS"
version = "latest"
}
}
Executando o Terraform
terraform init
terraform apply -auto-approve
Validando com o Checkov
Rode o Checkov no diretório com seu main.tf
:
checkov -d .
O Checkov irá identificar várias falhas, como:
- SSH liberado para qualquer IP
- Uso de senha na VM
- Falta de NSG associada à subnet
- Ausência de autenticação por chave
Criando o .checkov.yaml para ignorar regras
Para ignorar algumas falhas intencionais do lab, crie um arquivo chamado .checkov.yaml
com o seguinte conteúdo:
skip_checks:
- CKV_AZURE_1
- CKV_AZURE_10
- CKV_AZURE_50
- CKV_AZURE_149
- CKV_AZURE_178
- CKV2_AZURE_31
Rode novamente:
checkov -d .
Limpeza do ambiente (opcional)
terraform destroy -auto-approve