Reglas de firewall que no restringen el acceso a Docker Web Apps

Reglas de firewall que no restringen el acceso a Docker Web Apps

Tengo un problema donde los puertos expuestos a aplicaciones que se ejecutan en nuestro sistema en contenedores Docker permanecen abiertos al mundo a pesar de la configuración de iptables diseñada para restringir el acceso.

Me parece que el problema puede estar relacionado con el demonio acoplable que agrega reglas a iptables al inicio. También conozco las banderas --icc=true|false, --ip-forward=true|falsepero --iptables=true|falseno estoy seguro de qué combinación de estas banderas debería aplicar. Lo he probado --icc=falsey --ip-forward=falseninguno ha tenido el efecto deseado. Detesto usarlo --iptables=falseporque el demonio acoplable claramente agrega una serie de reglas, que tendría que configurar manualmente si aún son necesarias.

Este es el estado de las reglas antes de que se inicie el demonio acoplable:

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  

Y esto es lo que ocurre con el demonio acoplable ejecutándose:

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

También hay una serie de reglas POSTROUTING & MASQUERADE, que no se muestran con iptables -L, solo cuando usas iptables-save. Tampoco estoy seguro del significado de estos.

Sospecho que la regla de destino DOCKER en la cadena FORWARD es la fuente del problema, pero no veo cómo resolverlo porque parece que el demonio acoplable la inserta al comienzo de la cadena.

Entonces, ¿alguien puede aconsejarme qué debo hacer para asegurarme de que los puertos 7990, 8090, etc. no estén expuestos al mundo cuando ejecuto Docker?

Gracias

Ricardo

Respuesta1

La DOCKERcadena es una cadena personalizada definida en la cadena FORWARD. Cuando un paquete llega a anyla interfaz y está vinculado a la interfaz del puente docker0, se envía a la cadena DOCKER personalizada.

paquetes bytes destino prot optar por salir origen destino         
54492 21M DOCKER todos - cualquier docker0 en cualquier lugar            

Ahora la cadena DOCKER tomará todos los paquetes entrantes, excepto los que provienen de docker0, y los enviará a una IP y puerto de contenedor (172.xxx), en este caso digamos 7990.

paquetes bytes destino prot optar por salir origen destino         
   86 7048 ACEPTAR tcp -- !docker0 docker0 en cualquier lugar 172.17.0.2 tcp dpt:7990

Si publicara el resultado de iptables -t nat -L -n, vería la DNATregla que reenvía el puerto del host al contenedor, por ejemplo, los paquetes que lleguen a la interfaz del host en 49154 se reenviarán al puerto IP 172.17.0.2 y al puerto 7990 del contenedor.

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

Puede impedir que los paquetes lleguen al contenedor limitando la IP de origen de cualquier 0.0.0.0 para permitir solo los paquetes que se originan en su red interna, por ejemplo. Para permitir conexiones al puerto de contenedor 7990 solo desde su red interna, digamos 192.168.1.0/24, puede ejecutar el siguiente comando:

/sbin/iptables -ADELANTE '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j SOLTAR

Esto evitaría el reenvío de paquetes a un contenedor de la IP:Puerto especificada, a menos que provengan de la red interna. Puede modificar la IP y el puerto de origen/destino según su configuración.

Respuesta2

Entonces, esto sería un comentario, pero no un representante de stree... serverfault para ello.

¿Has probado la solución publicada aquí?http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker

de usar esta bandera --iptables=falsecomo tal DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"?

información relacionada