Como usar o Docker com um firewall UFW


0

Surpreendentemente, o Docker não funciona imediatamente com o “Firewall Universal” do Linux, ou UFW. Ambos modificam a mesma configuração do iptables, e isso pode levar a configurações incorretas expondo contêineres que não deveriam ser públicos. Veja como corrigi-lo.

Por que o Docker não funciona com o UFW?

O UFW pretende ser um firewall muito simples. O problema é que o UFW e o Docker tentam modificar as mesmas regras de firewall subjacentes, e esse conflito requer configuração extra para resolver se você deseja executar o UFW e o Docker juntos.

Se você configurar um firewall UFW básico para negar por padrão e permitir HTTP e SSH, isso parecerá seguro, mas não impedirá o Docker de iniciar contêineres vinculados a outras portas. Esse problema pode ser difícil de detectar, pois o UFW e o Docker são sistemas separados. O UFW está mentindo para você sem saber e não mostrará portas abertas de contêineres do Docker.

Isso pode ser um grande problema se você não pegá-lo. Por exemplo, talvez você queira executar um painel de administração interno na porta 8000 e colocá-lo na lista de permissões para seu próprio endereço IP. Embora essa não seja a configuração mais segura para começar, geralmente é boa, especialmente se o painel tiver autenticação adicional.

No entanto, o UFW mostrará a regra de firewall como corretamente na lista de permissões e, é claro, ficará visível para você no local da lista de permissões. Mas, se for executado pelo Docker, ficará visível na porta 8000 de qualquer lugar por padrão.

Corrigindo a configuração do Docker

Existe uma solução que o Docker fornece, editando /etc/default/docker ou /etc/docker/daemon.json e simplesmente desligando o Docker iptables funcionalidade completamente:

DOCKER_OPTS="--iptables=false"

Isso funciona, no entanto, esta é apenas uma meia solução. Ele desabilita a capacidade do Docker de gerenciar sua própria rede e pode fazer com que os contêineres não consigam acessar a Internet imediatamente. Isso ainda pode funcionar, mas você precisará manter manualmente iptables regras para contêineres do Docker e redes personalizadas, o que é complicado, irritante e anula o propósito da simplicidade do UFW.

A solução real é complicada, mas felizmente é comum o suficiente para que haja um repositório Github útil detalhando o problema e as etapas para corrigi-lo. Essencialmente, você precisa modificar a configuração do UFW em /etc/ufw/after.rules para adicionar o seguinte bloco no final:

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

Você pode fazer isso manualmente, mas há um bom utilitário também fornecido neste repositório que o automatizará e fornecerá alguns comandos úteis para verificar o status real do firewall. Você pode baixá-lo neste repositório:

sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker

sudo chmod +x /usr/local/bin/ufw-docker

Em seguida, instale a configuração e reinicie o UFW.

ufw-docker install

sudo systemctl restart ufw

Uma vez reiniciado, as alterações devem ser aplicadas automaticamente, mas se não o fizerem, pode ser necessário reiniciar o Docker ou sua máquina em geral. Uma vez habilitado, todas as portas devem estar devidamente bloqueadas.

Lista de permissões de portas de contêiner do Docker com UFW

Esta solução exige que você configure a porta de forma um pouco diferente. o ufw-docker O utilitário tem um comando que colocará seletivamente na lista de permissões portas para contêineres específicos do Docker.

ufw-docker allow httpd 80

No entanto, se você quiser usar uma regra mais avançada, como lista de permissões baseada em IP, precisará usar ufw route allow

ufw route allow proto tcp from 1.2.3.4 to any port 9443

Like it? Share with your friends!

0

0 Comments

Your email address will not be published. Required fields are marked *