fix(docker): restrict exposed database and phpMyAdmin ports - #4
Open
Guajir0-code wants to merge 1 commit into
Open
fix(docker): restrict exposed database and phpMyAdmin ports#4Guajir0-code wants to merge 1 commit into
Guajir0-code wants to merge 1 commit into
Conversation
The compose file published MySQL and phpMyAdmin on 0.0.0.0 while MySQL also accepted root from any host with an empty password, so anyone able to reach the machine could open phpMyAdmin on :3333 and log in as root against the WordPress database. - bind MySQL and phpMyAdmin to 127.0.0.1 - drop MYSQL_ALLOW_EMPTY_PASSWORD, so DB_PASSWORD is required - move phpMyAdmin behind the tools compose profile - restart: always -> unless-stopped Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Problema
O
docker-compose.ymlpublica o MySQL e o phpMyAdmin em0.0.0.0enquanto o MySQL aceitarootde qualquer host com senha vazia. Quem alcançar a máquina abre o phpMyAdmin na porta 3333 e entra como root no banco do WordPress.Evidência
Três configurações que, isoladas, seriam aceitáveis, e juntas formam um caminho aberto:
MYSQL_ALLOW_EMPTY_PASSWORDsobrepõe a proteção queMYSQL_ROOT_PASSWORDdaria. Como orestart: alwaysreliga o phpMyAdmin a cada boot da máquina, o serviço fica exposto mesmo sem ninguém ter rodadodocker compose upnaquele dia.O risco é proporcional a onde isso sobe: numa rede doméstica é ruim; numa VPS com IP público é acesso irrestrito ao banco do site.
Solução
Quatro mudanças:
127.0.0.1. Continuam acessíveis da própria máquina e de dentro da rede do compose; deixam de ser acessíveis do resto da rede.MYSQL_ALLOW_EMPTY_PASSWORDremovido, de forma queDB_PASSWORDpassa a ser obrigatório de verdade.tools, ou seja, deixa de subir junto com oupnormal.restart: always→unless-stopped, para o container não voltar sozinho depois de parado de propósito.Por que
MYSQL_ROOT_HOST: '%'continuaO phpMyAdmin conecta ao MySQL de dentro da rede do compose, com um IP que não é
localhostdo ponto de vista do container. Restringir esse valor quebraria o login como root. Com a porta ligada ao loopback e a senha obrigatória, o%passa a significar "qualquer host da rede do compose", que é o comportamento pretendido.Como validar
O phpMyAdmin agora é opt-in:
Sem a flag, sobem apenas
laravel.testemysql.Conferindo que as portas não escutam mais em todas as interfaces:
docker compose ps --format 'table {{.Service}}\t{{.Ports}}'Espera-se
127.0.0.1:3306->3306/tcp, não0.0.0.0:3306->3306/tcp.Não consegui executar isso. Não tenho Docker no ambiente onde preparei o PR, então validei o arquivo com um parser de YAML e conferi a estrutura resultante campo a campo. A verificação acima precisa ser feita por alguém com o ambiente rodando.
Impacto
--profile tools. É a única mudança de rotina.DB_PASSWORDno.env. Volumes já existentes mantêm as credenciais com que foram inicializados, então isso afeta principalmente instalações novas.docker-compose.ymlmuda.Fora de escopo
docker-compose.override.ymlnão foi tocado, de propósito. Ele defineuser: root,cap_add: NET_BIND_SERVICEe volumes com o sufixo:z— o conjunto é um contorno conhecido de SELinux, típico de Fedora/RHEL. Remover ouser: rootseria defensável em tese, mas eu não tenho como reproduzir esse ambiente e a mudança tem chance real de quebrar as permissões de arquivo da máquina de quem mantém o projeto. Fica registrado como observação, para decisão de quem conhece o host.