Skip to content

fix(infra): tirar o MinIO da rede e a credencial root da aplicação - #32

Merged
net0well merged 1 commit into
mainfrom
fix/endurecer-acesso-ao-minio
Jul 29, 2026
Merged

net0well merged 1 commit into
mainfrom
fix/endurecer-acesso-ao-minio

Conversation

@net0well

Copy link
Copy Markdown
Owner

Duas exposições da mesma classe, achadas na revisão de segurança do cofre.

A porta 9000 do MinIO era publicada na interface do host. O acervo inteiro — XMLs e certificados cifrados — ficava alcançável por fora da API, que é onde vivem a autenticação, as políticas e o log. A porta 9001 era o console administrativo completo, na mesma condição. A API alcança o MinIO pelo nome do serviço na rede do Compose e não precisa de publicação nenhuma; o console fica preso ao loopback, e quem precisar dele de outra máquina usa túnel SSH.

A aplicação usava MINIO_ROOT_USER e MINIO_ROOT_PASSWORD. Ela precisa de quatro ações em dois buckets e tinha todas, em todos: um token comprometido ou um .env exposto dava administração do object store — apagar bucket, trocar política, criar usuário, ler tudo.

O minio-init passa a criar uma política nomeando os dois buckets e uma conta de serviço presa a ela. Todos os comandos são idempotentes, então o serviço roda a cada up sem efeito colateral.

O provisionador da aplicação continua conferindo os buckets no boot, mas a criação agora é negada — e isso é o desenho funcionando. A mensagem de erro passa a dizer isso, para o operador não procurar defeito onde há política.

A suíte roda sob a política de produção

A suíte roda sob a política de produção

O fixture cria a mesma política e a mesma conta dentro do contêiner de teste, e o adaptador recebe a credencial restrita. Antes os testes provavam que o armazenamento funciona com poderes que a aplicação não tem, e apertar a política adiante quebraria a captura sem nenhum teste vermelho para avisar.

Três testes provam o outro lado: a conta não cria bucket, não apaga bucket e não alcança um bucket de fora da política. Sem eles, alargar para s3:* deixaria a suíte verde e devolveria a administração do object store à aplicação sem nenhuma mudança de código.

Documento sem arquivo passa a se explicar

Um documento cujos dados foram lidos de um XML que depois saiu do acervo dizia na tela que a SEFAZ entregara apenas o resumo — logo abaixo da tabela de itens que desmentia isso. Ele agora diz o que de fato aconteceu, e não oferece botão de download: desabilitado sugeriria que basta esperar, e o arquivo não volta.

Duas exposições da mesma classe, achadas na revisão de segurança do cofre.

A porta 9000 do MinIO era publicada na interface do host. O acervo inteiro — XMLs e
certificados cifrados — ficava alcançável por fora da API, que é onde vivem a autenticação,
as políticas e o log. A porta 9001 era o console administrativo completo, na mesma
condição. A API alcança o MinIO pelo nome do serviço na rede do Compose e não precisa de
publicação nenhuma; o console fica preso ao loopback, e quem precisar dele de outra máquina
usa túnel SSH.

A aplicação usava MINIO_ROOT_USER e MINIO_ROOT_PASSWORD. Ela precisa de quatro ações em
dois buckets e tinha todas, em todos: um token comprometido ou um .env exposto dava
administração do object store — apagar bucket, trocar política, criar usuário, ler tudo.

O minio-init passa a criar uma política nomeando os dois buckets e uma conta de serviço
presa a ela. Todos os comandos são idempotentes, então o serviço roda a cada `up` sem
efeito colateral.

O provisionador da aplicação continua conferindo os buckets no boot, mas a criação agora é
negada — e isso é o desenho funcionando. A mensagem de erro passa a dizer isso, para o
operador não procurar defeito onde há política.

A suíte roda sob a política de produção

A suíte roda sob a política de produção

O fixture cria a mesma política e a mesma conta dentro do contêiner de teste, e o adaptador
recebe a credencial restrita. Antes os testes provavam que o armazenamento funciona com
poderes que a aplicação não tem, e apertar a política adiante quebraria a captura sem
nenhum teste vermelho para avisar.

Três testes provam o outro lado: a conta não cria bucket, não apaga bucket e não alcança um
bucket de fora da política. Sem eles, alargar para s3:* deixaria a suíte verde e devolveria
a administração do object store à aplicação sem nenhuma mudança de código.

Documento sem arquivo passa a se explicar

Um documento cujos dados foram lidos de um XML que depois saiu do acervo dizia na tela que
a SEFAZ entregara apenas o resumo — logo abaixo da tabela de itens que desmentia isso. Ele
agora diz o que de fato aconteceu, e não oferece botão de download: desabilitado sugeriria
que basta esperar, e o arquivo não volta.
@net0well
net0well merged commit 6f56a4e into main Jul 29, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant