Debug com VsCode, Docker e Python
Olá pessoal, tudo bem?
Hoje resolvi trazer um outro assunto, voltado a parte de code review seguro para vocês. 😊
Quem trabalha na área de AppSec sabe muito bem que dependendo do escopo do profissional, ele precisará fazer code review das aplicações com foco em segurança, testar funcionalidades ou mesmo, realizar pair programming com os desenvolvedores.
No entanto, há situações que você precisará testar a aplicação localmente e isso pode gerar muito trabalho para configurar o ambiente. Então, após ler alguns artigos que deixei aqui de referência para vocês, resolvi criar a minha POC (Prova de Conceito), em Python, de como utilizar a ideia de container (nesse caso, Docker) e a IDE Visual Studio Code para realizar debug da aplicação sem precisar ter o ambiente configurado na minha máquina.
Para isso, você precisará de 3 arquivos:
- Dockerfile
- Launch.json
- Docker-compose
No arquivo do Dockerfile, será aonde você instalará as dependências do seu projeto.
FROM python:3.6
WORKDIR /app
COPY * /app/
# No arquivo requirements.txt possui as dependências do projeto e a lib para conectar debug ao VsCode
RUN pip install -r requirements.txt
# Comando para utilizar o debugpy na app
CMD python3 -m debugpy --wait-for-client --listen 0.0.0.0:5678 -m flask run --host=0.0.0.0 --port 80
É importante perceber a utilização da lib debugpy que é usada para conectar ao VsCode. Por conta disso, usaremos a porta 5678
Para rodar mais de um container na aplicação em um projeto, usamos o docker-compose. Isso ocorre pois geralmente, as aplicações possuem em sua arquitetura, um container separado para a app e outro para banco de dados.
ersion: '3.5'
services:
# Our application to debug
app:
container_name: py-xdebug
build:
context: ./
dockerfile: ./Docker
ports:
- '5678:5678'
- '80:80'
volumes:
- './app.py:/app/app.py'
Aqui, podemos perceber que criamos um volume para ter um bind entre as pastas do container e a pasta local (do computador). Como também, adicionamos a porta 80 que será usada pela aplicação Web e a porta 5678 que será usada pelo VsCode como explicado anteriormente.
Enquanto que no arquivo lauch.json, é criado dentro da pasta do .vscode para conectar a porta 5678 com o servidor do debug remoto (container) ao VsCode.
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Debug",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
}
],
"justMyCode": true
}
]
}
Para criar esse arquivo, é necessário clicar em Run -> Add Configuration -> Remote Attach. Assim, deixar na configuração Default (você também pode clicar no atalho F1 que também acontecerá o mesmo)
Por fim, podemos realizar o debug da aplicação:
Caso queira importar o degbugpy para o início do código da sua aplicação, também é possível de realizar. No entanto, a minha ideia foi criar o melhor setup possível para que não precisasse adicionar linhas de código na aplicação Web. Por conta disso, no Dockerfile, eu coloquei a linha que irá rodar a aplicação no modo debug diretamente:
CMD python3 -m debugpy --wait-for-client --listen 0.0.0.0:5678 -m flask run --host=0.0.0.0 --port 80
Caso quisesse mudar esse modo, poderia ser usado o .flaskenv, por exemplo e definir suas variáveis de ambiente.
Espero que assim mais pessoas consigam criar o setup ideal e rápido para realizar o code review de maneira segura 💜
Caso queiram baixar o repositório, está aqui:
Referências: