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

6

Eu tenho um problema em que as portas expostas a aplicativos em execução em nosso sistema em contêineres do 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 adicionar regras ao iptables na inicialização. Também estou ciente dos sinalizadores --icc=true|false , --ip-forward=true|false e --iptables=true|false , mas não tenho certeza de qual combinação desses sinalizadores devo aplicar. Eu tentei --icc=false e --ip-forward=false , mas nenhum deles teve o efeito desejado. Eu detesto usar --iptables=false porque o daemon do docker está claramente adicionando várias regras, que eu teria que configurar manualmente se ainda fossem necessárias.

Este é o estado das regras antes que o daemon do docker seja 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 do 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 vários POSTROUTING & Regras de MASQUERADE, que não são exibidas com iptables -L , somente quando você usa iptables-save . Eu não tenho certeza do significado destes também.

Eu suspeito que a regra de destino DOCKER na cadeia FORWARD é a origem do problema, mas não consigo ver como resolver esse problema porque parece ser inserido pelo daemon do docker no início da cadeia.

Então, alguém pode me avisar sobre o que eu preciso fazer para ter certeza de que as portas 7990, 8090 etc. não estão expostas ao mundo quando rodar o docker?

Obrigado

Richard

    
por Richard Corfield 15.05.2015 / 00:44

2 respostas

6

A corrente DOCKER é uma cadeia personalizada definida na cadeia FORWARD. Quando um pacote atinge a interface any e está vinculado à interface docker0 bridge, ele é enviado para a cadeia DOCKER personalizada.

pkts bytes target     prot opt in     out     source               destination         
54492   21M DOCKER     all  --  any    docker0  anywhere             anywhere            

Agora, a cadeia DOCKER pegará todos os pacotes de entrada, exceto os que vêm do docker0, e os enviará para um IP de contêiner (172.x.x.x) e porta, nesse caso, 7990.

pkts bytes target     prot opt in     out     source               destination         
   86  7048 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.2           tcp dpt:7990

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

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

Você pode impedir que os pacotes atinjam o contêiner limitando o IP de origem de qualquer 0.0.0.0 a permitir apenas os pacotes originados de sua rede interna, por exemplo. Para permitir conexões à porta do contêiner de 7990 somente a partir de sua rede interna de, 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 qualquer pacote para um contêiner do IP especificado: Porta, a menos que eles sejam provenientes da rede interna. Você pode modificar o IP e a porta de origem / destino, dependendo da sua configuração.

    
por 15.05.2015 / 05:50
0

Então, isso seria um comentário, mas não stree .. serverfault rep for it.

Você já tentou a solução postada aqui: link

de usar este sinalizador --iptables=false como DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false" ?

    
por 02.06.2015 / 15:40