sudo-su-terminal.png

De vez en cuando veo personas que copian comandos en línea para obtener privilegios elevados escribiendo sudo su.

Ahora, aunque funcione para el propósito previsto, probablemente puedas hacer algo mejor.



Bajo el Capó

Cuando ejecutas sudo su estás encadenando 2 comandos de escalada de privilegios:

  • sudo ejecuta un comando como otro usuario (root por defecto). Verifica el archivo de configuración /etc/sudoers para comprobar si el usuario que ejecuta el comando tiene permisos para hacerlo, registra la acción de sudo realizada, y solicita la contraseña del usuario (si está configurado con los valores predeterminados).
  • su cambia a otro usuario (root por defecto). Requiere la contraseña del usuario objetivo (contraseña de root) e inicia una nueva sesión de shell como este usuario.

Con sudo su estás usando sudo para ejecutar el comando su con privilegios de root, que luego inicia un shell con privilegios de root, lo cual es redundante.

Ahora, si necesitas ejecutar muchos comandos con privilegios seguidos, usar sudo su puede ser tentador (nadie quiere escribir sudo para cada comando), pero en su lugar, puedes usar sudo -i, que es mucho mejor.



El Problema con sudo su

Registro de Auditoría Limitado

sudo su (y sudo -i) comparten la misma limitación de registro: sudo solo registra la invocación del shell de root, no los comandos individuales que ejecutas dentro de él.

# Esto se registra:
sudo -i

# Estos NO se registran por sudo:
apt update
rm -rf /important/data
systemctl restart nginx

Por esto se prefiere sudo <comando> cuando sea posible, ya que cada comando individual obtiene su propia entrada en el registro de auditoría.

En el futuro, si estuvieras usando sudo su y algo sucediera, no tendrás idea de qué pasó dentro de esta sesión de shell de root. Cada comando ejecutado en ese shell su es invisible para el registro de sudo.


Caos de Variables de Entorno

su por sí solo no reinicia completamente el entorno de tu shell, cambia algunas variables de entorno (HOME, USER, SHELL, LOGNAME) pero preserva otras de tu usuario original (como PATH, que aún puede apuntar al PATH de tu usuario actual).

Este entorno mezclado puede causar comportamiento inesperado en scripts.

Manejo de Variables de Entorno:

  • su - preserva el entorno del usuario (puede causar problemas)
  • su - - proporciona un entorno de inicio de sesión de root limpio
  • sudo su - entorno mezclado (depende de la configuración de sudo)
  • sudo -i - entorno de inicio de sesión de root limpio. Usar sudo -i asegura un comportamiento de entorno consistente y predecible.

Es Redundante

sudo ya te da privilegios elevados de forma segura, ¿por qué complicar las cosas y añadir redundancia?



Usa sudo -i en su Lugar

Si necesitas un shell de root persistente para múltiples comandos, usa sudo -i.

La opción -i (o --login) inicia un shell de inicio de sesión como root con un entorno limpio.


Beneficios sobre sudo su

  • Entorno Limpio: Obtienes el entorno de inicio de sesión completo de root ($PATH, $HOME=/root, variables de entorno) como si hubieras iniciado sesión directamente como root.
  • Más Simple: Un comando en lugar de encadenar 2 comandos de escalada de privilegios.
  • Intención Más Clara: Solicita más obviamente un shell de inicio de sesión de root.
  • Usa Tu Contraseña: Autenticado vía sudo (tu contraseña), no la contraseña de root.
  • Respeta las Políticas de sudo: Acceso controlado por la configuración de /etc/sudoers.

Qué se Registra

sudo -i registra la invocación del shell de root, pero NO los comandos individuales que ejecutas dentro de ese shell:

# Registrado por sudo
Nov 20 10:23:45 hostname sudo: username : TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/bin/bash -i

# NO registrado por sudo: cualquier cosa que escribas después de esto

Para una auditoría de comandos completa, puedes usar auditd, psacct, u otra solución de registro centralizado.



Jerarquía de Mejores Prácticas

  1. Preferido: sudo <comando> para comandos individuales
    • Cada comando se registra por separado
    • Registro de auditoría claro
  2. Cuando sea Necesario: sudo -i para shell de root persistente
    • Múltiples comandos seguidos que requieren root
    • Solución de problemas interactiva
    • Tareas de mantenimiento del sistema
  3. Evitar: sudo su
    • Escalada de privilegios redundante
    • Mismas limitaciones de registro que sudo -i


¿Por qué Usar sudo su?

Si estás en un sistema donde no tienes acceso a sudo pero conoces la contraseña de root, entonces sí, su - o su -l tiene sentido. Pero si estás recurriendo a sudo su, ya tienes sudo configurado, ¿verdad? Úsalo correctamente hermano.

En resumen, deja de usar sudo su. Usa sudo -i cuando necesites un shell de root. Mejor aún, usa sudo con comandos individuales.