Capítulo 6 · 6.3
Docker e a firewall: publicar portas em segurança
Esta é a armadilha em que a maioria das pessoas cai. Uma porta que publica no Docker com ports: fica acessível a partir da Internet, mesmo que o ufw feche essa porta. O Docker define as suas próprias regras de firewall e estas têm prioridade sobre as regras do ufw.
Um exemplo do que corre mal
services:
db:
image: mariadb:11
ports:
- "3306:3306"
A sua firewall indica que apenas as portas 22, 80 e 443 estão abertas. Ainda assim, a sua base de dados fica agora acessível a partir de todo o mundo na porta 3306.
Três regras para manter tudo seguro
- Publique apenas o que tem de estar acessível a partir do exterior. Neste manual, isso é apenas o Caddy, nas portas 80 e 443. As aplicações comunicam com o Caddy através da rede interna do compose. Não precisam de
ports:. - Uma porta só deve estar acessível no próprio servidor? Coloque
127.0.0.1:antes dela. Assim, apenas o próprio servidor lhe consegue aceder, ou o utilizador através de um túnel SSH (consulte Uma configuração SSH: iniciar sessão com um nome curto). - Uma base de dados nunca recebe
ports:. A aplicação encontra-a pelo nome do serviço, comodb.
ports:
- "127.0.0.1:3001:3001"
Verificar a partir do exterior
Veja no servidor que portas estão abertas para todos:
anna@web1:~$ sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 4096 127.0.0.1:3001 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",...))
Tudo o que tem 0.0.0.0 ou [::] está acessível a partir do exterior. Tudo o que tem 127.0.0.1 está acessível apenas a partir do interior. Se quiser verificar a partir do exterior, utilize no seu próprio computador um scanner de portas como o nmap no seu próprio endereço IP.
Atenção: Não monte /var/run/docker.sock num contentor, a não ser que saiba exatamente porquê. Quem assumir o controlo desse contentor fica com acesso a todo o seu servidor.
