fix(infra): tirar o MinIO da rede e a credencial root da aplicação - #32
Merged
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
upsem 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.