¿Bloquea el acceso de red a los hosts en el nivel del kernel en Linux?

3

Eliminándolo del camino: ¡No iptables !

Lo que me gustaría hacer es bloquear el acceso de la red a ciertas IP, subredes y / o nombres de host en el nivel del kernel de Linux, de modo que ningún usuario, incluido el root, pueda pasarlos por alto una vez que el sistema esté en ejecución.

Realmente tengo una necesidad específica para esto, pero no entraré en detalles ya que no cambia la pregunta.

Restricciones adicionales:

  • Se está ejecutando sin virtualizar en hardware desnudo.
  • Sin acceso a dispositivos de red ascendente.
  • No está ejecutando SELinux (pero siéntase libre de dar respuestas que usan SELinux para el beneficio de otros).

Lo ideal sería que root no pudiera eliminar las restricciones de acceso de ninguna manera, pero si root todavía pudiera eliminarlas de maneras extremas, como sobrescribir directamente las estructuras en memoria, eso estaría bien.

    
pregunta Animism 03.05.2013 - 05:27
fuente

5 respuestas

4

El filtrado de las conexiones arbitrarias se podría hacer con un módulo del kernel enlazando netfilter . Y todo lo que se haga en el kernel land con un módulo de kernel, se puede deshacer con un módulo de kernel. Además, nada mantiene la forma de la raíz simplemente instalando su propio kernel ...

la raíz es DIOS, nunca olvides eso.

    
respondido por el rook 03.05.2013 - 06:56
fuente
3

"La raíz es Dios". Bueno, hay dioses ... y luego, hay ancianos dioses.

El usuario root puede hacer muchas cosas en una máquina. En particular, puede reemplazar los archivos que se utilizan para iniciar la máquina; por lo tanto, él puede potencialmente reemplazar tu núcleo con otro propio, lo que lo dejaría pasar. SELinux se puede usar como una forma de hacer una raíz neutralizada y neutralizada que estará limitada de alguna manera, por lo que no más largo el usuario root real; en particular, obligando a cualquier escape a pasar por un reinicio de la máquina. Sin embargo, es difícil bloquear todas las rutas y, posiblemente, el kernel de Linux y SELinux son demasiado complejos para estar libres de errores, por lo tanto, DEBEN existir vulnerabilidades locales que permitan al menos root ir en modo completamente físico.

Además, hay formas tortuosas de escapar de los filtros de red. Por ejemplo, root podría acceder a la interfaz de red en el nivel de Ethernet y emitir y recibir marcos de Ethernet por sí mismo, omitiendo por completo la pila TCP / IP del kernel, por lo que no se verá afectado por ningún filtro de bloqueo se han insertado en ese nivel (y, para el caso, también se omitiría iptables ).

Para contener realmente root , lo intimidó con artillería pesada. Me refiero a una Máquina Virtual . Haga que el sistema Linux se ejecute en una máquina virtual; todo el tráfico de la red externa hacia y desde la VM pasará por el sistema de gestión de VM, que luego puede bloquear y permitir de cualquier forma que crea conveniente, completamente fuera del alcance del malvado root , independientemente de lo que haga. Esto incluso funcionaría si el malvado root reemplazara todo el sistema con NetBSD o Windows o cualquier otra cosa.

El arreglo de VM requiere que la VM sea efectiva para contener al invitado y evitar que toque el host. Esto requiere un poco de fe, pero mucho menos que creer que algo tan complejo como SELinux o el sistema de permisos Unix podría lograr el mismo nivel de confiabilidad de aislamiento.

    
respondido por el Tom Leek 04.05.2013 - 15:05
fuente
1

Entonces, la respuesta de Rook a usted es sí / no. Básicamente, sin descargar la fuente del kernel de Linux y reescribirlo usted mismo, lo que propone es su respuesta. Podría hacer la mayor parte de lo que desea, pero no pudo lograr evitar que la raíz pueda evitar cambiarlo.

Podría hacerlo para que tenga una cuenta raíz que nunca vea la luz del día, y una cuenta secundaria similar (a través de sudo like) que tenga la restricción y no pueda cambiarla.

O puede tener su máquina para que tenga cada chroot de inicio de sesión en un entorno subordinado que nunca pueda ver su ámbito externo en el que se modificaron los módulos.

Por lo tanto, puede obtener parte del camino allí, pero sin la implementación del hardware, o alguna reescritura del sistema operativo, no todo el camino.

    
respondido por el Tek Tengu 03.05.2013 - 11:51
fuente
1

La torre es correcta, por supuesto. Dado que estarías configurando esto como root , alguien podría simplemente desarmarlo como root . Sin embargo, podrías hacer que eso consuma mucho tiempo.

El enfoque más directo sería editar sys_socket.c , o tal vez solo socket.c (el contenedor de modo de usuario) para incluir un filtro de IP.

Si editas sys_socket.c tendrías que volver a compilar el kernel, pero alguien tendría que arrancar un kernel diferente para deshacer tu trabajo, mientras que recompilar socket.c debería ser un poco más fácil de implementar y deshacer.

Sin embargo, el enfoque mejor sería ir a comprar un pequeño cortafuegos IP básico y bloquear los hosts con eso.

    
respondido por el lynks 03.05.2013 - 11:56
fuente
0

La raíz no es dios si tiene SELinux habilitado. Esa es la única manera que puedo ver para lograr lo que quieres. Bloquéelo con iptables y ejecute SELinux en modo estricto.

Es posible que tenga uid 0 pero no tendrá las capacidades (7).

    
respondido por el Tracy Reed 04.05.2013 - 10:16
fuente

Lea otras preguntas en las etiquetas