Estoy buscando formas de fortalecer un sistema Linux para que, incluso al obtener acceso root completo (a través de medios legítimos o no), algunos secretos permanezcan inaccesibles. Pero primero un poco de antecedentes.
Muchos de los diferentes modelos de seguridad de Linux (SELinux, TOMOYO, etc.) se concentran en limitar lo que pueden hacer los procesos por política y asegurarse de que no necesiten acceso root completo. Su objetivo es mantener los exploits contenidos para que otras partes del sistema no puedan verse comprometidas. Sin embargo, parece que estos no abordan directamente el caso en el que ya se ha obtenido la raíz completa, o, incluso más, ocultan secretos al usuario root válido. Parece que normalmente estos pueden ser desactivados por la raíz real en tiempo de ejecución.
Otro enfoque es limitar las formas de obtener una raíz completa sin restricciones, por ejemplo, no permitir todo el acceso a un usuario root conectado de forma remota, pero requiere un inicio de sesión desde la consola física. Sin embargo, este tampoco es mi objetivo: se supone que ya se han superado dichas protecciones y que la raíz es lo más legítima posible.
Es obvio que cualquier persona con acceso físico a la máquina puede obtener todo lo almacenado en el disco duro y posiblemente también todo lo almacenado en la memoria. También es obvio que si el usuario root tiene el poder de modificar binarios o imágenes del kernel, no se pueden hacer promesas de seguridad después del reinicio. Solo me interesan los ataques que se pueden realizar sin reiniciar el sistema.
Además, durante el proceso de inicio, lo más probable es que los secretos se transmitan a través de muchos lugares y se necesitan muchas funciones críticas de seguridad. Por supuesto, es genial si los secretos también se pueden proteger durante el proceso de inicio, pero lo que es suficiente para mí es un paso durante el inicio en el que se pueden eliminar los privilegios elevados y después del cual no hay forma de recuperarlos.
Entonces, con estas limitaciones, ¿cuáles son las formas en Linux para evitar que el usuario root completo acceda a algunos secretos?
-
¿Puede haber archivos en el sistema de archivos que no sean accesibles incluso para la raíz completa de ninguna manera, pero accesibles para algunos procesos? ¿Algunos procesos actualmente en ejecución, o incluso procesos nuevos iniciados por los procesos que actualmente tienen acceso?
-
¿Se pueden guardar secretos en la memoria ejecutando procesos de modo que incluso la raíz completa no pueda obtener acceso a ellos por cualquier medio? ¿Se pueden transmitir estos secretos a nuevos procesos por algún medio que la raíz no pueda afectar?
Esta es una pregunta difícil de escribir para obtener respuestas relevantes para mí, así que intentará editar la pregunta para que sea más específica si es necesario.
Las cosas obvias que vienen a la mente y que deben limitarse serían:
-
Desactivar acceso a / proc / mem
-
Deshabilitar el acceso a / proc / <pid> / mem
-
Deshabilitar el acceso a / proc / <pid> / fd / *
-
Desactivar la carga de módulos (solo después de que se hayan cargado algunos módulos, preferiblemente)
-
Desactivar ptrace acceso a cualquier proceso