¿Cómo "encarcelar" un proceso sin ser root?

26

Si fuera root, podría simplemente crear un usuario / grupo ficticio, establecer los permisos de archivo en consecuencia y ejecutar el proceso como ese usuario. Sin embargo, no lo soy, entonces, ¿hay alguna manera de lograr esto sin ser root?

Tobias Kienzler
fuente
1
@alex: Tengo un script que ejecuta múltiples simulaciones (en diferentes directorios) y quiero asegurarme de que no importa qué tan mala sea la programación, solo pueden acceder a los archivos en su propio directorio y no modificar accidentalmente, por ejemplo, la salida de las otras simulaciones
Tobias Kienzler
2
@Tobias: Tengo tu punto. chrootnaturalmente encajaría allí, pero de nuevo no eres root.
alex
1
Creo que selinux, apparmor y grsecurity podrían hacer esto, pero no estoy seguro. pero luego, si esos no están disponibles o configurados por el administrador del sistema, estás seguro de eso.
xenoterracide
44
Tal pregunta me ha preguntado durante años. Parece ser un deseo tan natural: sin ser root, poder ejecutar procesos con algunos de los permisos de su usuario descartados, es decir, poder limitar un proceso a una "cárcel" configurada por el usuario, lo que daría el proceso incluso menos derechos que los que tiene tu usuario. ¡Es una pena que los Unices habituales no hayan ofrecido esto de manera estándar!
imz - Ivan Zakharyaschev
2
Intente pedirle al administrador del sistema que le haga una segunda cuenta de usuario.
LawrenceC

Respuestas:

23

Preguntas más similares con más respuestas que merecen atención:

NOTA: Algunas de las respuestas apuntan a soluciones específicas que aún no se mencionan aquí.

En realidad, hay bastantes herramientas de encarcelamiento con implementación diferente, pero muchas de ellas no son seguras por diseño (como fakeroot, LD_PRELOADbasadas en) o no están completas (como fakeroot-ng, ptracebasadas en), o requerirían root ( chrooto se plashmencionan en fakechroot etiqueta de advertencia ).

Estos son solo ejemplos; Pensé en enumerarlos todos lado a lado, con indicación de estas 2 características ("¿se puede confiar?", "¿Requiere root para configurar?"), Tal vez en implementaciones de virtualización a nivel de sistema operativo .

En general, las respuestas allí cubren la gama completa de posibilidades descritas y aún más:

máquinas virtuales / SO

extensión del kernel (como SELinux)

  • (mencionado en los comentarios aquí),

chroot

Ayudantes basados ​​en Chroot (que, sin embargo, deben establecerse como root de UID, porque chrootrequieren root; o tal vez chrootpodrían funcionar en un espacio de nombres aislado, ver a continuación):

[para contar un poco más sobre ellos!]

Herramientas de aislamiento basadas en chroot conocidas:

  • hasher con sus hsh-runy hsh-shellcomandos. ( Hasher fue diseñado para crear software de manera segura y repetible).
  • Schroot mencionado en otra respuesta
  • ...

traza

Otra solución de aislamiento confiable (además de una seccompbasada en la base ) sería la intercepción completa de syscall ptrace, como se explica en la página de manual para fakeroot-ng:

A diferencia de las implementaciones anteriores, fakeroot-ng usa una tecnología que no deja al proceso rastreado ninguna opción con respecto a si usará o no los "servicios" de fakeroot-ng. Compilar un programa estáticamente, llamar directamente al kernel y manipular el propio espacio de direcciones son todas técnicas que pueden usarse trivialmente para evitar el control basado en LD_PRELOAD sobre un proceso y no se aplican a fakeroot-ng. En teoría, es posible moldear fakeroot-ng de tal manera que tenga un control total sobre el proceso trazado.

Si bien es teóricamente posible, no se ha hecho. Fakeroot-ng asume ciertas suposiciones de "buen comportamiento" sobre el proceso que se está rastreando, y un proceso que rompa esas suposiciones puede, si no escapa totalmente, al menos eludir parte del entorno "falso" impuesto por fakeroot- ng. Como tal, se le advierte fuertemente contra el uso de fakeroot-ng como herramienta de seguridad. Los informes de errores que afirman que un proceso puede escapar deliberadamente (en lugar de inadvertidamente) el control de fake-root-ng se cerrará como "no es un error" o se marcará como de baja prioridad.

Es posible que esta política sea repensada en el futuro. Por el momento, sin embargo, has sido advertido.

Aún así, como puede leerlo, en fakeroot-ngsí mismo no está diseñado para este propósito.

(Por cierto, me pregunto por qué han elegido utilizar el seccompenfoque basado en Chromium en lugar de un enfoque ptracebasado en ...)

De las herramientas no mencionadas anteriormente, he señalado a Geordi por mí mismo, porque me gustó que el programa de control esté escrito en Haskell.

Herramientas de aislamiento basadas en ptrace conocidas:

seccomp

Una forma conocida de lograr el aislamiento es a través del enfoque de seccomp sandboxing utilizado en Google Chromium . Pero este enfoque supone que usted escribe un asistente que procesará algunos (los permitidos) del acceso al archivo "interceptado" y otras llamadas al sistema; y también, por supuesto, hacer un esfuerzo para "interceptar" las llamadas al sistema y redirigirlas al asistente (tal vez, incluso significaría reemplazar las llamadas al sistema interceptadas en el código del proceso controlado; por lo tanto, no suena para ser bastante simple; si está interesado, será mejor que lea los detalles en lugar de solo mi respuesta).

Más información relacionada (de Wikipedia):

(El último elemento parece ser interesante si uno está buscando una seccompsolución de base general fuera de Chromium. También hay una publicación de blog que vale la pena leer del autor de "seccomp-nurse": ¿ SECCOMP como una solución de Sandboxing?. )

La ilustración de este enfoque del proyecto "seccomp-nurse" :

                      ingrese la descripción de la imagen aquí

¿Una seccomp "flexible" posible en el futuro de Linux?

En 2009, también aparecían sugerencias para parchear el kernel de Linux para que haya más flexibilidad en el seccompmodo, de modo que "se puedan evitar muchas de las acrobacias que necesitamos actualmente". ("Acrobacias" se refiere a las complicaciones de escribir un ayudante que tiene que ejecutar muchas llamadas de sistema posiblemente inocentes en nombre del proceso encarcelado y de sustituir las llamadas de sistema posiblemente inocentes en el proceso encarcelado). Un artículo de LWN escribió a este punto:

Una sugerencia que surgió fue agregar un nuevo "modo" a seccomp. La API fue diseñada con la idea de que diferentes aplicaciones podrían tener diferentes requisitos de seguridad; incluye un valor de "modo" que especifica las restricciones que deben establecerse. Solo se ha implementado el modo original, pero ciertamente se pueden agregar otros. La creación de un nuevo modo que permitiera al proceso de inicio especificar qué llamadas al sistema se permitirían haría que la instalación sea más útil para situaciones como el entorno limitado de Chrome.

Adam Langley (también de Google) ha publicado un parche que hace exactamente eso. La nueva implementación del "modo 2" acepta una máscara de bits que describe qué llamadas del sistema son accesibles. Si uno de ellos es prctl (), entonces el código de espacio aislado puede restringir aún más sus propias llamadas al sistema (pero no puede restaurar el acceso a las llamadas del sistema que han sido denegadas). En total, parece una solución razonable que podría facilitar la vida de los desarrolladores de sandbox.

Dicho esto, es posible que este código nunca se fusione porque la discusión se ha trasladado a otras posibilidades.

Este "seccomp flexible" acercaría las posibilidades de Linux a proporcionar la función deseada en el sistema operativo, sin la necesidad de escribir ayudantes tan complicados.

(Una publicación de blog con básicamente el mismo contenido que esta respuesta: http://geofft.mit.edu/blog/sipb/33 .)

espacios de nombres ( unshare)

Aislar a través de espacios de nombres ( unsharesoluciones basadas ), no mencionados aquí, por ejemplo, compartir puntos de montaje (¿combinados con FUSE?) Podría ser parte de una solución de trabajo para que desee limitar el acceso al sistema de archivos de sus procesos no confiables.

Más sobre los espacios de nombres, ahora, ya que su implementación se ha completado (esta técnica de aislamiento también se conoce con el nombre de "Contenedores Linux" o "LXC" , ¿no es así?):

"Uno de los objetivos generales de los espacios de nombres es apoyar la implementación de contenedores, una herramienta para la virtualización ligera (así como para otros fines)" .

Incluso es posible crear un nuevo espacio de nombres de usuario, de modo que "un proceso pueda tener una ID de usuario normal sin privilegios fuera de un espacio de nombres de usuario y al mismo tiempo tener una ID de usuario 0 dentro del espacio de nombres. Esto significa que el proceso tiene todos los privilegios de root para operaciones dentro del espacio de nombres de usuario, pero no tiene privilegios para operaciones fuera del espacio de nombres ".

Para ver los comandos de trabajo reales para hacer esto, vea las respuestas en:

y programación / compilación especial de espacio de usuario

Pero bueno, por supuesto, las garantías de "cárcel" deseadas son implementables mediante la programación en el espacio del usuario ( sin soporte adicional para esta función desde el sistema operativo ; quizás es por eso que esta función no se ha incluido en primer lugar en el diseño de sistemas operativos) ); con más o menos complicaciones

El mencionado ptrace- o seccompcaja de arena basado puede ser visto como algunas variantes de la aplicación de las garantías por escrito una caja de arena-helper que controlar sus otros procesos, que serían tratados como "cajas negras", arbitraria programas Unix.

Otro enfoque podría ser usar técnicas de programación que puedan preocuparse por los efectos que deben ser rechazados. (Debes ser tú quien escribe los programas; ya no son cajas negras). Por mencionar uno, usar un lenguaje de programación puro (que te obligaría a programar sin efectos secundarios) como Haskell simplemente hará que todos los efectos de programa explícito, por lo que el programador puede asegurarse fácilmente de que no habrá efectos no permitidos.

Supongo que hay instalaciones de sandboxing disponibles para aquellos que programan en algún otro lenguaje, por ejemplo, Java.


Algunas páginas que acumulan información sobre este tema también fueron señaladas en las respuestas allí:

imz - Ivan Zakharyaschev
fuente
Roboless GoboLinux podría ser una opción también ...
Tobias Kienzler
@tobias Pero, ¿Robolless Gobolinux garantiza que un programa escrito por un usuario no accederá al entorno exterior? ..
imz - Ivan Zakharyaschev
1
En realidad no, estaba de alguna manera bajo la idea errónea de que también le permitiría a uno convertirse en un usuario raíz "local" que luego simplemente podría crear usuarios virtuales para dicho proceso, aunque podría ser posible usarlo chroot, pero eso probablemente todavía requeriría privilegios de raíz real ...
Tobias Kienzler
8

Esta es una limitación fundamental del modelo de permisos de Unix: solo la raíz puede delegar.

No necesita ser root para ejecutar una máquina virtual (no es cierto para todas las tecnologías VM), pero esta es una solución pesada.

Linux en modo de usuario es una solución de virtualización de Linux en Linux relativamente liviana. No es tan fácil de configurar; tendrá que llenar una partición raíz (en un directorio) con, al menos, el mínimo necesario para el arranque (unos archivos en /etc, /sbin/inity sus dependencias, un programa de inicio de sesión, una concha y utilidades).

Gilles 'SO- deja de ser malvado'
fuente
1

Supongo que puedes tener suerte LD_PRELOADpara interceptar el acceso a ciertos archivos, pero esto puede ser realmente complicado.

alex
fuente
El sandboxing seccomp de Google Chromium hace una cosa más confiable: la intercepción de syscall, efectivamente. - unix.stackexchange.com/questions/6433/…
imz - Ivan Zakharyaschev
La diferencia entre tratar de interceptar algo y sanboxing (como en el caso de Chromium) es la garantía del aislamiento.
imz - Ivan Zakharyaschev
1
La intercepción a través de LD_PRELOADno se puede confiar (se puede eludir), pero la intercepción a través de septrace puede.
imz - Ivan Zakharyaschev
1
Aquí se presenta un ejemplo simple < joey.kitenet.net/blog/entry/fakechroot_warning_label > que muestra que LD_PRELOADno se puede confiar en las soluciones basadas como medida de seguridad.
imz - Ivan Zakharyaschev
0

De la lista completa, simplemente agregaría:

  • fakeroot (de debian package maintener): tiene como objetivo construir un paquete con herramientas "amigables". Esto no es un aislamiento completo, pero ayuda a construir paquetes con diferentes usuarios y dispositivos falsos y otros pseudoarchivos especiales.

  • fakechroot (que usa fakeroot). Este programa tiene muchos errores. Por ejemplo, "/ etc / hosts" está codificado en glibc: no puede cambiarlo a través de esta herramienta.

  • qemu: necesita compilar un kernel de Linux, pero el resultado es muy rápido, y esta es una máquina "falsa" (es decir, virtual) con privilegios de root reales. Puede construir y montar cualquier imagen de arranque.

Vouze
fuente
0

Firejail es una buena herramienta para encarcelar cualquier proceso, con o sin acceso a la raíz con muchas opciones y muy flexible:

Anyone_ph
fuente
2
Un poco más de detalle sobre cómo usar firejail sería bienvenido. Después de que ese enlace se apaga, el contenido de la información de sus respuestas se reducirá solo al nombre de las utilidades. (incluya aquí si está disponible paquetes en distribuciones, cómo usarlo, etc.).
Anthon