Regras de firewall que não restringem o acesso aos Docker Web Apps

Regras de firewall que não restringem o acesso aos Docker Web Apps

Tenho um problema onde as portas expostas a aplicativos em execução em nosso sistema em contêineres docker permanecem abertas para o mundo, apesar da configuração do iptables projetada para restringir o acesso.

Parece-me que o problema pode estar relacionado ao daemon do docker adicionando regras ao iptables na inicialização. Também estou ciente dos sinalizadores --icc=true|false, --ip-forward=true|falsemas --iptables=true|falsenão tenho certeza de qual combinação desses sinalizadores devo aplicar. Eu tentei --icc=falsee --ip-forward=falsemas nenhum deles teve o efeito desejado. Detesto usar --iptables=falseporque o daemon docker está claramente adicionando uma série de regras, que eu teria que configurar manualmente se ainda fossem necessárias.

Este é o estado das regras antes do daemon do docker ser iniciado:

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 REJECT     all  --  !lo    any     anywhere             loopback/8           reject-with icmp-port-unreachable
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
    0     0 DROP       all  -f  any    any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
   82  8831 ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports ssh
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 1>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 2>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
    0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   24  2489 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   77 10080 ACCEPT     all  --  any    any     anywhere             anywhere  

E é assim que acontece com o daemon docker em execução:

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 REJECT     all  --  !lo    any     anywhere             loopback/8           reject-with icmp-port-unreachable
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
    0     0 DROP       all  -f  any    any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
 1335  230K ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    1    32 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
    7   380 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports ssh
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 1>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 2>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
   35  2016 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
   62  3672 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
54492   21M DOCKER     all  --  any    docker0  anywhere             anywhere            
51882   20M ACCEPT     all  --  any    docker0  anywhere             anywhere             ctstate RELATED,ESTABLISHED
58371 9122K ACCEPT     all  --  docker0 !docker0  anywhere             anywhere            
    0     0 DROP       all  --  docker0 docker0  anywhere             anywhere            
 1186  121K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2090  263K ACCEPT     all  --  any    any     anywhere             anywhere            

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   86  7048 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.2           tcp dpt:7990
 1639  395K ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.2           tcp dpt:7999
  791  151K ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.3           tcp dpt:http-alt
   20  1898 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.4           tcp dpt:8090
   49  4561 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.5           tcp dpt:18080
   25  3642 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.6           tcp dpt:8095

Há também uma série de regras POSTROUTING & MASQUERADE, que não são exibidas com iptables -L, apenas quando você usa iptables-save. Também não tenho certeza do significado disso.

Suspeito que a regra de destino DOCKER na cadeia FORWARD seja a origem do problema, mas não consigo ver como resolver esse problema porque parece ter sido inserida pelo daemon docker no início da cadeia.

Então, alguém pode me aconselhar sobre o que preciso fazer para garantir que as portas 7990, 8090 etc. não sejam expostas ao mundo ao executar o docker?

Obrigado

Ricardo

Responder1

A DOCKERcadeia é uma cadeia personalizada definida na cadeia FORWARD. Quando um pacote atinge anya interface e é vinculado à interface da ponte docker0, ele é enviado para a cadeia DOCKER personalizada.

pacotes bytes alvo prot opt ​​in out origem destino         
54492 21M DOCKER all -- qualquer docker0 em qualquer lugar em qualquer lugar            

Agora a cadeia DOCKER pegará todos os pacotes recebidos, exceto aqueles vindos do docker0, e os enviará para um IP de contêiner (172.xxx) e porta, neste caso, digamos 7990.

pacotes bytes alvo prot opt ​​in out origem destino         
   86 7048 ACEITAR tcp -- !docker0 docker0 em qualquer lugar 172.17.0.2 tcp dpt:7990

Se você postasse a saída de iptables -t nat -L -n, veria a DNATregra que faz o encaminhamento da porta do host para o contêiner, digamos que os pacotes que atingem a interface do host em 49154 seriam encaminhados para a porta do contêiner IP 172.17.0.2 e porta 7990.

DNAT tcp - 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 a:172.17.0.2:7990

Você pode impedir que os pacotes cheguem ao contêiner limitando o IP de origem de qualquer 0.0.0.0 para permitir apenas os pacotes originados de sua rede interna, por exemplo. Para permitir conexões com a porta do contêiner 7990 apenas de sua rede interna, digamos 192.168.1.0/24, você pode executar o seguinte comando -

/sbin/iptables -I FORWARD '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j DROP

Isso impediria o encaminhamento de quaisquer pacotes para um contêiner do IP:Port especificado, a menos que eles viessem da rede interna. Você pode modificar o IP e a porta de origem/destino dependendo da sua configuração.

Responder2

Então, isso seria um comentário, mas nenhum representante stree.. serverfault para isso.

Você já tentou a solução postada aqui:http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker

de usar esse sinalizador --iptables=falseassim DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"?

informação relacionada