From 4a8a7a053c3cf17d351950893f5e5ab2a8b0a74e Mon Sep 17 00:00:00 2001 From: net0well Date: Wed, 29 Jul 2026 11:12:19 -0300 Subject: [PATCH] =?UTF-8?q?docs(release):=20registrar=20a=20exposi=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20portas=20pendente=20para=20a=20publica=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O docker-compose de hoje serve a desenvolvimento local, onde publicar porta na máquina não expõe nada. Num host acessível pela rede, três coisas precisam mudar antes de subir, e nenhuma está feita — a decisão foi adiar até a primeira publicação, não descartá-las. A pior não é o banco: é a `api` publicada. O nginx do contêiner `web` já a alcança pela rede interna, então a porta não serve a ninguém — mas exposta ela atende HTTP puro direto da internet, com o redirecionamento para HTTPS desligado. Token de sessão e senha de certificado viajariam em texto claro para quem falasse com ela sem passar pelo proxy. O `postgres` fica no loopback em vez de sair: o `dotnet ef` e os clientes de banco continuam funcionando por túnel SSH, e o único ponto público passa a ser o `web`. E o `ASPNETCORE_ENVIRONMENT`, cujo padrão no compose é `Development` — com ele o Swagger sobe público, com o mapa inteiro da API e as rotas administrativas junto. Fica anotado também que o Docker insere as próprias regras antes do UFW, e que um `ufw deny` não bloqueia porta publicada por ele. É o detalhe que faz alguém conferir o firewall, achar que está protegido, e não estar. --- RELEASE.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 30a12a9..4e2d36c 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -21,6 +21,29 @@ - [ ] TLS terminando no proxy reverso, com `Api__RedirecionarHttps` coerente - [ ] Administrador inicial criado e a senha do `.env` trocada pelo endpoint de usuários +## Exposição de portas — pendente até a primeira publicação + +O `docker-compose.yml` de hoje serve a desenvolvimento local, onde publicar porta na máquina não expõe +nada. **Num host acessível pela rede, três coisas precisam mudar antes de subir**, e nenhuma delas está +feita: + +- [ ] **`api` deixa de ser publicada.** O nginx do contêiner `web` já a alcança pela rede interna + (`location /api/` e `location /hangfire`). Publicada, a API atende HTTP puro direto da internet + com `Api__RedirecionarHttps: "false"` — o token de sessão e a senha do certificado no upload + viajariam em texto claro para quem falasse com ela sem passar pelo proxy. +- [ ] **`postgres` preso ao loopback** (`127.0.0.1:5432:5432`), não removido: o `dotnet ef` e os + clientes de banco continuam funcionando por túnel SSH. Único ponto público deve ser o `web`. +- [ ] **`ASPNETCORE_ENVIRONMENT` definido explicitamente.** O padrão do compose é `Development`, e com + ele o Swagger sobe público — o mapa inteiro da API, rotas administrativas incluídas. + +> **O Docker fura o firewall.** Ele insere as próprias regras na cadeia `DOCKER` do iptables, avaliadas +> **antes** do UFW: um `ufw deny 5432` **não** bloqueia uma porta publicada pelo Docker. Prender ao +> `127.0.0.1` no próprio compose é o que funciona, porque aí o socket nem chega a abrir na interface +> externa. Conferir com `ufw status` dá falsa segurança; confira com `ss -tlnp` ou de outra máquina. + +Nenhuma dessas mudanças perde dado: todas recriam contêiner, e `pgdata` e `miniodata` são volumes +nomeados. Ainda assim, tire o dump antes — o custo é um comando. + ## Verificação funcional - [ ] Login, e `Operador` recebendo 403 nas rotas administrativas