¿Es posible bloquear el acceso a la red (saliente) de un solo proceso?
linux
networking
process
iptables
larkee
fuente
fuente
localhost
(a la misma máquina) para hacer su trabajo.Respuestas:
Con Linux 2.6.24+ (considerado experimental hasta 2.6.29), puede usar espacios de nombres de red para eso. Debe tener habilitados los 'espacios de nombres de red' en su kernel (
CONFIG_NET_NS=y
) y util-linux con launshare
herramienta.Luego, iniciar un proceso sin acceso a la red es tan simple como:
Esto crea un espacio de nombres de red vacío para el proceso. Es decir, se ejecuta sin interfaces de red, incluido sin loopback . En el ejemplo a continuación, agregamos -r para ejecutar el programa solo después de que el usuario efectivo actual y las ID de grupo se hayan asignado a los superusuarios (evite sudo):
Si su aplicación necesita una interfaz de red, puede configurar una nueva:
Tenga en cuenta que esto creará un nuevo loopback local . Es decir, el proceso generado no podrá acceder a los puertos abiertos del host
127.0.0.1
.Si necesita obtener acceso a la red original dentro del espacio de nombres, puede usarlo
nsenter
para ingresar al otro espacio de nombres.El siguiente ejemplo se ejecuta
ping
con el espacio de nombres de red que utiliza el PID 1 (se especifica a través de-t 1
):fuente
unshare -n
parece lanzar "Operación no permitida" sinroot
privilegios, ¿me falta algo?sudo unshare -n
hereda la raíz correcta. Como necesito el sudo para llamar a unshare, me pregunto cómo puedo asegurarme de que el programa llamado no tenga los derechos de root.sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240Linux tiene una característica llamada espacios de nombres de red que le permiten esencialmente tener múltiples pilas de red en la misma máquina, y asignar una a un programa cuando se ejecuta. Esta es una característica que generalmente se usa para contenedores, pero también puede usarla para lograr lo que desea.
Los
ip netns
subcomandos lo gestionan. Crear un nuevo espacio de nombres de red sin acceso a nada es fácil, es el estado predeterminado de un nuevo espacio de nombres:Ahora, si cambia a ese espacio de nombres, puede configurarlo con bastante facilidad. Probablemente quieras mencionarlo, y eso es todo:
Ahora, cuando desee ejecutar su comando sin red, simplemente ejecútelo en esa cárcel:
La red es, como se desea, inalcanzable. (Puede hacer todo tipo de cosas interesantes ya que una pila de red separada incluye
iptables
reglas, etc.)fuente
sudo ip
ejecutar los comandos de ip, una vez que estaba en bash, simplemente ejecutésu someuser
para obtener un shell sin privilegios para el usuario 'someuser'.Puede usar iptables y mover ese proceso a un cgroup:
fuente
/sys/fs/cgroup/net_cls/tasks
(sin 'bloqueo' en la ruta)Sí, con un perfil de apparmor personalizado, es decir
Pero de esa manera, también necesitará generar una lista de archivos permitidos para acceder, todo el procedimiento puede ser un poco complicado. Y mira el documento de ayuda aquí
fuente
Puede usar el entorno limitado de firejail (debería funcionar en núcleos con la función seccomp).
Para usarlo solo haz
--noprofile
deshabilita el sandbox predeterminado--net=none
deshabilita las redesCreo que la mayoría de las distribuciones ya proporcionan el paquete, pero incluso si no tienen una jaula de fuego, prácticamente no tiene dependencias aparte de la construcción de la cadena de herramientas y el núcleo habilitado para el espacio de nombres / seccomp.
Hay algunas otras características interesantes de firejail que se pueden mostrar con
firejail --help
respecto a las redes (como proporcionar solo una interfaz de bucle invertido o bloquear ip / dns, etc.) pero esto debería hacer el trabajo. Además, esodoesn't require root
.fuente
No puede hacerlo solo con iptables. Esta característica existió brevemente , pero no pudo hacerse funcionar de manera confiable y fue abandonada.
Si puede ejecutar el proceso como una ID de usuario dedicada, iptables puede hacerlo con el
owner
módulo:Vea ejemplos en Iptables: correspondencia del tráfico saliente con conntrack y propietario. Funciona con gotas extrañas , regla iptables / pf para permitir solo la aplicación / usuario XY?
Si puede ejecutar el proceso en su propio contenedor, puede cortafuegos de ese contenedor de forma independiente (incluso hacerlo completamente desconectado de la red).
Un módulo de seguridad puede filtrar el acceso de un proceso a las funciones de red. La respuesta de warl0ck da un ejemplo con AppArmor.
fuente
Solución 1: Cortafuegos:
Podríamos usar firewalls como Douane u Opensnitch PERO esas aplicaciones no son 100% eficientes o están en una etapa temprana de desarrollo (tienen muchos errores, etc. a partir de 2019)
Solución 2: Kernel MAC:
Los MAC del kernel se pueden usar como firewall más conocidos como Tomoyo , Selinux y Apparmor. Esta solución es la mejor cuando se trata de estabilidad y eficiencia (solución de firewall), pero la mayoría de las veces configurar esto es de alguna manera complicado.
Solución 3: Firejail:
Firejail se puede usar para bloquear el acceso a la red para una aplicación, esto no requiere root, ningún usuario puede beneficiarse de ella
Solución 4: dejar de compartir
Unshare puede iniciar una aplicación en un nombre diferente sin red, pero esto requiere que la solución root firejail haga casi exactamente lo mismo, pero no requiere root
Solución 5: Proxify:
Una solución es proxificar la aplicación a un proxy nulo / falso . Podemos usar tsocks o proxybound . Aquí hay algunos detalles sobre la configuración
Solución 6: Iptables:
Otra solución fácil es iptables, podría configurarse para bloquear una aplicación.
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
Nota: Si está modificando un usuario ya existente, debe ejecutarlo:
usermod -a -G no-internet userName
consulte con:sudo groups userName
nano /home/username/.local/bin/no-internet
chmod 755 /home/username/.local/bin/no-internet
#!/bin/bash
sg no-internet "$@"
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
Nota: No olvide hacer que los cambios sean permanentes, por lo que se aplicarán automáticamente después del reinicio . Hacerlo depende de su distribución de Linux.
4. Verifíquelo, por ejemplo en Firefox ejecutando:
no-internet "firefox"
5. En caso de que desee hacer una excepción y permitir que un programa acceda a la red local :
iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP
6. Hazlo permanente
Una forma de aplicar la regla de iptables en el arranque es agregar la regla como un servicio con systemd
fuente
sg no-internet
por ahora.Depende de la distribución que esté utilizando, pero esa es una característica generalmente incluida en el sistema MAC del sistema operativo. Como se indicó anteriormente, Ubuntu o AppArmor de SuSE pueden hacer esto. Si está utilizando RHEL, puede configurar SELinux para permitir o denegar el acceso a un número de puerto en particular según la etiqueta del proceso de ejecución. Esto es todo lo que pude encontrar después de buscar rápidamente en Google, pero probablemente haya recursos más detallados en línea si buscas más y te da una idea general.
fuente
Puede usar seccomp-bpf para bloquear algunas llamadas al sistema. Por ejemplo, puede querer bloquear la
socket
llamada al sistema para evitar que el proceso cree sockets FD.Escribí un ejemplo de este enfoque que impide que la
socket
llamada del sistema funcione con libseccomp. El resumen es (sin verificación de errores):Esto no necesita privilegios de root.
Sin embargo, un sandbox completo es mucho más complejo, por lo que no debe usarlo para bloquear programas no cooperativos / maliciosos.
fuente
Puede usar un programa de línea de comando llamado "proxychains" y probar una de las siguientes posibilidades:
Configurar que usa ...
No lo he probado yo mismo, así que no sé si funciona ...
fuente