Restringir el acceso a la red del contenedor Docker

14

Estoy en el proceso de crear un contenedor Docker solo para SFTP , uno que será utilizado por varias personas con el único propósito de cargar y administrar archivos en su propio chrootentorno ed.

En papel, es bastante seguro: deshabilitaré todas las formas de bashinicio de sesión y no ejecutaré ningún otro proceso en él. Sin embargo, me gustaría endurecerlo un poco más:

Quiero evitar que este contenedor acceda a Internet desde el interior, excepto por su propósito de ser un servidor SFTP.

Para aclarar las cosas: sé cómo evitar que el mundo exterior acceda a mi contenedor: puedo configurar las iptablesreglas entrantes y puedo exponer solo el puerto SFTP en mi comando Docker Run.

Sin embargo, me gustaría hacer que el siguiente comando (como ejemplo) falle, cuando se ejecuta dentro del contenedor:

curl google.com

Mi intención es disminuir la cantidad de daño que puede hacer un contenedor pirateado (no poder usarse para enviar correos electrónicos no deseados, etc.).

Daniel S
fuente
Hay un par de solicitudes de funciones pendientes que pueden ayudar con este tipo de cosas. # 6743, que le permitiría crear previamente reglas de iptables en el host antes de que se inicie el contenedor, y # 6982, que le permitiría agregar reglas de iptables cuando se inicie el contenedor.
Patrick
Docker le brinda control total sobre las interfaces de red de un contenedor; vea cómo Docker conecta en red un contenedor . Por ejemplo, al activar el --net=noneindicador docker runse desactivarán todos los adaptadores de red externos, lo que le permitirá agregar los suyos y personalizar las reglas de tráfico de la red.
sffc

Respuestas:

4

Todavía tiene sentido poner algunas reglas de ingreso dentro de su instancia de acoplador para evitar ataques, pero tendrá que limitar el acceso saliente (Internet) desde cualquier enrutador ascendente con el que se conecte la imagen del acoplador. La razón de esto es que si intenta bloquear el acceso saliente con las reglas del firewall dentro de su instancia, si la instancia se ve comprometida, el atacante podría eliminar esas reglas. Al bloquear la salida a través del enrutador de la instancia, bloquea el acceso saliente incluso en caso de compromiso: el atacante también tendría que comprometer el enrutador.


De acuerdo, después de recibir algunos comentarios que explican que el filtrado estaba destinado al host del contenedor, es un poco más claro lo que se está tratando de lograr. En cuyo caso, en el host, agregaría algunas reglas similares a esta:

iptables -A FORWARD -s lo.cal.sub.net -d con.tai.ner.ip -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d lo.cal.sub.net -j ACCEPT
iptables -A FORWARD -s ! lo.cal.sub.net -d con.tai.ner.ip -p tcp --dport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d ! lo.cal.sub.net -p tcp --sport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -m state --state related,established -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -j DROP

Las dos primeras reglas son para el acceso entre el host y el contenedor. La tercera regla dice (más o menos) que cualquier cosa que no sea la subred del host que se dirige a SFTP está bien para nosotros; la cuarta es la regla de salida que es básicamente un gemelo de la tercera; la quinta regla es un principio general (en caso de que se usen otros puertos relacionados), aunque no debería ser necesario, probablemente podría eliminarlo; La última regla es la magia que impide el acceso a cualquier cosa que no sea la subred del host. Debido a que el acceso se da en las primeras reglas, nunca se activará a menos que no se aplique ninguna de las reglas anteriores, en cuyo caso estamos diciendo "no nos importa lo que quieres, no coincidiste con nada para lo que estás aprobado, así que no puedes llegar desde aquí ". El tráfico entrante desde el exterior se cumplirá con las reglas 3 y 4.

Avery Payne
fuente
Un voto negativo interesante, dado que no hay forma de realizar esto dentro del contenedor sin tener una confianza absoluta en el contenido del contenedor .
Avery Payne
El enrutador ascendente del contenedor de Docker (suponiendo que la configuración predeterminada más compatible) es el host en el que se está ejecutando, y estamos buscando una forma de deshabilitar el acceso a Internet de un solo contenedor en ese host (no dentro del contenedor) sin romper otras funciones de Docker .
Tarnay Kálmán
(suspiro) Realmente no debería volver a escribir mis respuestas mientras duermo solo 6 horas. He modificado la respuesta dada.
Avery Payne
Docker (suponiendo que la configuración predeterminada más compatible) publica puertos de contenedor en el host a través de su proxy tcp de espacio de usuario, por lo que no estoy seguro de si la cadena de reenvío es relevante incluso para las reglas relativas al servicio sftp.
Tarnay Kálmán
Supongo que tendré que configurar un entorno de prueba y sacar a Docker y ver qué implica. Parece que estás sugiriendo que las reglas deberían moverse de adelante a entrada.
Avery Payne
1

Esto no es realmente un problema específico de Docker. Hay un par de maneras de resolver esto.

  1. Use iptablesreglas con estado para permitir conexiones entrantes y tráfico relacionado / establecido y luego bloquee todo lo demás.

  2. Use un servicio sftp solo como ProFTPD que no pueda ejecutar un shell.

En general, si no permite que sus usuarios obtengan un shell y no les permite ejecutar programas desde el contenedor, no necesita preocuparse por ello.

Randall Smith
fuente
1.) Docker establece algunas reglas por sí mismo de manera predeterminada, y agregarlas no haría nada, ya que ya existe una regla de captura general, y la preposición rompería la funcionalidad existente (como los enlaces) si no se tiene cuidado, entonces no es tan trivial. 2.) No responde la pregunta. Y OP ya lo configuró así. Además, mi caso de uso es diferente.
Tarnay Kálmán
0

Esta es solo una lluvia de ideas rápida, y aún no la he probado. Deberá examinarlo en el laboratorio antes de llevarlo a producción.

Para evitar el tráfico saliente en puertos que no sean SSH (SFTP) y web, es posible que desee aplicar la política a través de IPTABLES u otro firewall de Layer4 para DROP o RECHAZAR el tráfico proveniente del segmento utilizado por los contenedores acoplables destinados a 0.0.0.0/0, excepto cuando Destino El puerto es TCP22.

Para resolver el problema de ir a no aprobar lugares en la web, puede intentar configurar una instancia de un proxy de filtrado / almacenamiento en caché, como squid o bluecoat, que está escuchando en la interfaz docker0 y que está utilizando ruta desalineada del host para salir a internet. A partir de ahí, puede aplicar una política basada en muchos criterios, así como guardar la utilización de la red al almacenar en caché el contenido estático. Es posible que desee utilizar NAT (creo que IPTABLES y Masquerade proporcionan esto en Linux) en la máquina host para exigir el uso del proxy de forma transparente (lo describí en mi respuesta a Quiero proxy solo HTTP pero no estoy seguro de qué hacer) hacer con tráfico HTTPS ). Esto implica tener una razón para ingresar a la web en primer lugar y cumplir con las políticas de su empresa.

Debido a la naturaleza de SSH (en la que se basa SFTP), no podrá interceptar el tráfico para mover archivos a menos que implemente una política por la cual los contenedores solo pueden usar pares de claves proporcionados por usted. Esto es bueno para usted, ya que le da algo de " No tenía visibilidad ni control sobre los archivos transferidos"defensa si uno de sus clientes transfiere algo ilegal (como una infracción de IP, o utiliza su servicio para filtrar información que lleva una etiqueta de clasificación, o comercian con CP), si es llevado ante el tribunal por algo que sus clientes hacen (piense análogamente a estado de operador común para empresas de telecomunicaciones). Esto es malo para usted porque no puede almacenar en caché los archivos que no se transfieren con frecuencia y sin cambios, y porque cualquier política que escriba en el contrato con sus clientes será esencialmente inaplicable por medios técnicos.

DTK
fuente