Projeto-base do curso SecDevOps: Da Teoria ao Deploy Seguro, do Coisa de Dev Academy.
Uma API mínima de notas, em FastAPI, usada para demonstrar práticas de DevSecOps num fluxo realista de desenvolvimento — do código ao container, passando pelo pipeline.
⚠️ Este repositório contém vulnerabilidades plantadas de propósito. Ele é material didático: as falhas existem para serem encontradas, explicadas e corrigidas em aula. Não use este código como base para uma aplicação real. A seção Falhas plantadas lista cada uma.
- Python 3.11
- FastAPI + Uvicorn
- python-dotenv
- Docker
- GitHub Actions (pytest + pip-audit)
Crie e ative um ambiente virtual:
python -m venv .venv
source .venv/bin/activate # Linux / macOS
.venv\Scripts\activate # WindowsInstale as dependências:
pip install -r requirements.txtCrie seu arquivo de ambiente a partir do exemplo:
cp .env.example .envSuba a aplicação:
PYTHONPATH=. uvicorn app.main:app --reloadA API sobe em http://127.0.0.1:8000. A documentação interativa gerada pelo FastAPI fica em http://127.0.0.1:8000/docs.
docker build -t secure-notes-api .
docker run -p 8000:8000 --env-file .env secure-notes-apiPYTHONPATH=. pytest| Método | Rota | Descrição |
|---|---|---|
| GET | / |
Mensagem de boas-vindas e ambiente atual |
| GET | /health |
Health check |
| GET | /notes |
Lista todas as notas |
| POST | /notes |
Cria uma nota (title e content obrigatórios) |
| GET | /debug |
Dump de configuração — só com DEBUG=true |
As notas ficam em memória: reiniciar o processo apaga tudo. É intencional, para manter o foco do curso em segurança e pipeline, não em persistência.
Cada item abaixo é um exercício. A ideia é encontrar a falha, entender o impacto e propor a correção — nesta ordem.
app/main.py — o endpoint devolve a chave de API em texto puro na resposta HTTP.
Endpoint de diagnóstico que vaza segredo é uma das formas mais comuns de exposição em produção. Basta alguém esquecer a flag ligada. (OWASP API8:2023 — Security Misconfiguration.)
.env.example — quem copia o exemplo sobe a aplicação já com o /debug liberado.
Configuração padrão deve ser a mais restritiva. O caminho seguro precisa ser o caminho preguiçoso, ou ninguém segue.
app/main.py — a chave é lida do ambiente, mas nenhuma rota a verifica. /notes aceita leitura e escrita de qualquer pessoa.
Segredo que existe mas não é usado dá falsa sensação de proteção — pior que não ter. (OWASP API2:2023 — Broken Authentication.)
Dockerfile — sem USER, o processo roda com uid 0.
Se a aplicação for comprometida, o atacante começa como root dentro do container, o que encurta muito o caminho para escapar dele.
Dockerfile — tudo que estiver no diretório entra na imagem, inclusive um .env real e o .git.
Segredo dentro de imagem publicada não se apaga: fica na camada, mesmo que um RUN rm venha depois.
.github/workflows/ci.yml — o passo de auditoria roda com continue-on-error: true.
O pipeline reporta vulnerabilidade em dependência e segue verde. Gate que não trava não é gate: é log.
- Proteger
/notesexigindo aAPI_KEYnum header. - Remover o
/debugou restringi-lo ao ambiente de desenvolvimento por verificação deAPP_ENV. - Adicionar
USERnão-root aoDockerfilee um.dockerignore. - Tirar o
continue-on-errordopip-audite resolver o que ele apontar. - Acrescentar análise estática (
bandit) e varredura de imagem (trivy) ao pipeline.
MIT — veja LICENSE.