Resumo sobre a versão 2 do serviço de metadados de instância AWS EC2 (IMDSv2)
Tags: imdsv2, aws, metadata, security
Published: 2021-09-05 20:50:48


##Por que a AWS lançou a versão 2 do IMDS?


Em 2019 uma nova versão do serviço de metadados de instâncias EC2 foi lançada adicionando proteção para quatro (04) tipos de vulnerabilidades que podem ser exploradas para acesso ao metadata, somando assim as mitigações existentes, como restrição de role e regras de firewall local.

* WAF mal configurados
* Proxies Reversos mal configurados
* Vulnerabilidades SSRF não corrigidas
* Firewalls de camada 3 e NATs mal configurados

##O que há de novo?


Foi introduzido uma autenticação baseada em token, sendo que uma solicitação de PUT separada deve ser feita. As sessões podem durar até seis horas e, para maior segurança, um token de sessão só pode ser usado diretamente na instância EC2 em que a sessão começou.
Transição

Tanto o IMDSv1 quanto o IMDSv2 estarão disponíveis e habilitados por padrão. Também é possível restringir a apenas a versão 2, além de desabilitar totalmente o serviço.

Nosso objetivo é restringir a utilização a apenas a versão 2.

As novas consultas deverão ter o seguinte padrão de exemplo:
```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`

[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
```

Para saber se uma instância está realizando chamadas utilizando a versão 1 é possível utilizar a métrica “MetadataNoToken” do CloudWatch. Essa métrica retorna o número de vezes que o serviço de metadados foi acesso com sucesso sem a utilização de um token.

##Habilitando a versão 2


###Em instâncias já existentes

Use o comando modify-instance-metadata-options da CLI e defina o parâmetro http-tokens como required. Quando você especifica um valor para http-tokens, também deve definir http-endpoint como enabled.
```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567898abcdef0 \
    --http-tokens required \
    --http-endpoint enabled
```

###No lançamento de novas instâncias


* **Via console**

Ao executar uma nova instância no console do Amazon EC2, selecione as seguintes opções na página
**Configure Instance Details**:
Em **Advanced Details** > **Metadata accessible**, selecione **Enabled**.
Em **Metadata version**, selecione **V2 (token required)**.

* **Via terraform**

Resource: aws_instance e aws_launch_template

Nas opções de metadata (**metadata_options**) a opção **"http_tokens"** deve estar requerida (required).
```
metadata_options {
    http_tokens   = "required"
    http_endpoint = "enabled"
}
```
##Referências:

[https://aws.amazon.com/pt/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/](https://aws.amazon.com/pt/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)

[https://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2-instance-metadata.html](https://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)

[https://www.youtube.com/watch?v=2B5bhZzayjI](https://www.youtube.com/watch?v=2B5bhZzayjI)

[https://d1.awsstatic.com/events/reinvent/2019/Security_best_practices_for_the_Amazon_EC2_instance_metadata_service_SEC310.pdf](https://d1.awsstatic.com/events/reinvent/2019/Security_best_practices_for_the_Amazon_EC2_instance_metadata_service_SEC310.pdf)

[https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#metadata-options](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#metadata-options)

[https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template#metadata-options](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template#metadata-options)