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 chroot
entorno ed.
En papel, es bastante seguro: deshabilitaré todas las formas de bash
inicio 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 iptables
reglas 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.).
--net=none
indicadordocker run
se 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.Respuestas:
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:
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.
fuente
Esto no es realmente un problema específico de Docker. Hay un par de maneras de resolver esto.
Use
iptables
reglas con estado para permitir conexiones entrantes y tráfico relacionado / establecido y luego bloquee todo lo demás.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.
fuente
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.
fuente