Criando VPC com Terraform e monitorando com Flowlog e CloudWatch
Resumo
Este artigo descreve o funcionamento de uma VPC e a criação de um ambiente no provider AWS utilizando Terraform. Ao final deste artigo, o leitor será capaz de compreender a arquitetura básica em cloud AWS e ter uma vpc minimamente configurada com um monitoramento básico. O ambiente criado será utilizado/pode ser utilizado para realização de testes em comunicações dentro de serviços dentro da VPC, criação de rules no CloudWatch, entre outros recursos.
Pré-requisitos para este laboratório
- Ter conhecimento para criar uma instância EC2.
- Terraform instalado
Virtual Private Cloud
A VPC é um recurso da AWS que permite criar uma seção isolada logicamente, na qual é possível criar/gerenciar todo o seu ambiente de redes virtuais. Isso possibilita a criação de subnets, gerenciamento de blocos de ips, tabelas de rotas, gateways utilizando IPV4 e IPV6, monitoramento entre alguns outros recursos. A VPC é criada e esta contida dentro de uma região física, um dos data centers da AWS espalhados pelo mundo. A imagem a seguir descreve a estrutura onde se encontra a VPC. Nesta “AWS Cloud” representa a sua conta, que vai te dar a possíbilidade de escolher dentro as regiões disponiveis em qual você irá trabalhar. “Region” representa a região física citada anteriormente, onde a VPC ficará contida.

Algumas observações sobre VPC:
- É possível ter até 5 (cinco) Amazon VPCs não padrão por conta da AWS em cada região.
- É possível ter até 4 (quatro) intervalos de IP secundários por Amazon VPC.
- É possível criar até 200 (duzentas) sub-redes por Amazon VPC.
- É possível ter até 5 (cinco) endereços IP Elastic de Amazon VPCs por conta da AWS em cada região.
- Caso seja necessário ultrapassar esses limites é possível entrar em contato com a AWS para revê-los. Mais detalhes em: https://aws.amazon.com/pt/vpc/details/
A AWS disponibiliza uma VPC confgurada por padrão para que a criação de instâncias para novos usuários seja mais eficiente . Como proposta foi criado todo o ambiente utilizando o Terraform (0.12.26), deixando este minimamente monitorado para utilização no CloudWatch. O código desenvolvido para a utilização do Terraform está estruturado em um arquivo único somente para simplificação e devidamente documentado. Seguem algumas recomendações que podem ser utilizadas pelo leitor que não tem experiência com Terraform para utilizar esse arquivo como base de desenvolvimento.
- Pense sempre: onde existir um valor que pode ser modificado no futuro, utilize uma variável, por exemplo: nome da VPC, bloco CIRD, region, etc..
- Divida seu projeto em arquivos menores: crie uma estrutra (pasta) somente para compliance e adicione as configurações do CloudWatch.
- Consulte a documentação oficial do Terraform para cada “resource” desse projeto, pois isso irá agregar mais maturidade aos seu códigos.
A seguir será provisionada a seguinte estrutura:
- Uma VPC
- Um Internet Gateway
- Uma Route Table
- Duas Subnets em zonas de disponibilidade diferentes
- Ativação do Flow Log com o armazenamento direto no CloudWatch
- Um IAM role
- Uma IAM Policy
A imagem a seguir apresenta o resultado final do ambiente agregando informações importantes sobre o provider AWS.

Temos informações como: A “Região A” possui uma VPC intitulada como “PROD”, que contém duas subnets sendo armazenadas em zonas de disponibilidade diferentes. Uma zona de disponibilidade dentro da AWS seria uma rack diferente em um prédio por exemplo, em caso de falha em uma zona, existe uma outra zona para manter a disponibilidade do serviço. Mais detalhes sobre zonas de disponibilidade em: Regions, Availability Zone, and Local Zones
“Internet gateway”, “Flow logs” e o “Amazon ClooudWatch, estão contidos na “Região A”, isso significa que estes recursos serão cobrados com base na região que são utilizados . Custo CloudWatch
Nota: É possível utilizar o CloudWatch para monitorar outras regiões e centralizar o monitoramento.
Como demonstrativo acrescentei alguns elementos: o “Account” e “Role”, esse elementos não estão contidos por região e sim globalmente.
1
2
$mkdir vpc && cd vpc
$wget https://gitlab.com/malwarelab/malwarelab.gitlab.io/-/blob/master/files/sources/terraform/vpc.tf
Adicione a suas credenciais, em “YOUR_ACCESS_KEY” e “YOUR_SECRET_KEY”
1
2
3
4
5
6
7
8
9
10
# Provider
provider "aws" {
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
region = "us-east-1"
}
$terraform init
$terraform plan -out vpc
$terraform apply vpc

Testando monitramento Em seguida foi criada uma instância EC2 Amazon Linux 2 do tipo t2.micro, utilizando um [[SecurityGroup]] permissivo para todas as portas. A instância Amazon Linux 2 utiliza pacotes rpm. Para instalação do apache utilize os seguintes comandos:
1
2
3
4
$sudo su
#yum install httpd -y
#systemctl start httpd
#systemctl status httpd

Ao acessar o IP publico da instância, teremos acesso à página default do apache. 
Agora executaremos alguns testes com o nmap com o objetivo de gerar um fluxo de rede na VPC.
1
nmap -sV -sC --script-args http.useragent="USER AGENT POC" XXX.XXX.206.227 -p80,443
Observação: Esse comando deve gerar no monitoramento aproximadamente 32 conexões http (porta 80) e 2 https (porta 443), uma vez que o serviço https não está ativo.

Retornando ao console da AWS, clique em Service e digite CloudWatch. Logs -> Logsgroups -> vpcprod (o grupo criado pelo Terraform) Em Log stream, clique no log atual. O Log events será aberto e irá apresentar todo o fluxo capturado.

Vamos mitigar nosso pequeno ataque: clique em Actions -> View in Logs Insights

Tenha em mãos o IP interno da instância. IP interno: 10.0.1.66
Vamos utilizar a sequinte expressão:
1
2
3
4
5
filter @logStream = 'eni-YOUR_LOGS-all'
| filter (dstPort = 80 and dstAddr = "10.0.1.66" or dstPort = 443 and dstAddr = "10.0.1.66" )
| stats count(*) as records by srcAddr,dstPort
| sort records desc
| limit 10
E assim é possível consultar o resultado do total de conexões realizadas para as portas 80 e 443 por quantidade de requisições de cada IP.

Conclusão
Nesse post foi apresentado o conceito de VPC e alguns outros conceitos e recursos da AWS, um código fonte em Terraform, que pode ser utilizado para criar uma VPC com o mínimo de monitoramento pra realização de testes de provas de conceitos. Também foi apresentada a utilização do CloudWatch, Log groups, Insights com alguns filtros.