run0, el remplazo transparente a sudo en systemd
El desarrollo de la próxima versión de systemd 256 está en curso y actualmente se encuentra cerca del 80% y uno de los cambios candidatos a ser presentados en este lanzamiento viene la mano del mismo creador de systemd «Lennart Pottering» quien, mediante una publicación en mastodon, dio a conocer la introduccion una nueva utilidad llamada «run0».
Esta herramienta se presenta como un reemplazo más seguro de sudo y funciona como un complemento del comando systemd-run. La ventaja clave es que elimina la necesidad de utilizar un archivo ejecutable con el indicador SUID, lo cual puede ser riesgoso. Se menciona que run0 está diseñado para ejecutar procesos con los identificadores de otros usuarios de forma más segura.
Poettering argumenta que la introduccion de un sustituto de sudo, se debe a que el problema central de sudo radica en su naturaleza SUID, lo que potencialmente compromete la seguridad. En respuesta a esto, a partir de systemd 256 se busca operar con privilegios de manera independiente de la intervención de códigos no privilegiados. El uso del indicador SUID en sudo para cambiar el identificador conlleva riesgos adicionales debido a que el proceso SUID hereda un contexto de ejecución que incluye muchas propiedades controladas por un usuario sin privilegios.
Los procesos SUID son conceptos extraños: son invocados por código sin privilegios y heredan el contexto de ejecución previsto y controlado por código sin privilegios. Por contexto de ejecución me refiero a la gran cantidad de propiedades que tiene un proceso en Linux hoy en día, desde variables de entorno, propiedades de programación de procesos, asignaciones de cgroup, contextos de seguridad, descriptores de archivos pasados, etc., etc.
Estas propiedades pueden incluir variables de entorno, descriptores de archivos, opciones del programador y enlaces de grupos. A pesar de que algunas de estas propiedades son automáticamente eliminadas por el kernel para procesos SUID, y otras son eliminadas por la aplicación misma, aún se encuentran vulnerabilidades en programas SUID complejos como sudo debido a un manejo descuidado de datos externos influenciados por usuarios sin privilegios.
En contraste, run0 no utiliza SUID y en su lugar, solicita al administrador del sistema que inicie un shell o proceso con el ID de usuario específico, posterior a ello crea un nuevo pseudoterminal (PTY) y maneja la transferencia de datos entre este y el terminal actual (TTY). Este comportamiento recuerda más a la ejecución mediante ssh que al sudo tradicional. El proceso privilegiado se ejecuta en un contexto aislado generado por el proceso PID 1, en lugar del proceso del usuario, lo que significa que no hereda las propiedades del entorno del usuario, excepto por la variable de entorno $TERM que se reenvía. Además, el reenvío se controla a través de una lista de propiedades explícitamente permitidas, siguiendo un enfoque de lista blanca en lugar de una lista negra.
Polkit se encarga de autorizar y determinar las capacidades del usuario en run0, mientras que el clásico lenguaje de reglas (/etc/sudoers) utilizado por sudo no es compatible con esta herramienta. La funcionalidad para ejecutar programas con otros privilegios está integrada en systemd-run, y el comando run0 se crea como un enlace simbólico a systemd-run, lo que proporciona una interfaz de línea de comando similar a sudo cuando se utiliza.
Pero ya basta de toda esa charla sobre seguridad. La herramienta también es mucho más divertida de usar que sudo. Por ejemplo, por defecto teñirá el fondo de tu terminal en un tono rojizo mientras estés operando con privilegios elevados. Se supone que esto actúa como un recordatorio amistoso de que aún no ha renunciado a los privilegios y marca la salida de todos los comandos que se ejecutaron con los privilegios adecuados
Una característica adicional de run0 es la indicación visual de que se está trabajando con privilegios elevados. Esto se logra configurando un fondo rojizo en la terminal y agregando un punto rojo al título de la ventana. Después de finalizar la ejecución con privilegios elevados, el punto desaparece y el fondo vuelve a la normalidad. Además, run0 admite todas las opciones de "systemd-run"
, como el parámetro "--property"
, que permite establecer configuraciones arbitrarias para los servicios systemd, como por ejemplo «CPUWeight=200 MemoryMax=2G IPAccounting=yes
«.
Si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.