← Terminal y Línea de Comandos en Linux Bloque 4 · Usuarios, grupos y permisos · Tema 19 de 43

Tema 19

Actuar como administrador: su y sudo

Desde el tema 2 anteponemos sudo a ciertos comandos, como una fórmula. Es hora de saber qué hace. Los permisos dividen el sistema en lo que un usuario puede tocar y lo que no, y hay tareas legítimas —instalar un programa, cambiar una configuración, crear una cuenta— que están del otro lado de esa línea. sudo es la puerta para cruzarla: breve, registrada, y por un comando cada vez. Entender cómo funciona es también entender por qué conviene cruzarla lo menos posible.

1. El privilegio justo

En el tema 16 conocimos a root, el usuario con UID 0, al que los permisos no se le aplican. Y vimos el principio que organiza todo el sistema:

El principio de mínimo privilegio establece que cada usuario y cada programa deben tener, en cada momento, solo los permisos necesarios para la tarea que están realizando.

Aplicado a las personas, lleva a separar dos clases de trabajo:

Trabajo de usuarioTrabajo de administración
EjemplosEditar documentos, programar, navegar, compilar, ejecutar scripts propios.Instalar programas, modificar /etc, crear usuarios, iniciar y detener servicios.
Afecta aEl directorio personal.Todo el sistema y todos sus usuarios.
FrecuenciaCasi todo el tiempo.De vez en cuando.
Identidad adecuadaUn usuario común.root, solo mientras dura la tarea.

La última fila es la idea del tema. No hace falta ser administrador todo el día para administrar a veces. Hace falta un mecanismo para tomar el privilegio cuando se lo necesita y soltarlo enseguida.

2. Por qué no se trabaja como root

Sería más cómodo iniciar sesión como root y olvidarse de los Permission denied. Todo lo que aprendimos en este bloque explica por qué no se hace:

Trabajando como root…Consecuencia
Los errores no tienen freno.Un rm -r con la ruta equivocada, que como usuario fallaría, se ejecuta. Los permisos eran la red de seguridad.
Todo programa que ejecutes es root.Un script descargado, un navegador, un editor con un complemento malicioso: cualquiera de ellos tiene el control total del equipo.
Los archivos que crees son de root.Después, tu usuario común no puede modificarlos.
No queda registro de quién hizo qué.Si tres personas comparten la cuenta, todo lo hizo «root».

La shell avisa con qué identidad se está trabajando, mediante el último carácter del indicador. Es una convención que vale en todos los sistemas, y que conviene tener incorporada:

IndicadorQuiénEn la documentación
ana@equipo:~$Un usuario común.Los comandos que empiezan con $ se ejecutan sin privilegios.
root@equipo:~#root.Los que empiezan con #, como administrador.

Un # al final del indicador es una señal de alerta: a partir de ahí, cada línea se lee dos veces.

3. Dos caminos: su y sudo

Hay dos herramientas para obtener privilegios desde una sesión común. Responden a dos modelos distintos de administración:

susudo
Qué haceAbre una shell como otro usuario.Ejecuta un comando como otro usuario.
Contraseña que pideLa del usuario de destino: la de root.La tuya.
Quién puede usarloQuien conozca esa contraseña.Quien figure en la configuración de sudo.
AlcanceTodo o nada.Configurable: todos los comandos, o solo algunos.
DuraciónHasta que se cierre la shell.Lo que dura el comando.
RegistroQue alguien se convirtió en root.Cada comando, con quién lo ejecutó.

El modelo de su es el más antiguo: existe una contraseña de root, y quienes administran la conocen. El de sudo prescinde de ese secreto compartido. Cada administrador usa su propia contraseña, y el sistema decide, por una lista, quién puede hacer qué.

Ubuntu adopta el segundo modelo de manera estricta: la cuenta root existe pero no tiene contraseña, de modo que nadie puede iniciar sesión con ella ni llegar a ella con su. Otras distribuciones, como Debian o Fedora, permiten elegir durante la instalación. Hoy sudo es lo habitual en casi todas.

4. su: convertirse en otro usuario

su, de substitute user, inicia una shell con la identidad de otra cuenta. Sin argumentos, esa cuenta es root. Hay que conocerlo aunque en Ubuntu se use poco, porque aparece en cualquier otro sistema y en mucha documentación:

ComandoEfecto
suUna shell de root, conservando el directorio y casi todo el entorno del usuario anterior.
su -Una shell de root como si acabara de iniciar sesión: su directorio personal, su PATH, su configuración.
su - luisLo mismo, como el usuario luis. Pide la contraseña de luis.
su -c "comando"Ejecuta un solo comando como root y vuelve.
exit, o Ctrl+DCierra esa shell y devuelve la identidad anterior.

La diferencia entre las dos primeras filas es un guion, y es importante. Sin él, se obtiene la identidad de root dentro del entorno de otro usuario: una mezcla que produce comportamientos extraños, como comandos de administración que no se encuentran porque el PATH no es el de root. La forma recomendable es siempre su -.

En Ubuntu, el intento termina así:

terminal, en Ubuntu
$ su -
Password:
su: Authentication failure

No hay contraseña que acertar, porque la cuenta no tiene ninguna. Como root no necesita contraseña para cambiar de usuario, su conserva un uso práctico cuando ya se es administrador: sudo su - luis abre una sesión como otro usuario sin conocer su clave, para probar algo desde su punto de vista.

5. sudo: un comando con privilegios

sudo se antepone a un comando, y lo ejecuta con la identidad de root. El nombre se suele explicar como superuser do, «que lo haga el superusuario».

terminal
$ whoami
ana
$ sudo whoami
[sudo] password for ana:
root
$ whoami
ana

Las tres líneas cuentan todo. Antes y después, la shell es de ana. En el medio, un solo proceso corrió como root, y al terminar el privilegio desapareció con él.

El alcance de sudo: la shell de ana, con UID 1000, lanza mediante sudo un comando que corre como root, con UID 0; cuando el comando termina, el control vuelve a la shell de ana, que nunca dejó de ser de ana sudo termina La shell ana · UID 1000 indicador $ Un comando root · UID 0 sin restricciones La shell ana · UID 1000 indicador $
Con sudo, el privilegio dura lo que dura un comando. La shell no cambia de identidad.

Con esa identidad, el comando pasa por donde los permisos cerraban el paso. El archivo de contraseñas, que en el tema 16 no pudimos leer:

terminal
$ head -n 1 /etc/shadow
head: cannot open '/etc/shadow' for reading: Permission denied
$ sudo head -n 1 /etc/shadow
root:!:19835:0:99999:7:::

La línea confirma lo dicho en la sección 3. El segundo campo, donde debería estar el hash de la contraseña de root, contiene un signo de exclamación: la marca de una cuenta sin contraseña utilizable.

Esto mismo ocurrió cada vez que escribimos sudo apt install. Instalar un programa es escribir en /usr y en /etc, directorios de root, y hace falta su identidad.

6. La contraseña y su memoria

La contraseña que pide sudo es la del usuario que lo ejecuta, no la de root. No sirve para demostrar que se conoce un secreto de administración, sino para confirmar que quien está al teclado es realmente el dueño de la sesión, y no alguien que encontró la terminal abierta.

Mientras se escribe no aparece nada en la pantalla, ni asteriscos, como advertimos en el tema 2. Es deliberado: ni siquiera se revela cuántos caracteres tiene.

Para no pedirla en cada línea, sudo recuerda durante un tiempo que ya la verificó:

ComportamientoDetalle
Tras una contraseña correctaNo vuelve a pedirla durante 15 minutos, en esa misma terminal.
Cada uso de sudoReinicia la cuenta de los 15 minutos.
sudo -kOlvida la verificación: el próximo sudo pedirá la contraseña.
sudo -vRenueva la verificación sin ejecutar nada.
Tres intentos fallidossudo abandona, y el hecho queda registrado.

Esa memoria es cómoda y es también una ventana: durante esos minutos, cualquier cosa que se ejecute con sudo en esa terminal lo hará sin preguntar. Al dejar el equipo sin bloquear después de una tarea de administración, sudo -k la cierra.

En algunas distribuciones, la primera vez que un usuario ejecuta sudo recibe un aviso que se ha vuelto célebre, y que resume la actitud que la herramienta espera:

el aviso de sudo en su primer uso
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Respetar la privacidad de los demás, pensar antes de escribir, y recordar que un gran poder conlleva una gran responsabilidad.

7. Quién puede usar sudo

No cualquiera. sudo consulta una configuración que dice qué usuarios pueden ejecutar qué comandos. En Ubuntu la regla principal es simple y ya la conocemos: pueden usarlo los miembros del grupo sudo. El usuario creado durante la instalación pertenece a él, como mostró id.

Un usuario que no está autorizado recibe una negativa, y el intento se anota:

terminal, con un usuario sin privilegios
luis@equipo:~$ sudo apt update
[sudo] password for luis:
luis is not in the sudoers file.

El comando sudo -l, de list, muestra qué se le permite al usuario actual:

terminal (la primera parte puede variar)
$ sudo -l
Matching Defaults entries for ana on equipo:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User ana may run the following commands on equipo:
    (ALL : ALL) ALL

La línea resaltada es el permiso: cualquier comando, como cualquier usuario y grupo. Es lo que tiene un administrador. En un servidor bien configurado, la respuesta para otros usuarios puede ser una lista corta de comandos concretos, que es justamente lo que su no sabe hacer.

Las primeras líneas son ajustes de seguridad. Uno merece mención: secure_path hace que sudo use su propia lista de directorios para buscar comandos, y no el PATH del usuario. Evita que alguien coloque un programa falso llamado ls en un directorio propio y logre que se ejecute como root.

8. Las opciones de sudo

ComandoEfecto
sudo comandoEjecuta el comando como root.
sudo -u usuario comandoLo ejecuta como otro usuario.
sudo !!Repite el comando anterior con privilegios. Lo vimos en el tema 5.
sudo -lLista lo que el usuario puede ejecutar.
sudo -kOlvida la contraseña verificada.
sudo -vRenueva la verificación.
sudo -e archivo, o sudoedit archivoEdita un archivo del sistema de manera segura.
sudo -iAbre una shell de root. Sección siguiente.

La segunda fila muestra que sudo no es solo para llegar a root. Sirve para ejecutar algo con la identidad limitada de un servicio, y comprobar qué ve y qué puede hacer:

terminal
$ sudo -u www-data whoami
www-data
$ sudo -u www-data cat /home/ana/practica/notas.txt
cat: /home/ana/practica/notas.txt: Permission denied

El segundo comando verifica en la práctica lo que dedujimos con namei en el tema 17: otro usuario no llega al archivo, aunque tenga lectura para «otros», porque no puede atravesar /home/ana.

sudoedit es la forma correcta de editar configuración, mejor que sudo nano. Copia el archivo a un lugar temporal, abre el editor como tu usuario, y al guardar reemplaza el original con privilegios. El editor, con todos sus complementos, nunca corre como root. Usa el editor indicado en la variable EDITOR, de la que hablamos en el tema 13.

9. Una shell de root

Cuando una tarea de administración tiene muchos pasos, anteponer sudo a cada línea cansa, y hay operaciones que no se pueden hacer de otro modo, como veremos en la sección siguiente. Para esos casos se abre una shell completa con la identidad de root:

terminal
ana@equipo:~/practica$ sudo -i
root@equipo:~# pwd
/root
root@equipo:~# whoami
root
root@equipo:~# exit
logout
ana@equipo:~/practica$ 

El indicador cambió en sus tres partes: el usuario, el directorio —ahora ~ es /root— y, sobre todo, el carácter final, que pasó de $ a #. Hay varias maneras de llegar a una shell así, con diferencias en el entorno:

ComandoResultadoDirectorio inicial
sudo -iUna sesión de root completa, con su entorno, como si hubiera iniciado sesión. La forma recomendable./root
sudo -sUna shell de root que conserva parte del entorno del usuario.Donde se estaba
sudo su -Equivalente a sudo -i, por un camino más largo. Muy difundido./root
su -Lo mismo, con la contraseña de root. No disponible en Ubuntu./root
En una shell de root, las protecciones no están

Todo lo que se dijo en la sección 2 vale mientras el indicador termine en #. No hay Permission denied que detenga un error. Las reglas de uso son tres: entrar solo cuando la tarea lo justifica, no hacer allí nada que no sea esa tarea, y salir con exit en cuanto termina. Una shell de root olvidada en una pestaña es un accidente en espera.

10. Las trampas de sudo

sudo da privilegios al comando que recibe, y solo a él. Todo lo que la shell hace antes de ejecutarlo —y vimos en el tema 9 que es mucho— lo sigue haciendo como tu usuario. De ahí salen cuatro fallos que desconciertan, porque el comando lleva sudo y aun así es rechazado.

La redirección. Escribir en un archivo del sistema con > no funciona:

terminal
$ sudo echo "prueba" > /etc/prueba.conf
bash: /etc/prueba.conf: Permission denied

El mensaje empieza con bash: quien se queja es la shell. El archivo de destino lo abre ella, con la identidad de ana, antes de lanzar nada. Lo único que corre como root es echo, que no necesitaba privilegios. La solución habitual es dejar la escritura a un programa que sí corra con sudo. Ese programa es tee, que escribe en un archivo lo que recibe por una tubería:

la forma correcta (no hace falta ejecutarla)
echo "prueba" | sudo tee /etc/prueba.conf            # reemplaza el contenido
echo "prueba" | sudo tee -a /etc/prueba.conf         # agrega al final

Los comodines. Los expande la shell, antes de sudo, y no puede listar un directorio que le está vedado:

terminal
$ sudo ls /root/*
ls: cannot access '/root/*': No such file or directory

Como ana no puede leer /root, el patrón no coincide con nada y pasa literal, según la tercera regla de los comodines. ls, ya como root, busca un archivo llamado asterisco.

Los comandos internos. sudo ejecuta programas, y un comando interno de la shell no lo es:

terminal
$ sudo cd /root
sudo: cd: command not found

Aunque existiera, no serviría: cambiaría el directorio de un proceso que termina enseguida, y no el de tu shell. Es el argumento del tema 6 sobre por qué cd es interno.

Los alias. Son de tu shell, y sudo no los conoce: sudo ll responde command not found.

FallaPorque lo hace tu shellSolución
sudo comando > archivoLa redirección.comando | sudo tee archivo
sudo ls /root/*La expansión del comodín.sudo sh -c 'ls /root/*'
sudo cd directoriocd es interno.sudo -i, y trabajar desde allí.
sudo mi-aliasLos alias son de la shell.Escribir el comando completo.

La segunda solución es general: sudo sh -c '…' lanza como root una shell nueva, que interpreta todo lo que está entre comillas —comodines, redirecciones, tuberías— con privilegios. Las comillas simples son indispensables, para que tu shell no toque nada.

11. Todo queda anotado

Cada uso de sudo se registra: quién, cuándo, desde qué terminal, en qué directorio y con qué comando exacto. En Ubuntu, en /var/log/auth.log, que los miembros del grupo adm pueden leer:

terminal
$ grep COMMAND /var/log/auth.log | tail -n 1
2026-10-12T17:10:42.318274-03:00 equipo sudo:      ana : TTY=pts/0 ; PWD=/home/ana/practica ; USER=root ; COMMAND=/usr/bin/head -n 1 /etc/shadow

Este registro es una de las razones de fondo para preferir sudo a su, y a una shell de root prolongada:

Forma de trabajarQué queda en el registro
sudo comandoCada comando, con el usuario que lo ejecutó.
sudo -iQue ana abrió una shell de root. Lo que hizo dentro, no.
su -Que alguien que conocía la contraseña se convirtió en root.

No es una herramienta para vigilar a nadie, sino para reconstruir. Cuando algo deja de funcionar, la pregunta «¿qué se cambió ayer?» tiene respuesta. Y cuando hay varios administradores, la responsabilidad de cada acción es individual, cosa imposible con una contraseña compartida.

12. El archivo sudoers

La configuración de sudo está en /etc/sudoers, y en los archivos del directorio /etc/sudoers.d. En el tema 17 vimos que sus permisos son r--r-----, sin escritura ni para su dueño, como advertencia de que no se edita a mano. Las líneas que importan son pocas:

terminal (salida abreviada)
$ sudo cat /etc/sudoers
Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

root    ALL=(ALL:ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

@includedir /etc/sudoers.d
anatomía de una regla de sudoers
%sudo ALL=(ALL:ALL) ALL
│     │    │        │
│     │    │        └─ qué comandos: todos
│     │    └─ como qué usuario y grupo: cualquiera
│     └─ desde qué equipo: cualquiera
└─ quién: los miembros del grupo sudo (el % indica un grupo)

Esa línea es la que hace administradores a los miembros del grupo sudo. La potencia del formato está en que cada parte se puede restringir. Una regla como la siguiente permite a un usuario reiniciar un servicio, y nada más:

una regla limitada, en /etc/sudoers.d/luis
luis ALL=(root) /usr/bin/systemctl restart nginx

Es el principio de mínimo privilegio llevado a la práctica: quien necesita una sola operación de administración recibe exactamente esa.

sudoers se edita solo con visudo

Un error de sintaxis en este archivo deja a sudo sin funcionar. En Ubuntu, donde no hay otra manera de ser root, eso significa quedarse sin administrador, y la reparación exige arrancar el equipo en modo de recuperación. El comando sudo visudo abre el archivo en un editor y, al guardar, verifica la sintaxis: si hay un error, lo señala y no instala el cambio. Para un archivo propio: sudo visudo -f /etc/sudoers.d/nombre.

Dos apuntes más. Lo aconsejable es no tocar el archivo principal y agregar las reglas propias en /etc/sudoers.d, la convención de directorios .d que vimos en el tema 8. Y existe una etiqueta, NOPASSWD:, que exime de la contraseña. Es razonable para un comando preciso que debe ejecutar un script automático; aplicada a todos los comandos de un usuario, convierte cualquier programa que ese usuario ejecute en root sin pregunta alguna.

13. Usar sudo con criterio

Para cerrar, las costumbres que distinguen a quien usa sudo como una herramienta de quien lo usa como un conjuro:

CostumbrePor qué
Entender el error antes de anteponer sudo.Un Permission denied es información. A veces indica una ruta mal escrita, y sudo la ejecutaría sobre el lugar equivocado.
Leer la línea completa antes del Enter.Con sudo, los permisos ya no corrigen los errores de tipeo.
No usar sudo dentro del directorio personal.No hace falta, y deja archivos de root que luego estorban.
No ejecutar con sudo lo que no se entiende.Un comando copiado de Internet con sudo delante es darle el equipo a un desconocido.
Preferir sudo comando a una shell de root.Privilegio más breve, y cada acción registrada.
Editar con sudoedit.El editor no corre como root.
No ejecutar programas gráficos con sudo.Pueden dejar su configuración, en tu directorio personal, a nombre de root.

El cuarto punto tiene una forma particularmente riesgosa, que encontrarás en muchas instrucciones de instalación: descargar un script y pasarlo directamente a una shell con privilegios, en una sola línea. Es ejecutar como root un programa que nadie leyó. Lo prudente es descargarlo a un archivo, leerlo con less, y ejecutarlo después.

La referencia del tema:

ComandoQué hace
sudo comandoEjecuta un comando como root.
sudo -u usuario comandoLo ejecuta como otro usuario.
sudo -lMuestra qué se puede ejecutar.
sudo -kOlvida la contraseña verificada.
sudo -iAbre una shell de root; se sale con exit.
sudoedit archivoEdita un archivo del sistema.
comando | sudo tee archivoEscribe en un archivo del sistema.
sudo visudoEdita la configuración de sudo, validándola.
su - usuarioAbre una sesión como otro usuario, con su contraseña.

Con la capacidad de actuar como administrador, podemos hacer lo que hasta ahora solo consultamos. En el tema 20 creamos usuarios y grupos, les asignamos contraseñas y membresías, y los damos de baja.

14. Resumen

15. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué establece el principio de mínimo privilegio?

Que cada usuario y cada programa deben tener solo los permisos que necesitan para la tarea que están haciendo, y no más.

2. Da dos razones para no trabajar habitualmente como root.

Los errores no encuentran la barrera de los permisos, y cualquier programa que se ejecute tiene el control total del equipo. Además, los archivos creados quedan a nombre de root y no se registra quién hizo cada cosa.

3. ¿Qué indica que el indicador termine en #?

Que la shell es de root. Con un usuario común termina en $.

4. ¿Qué contraseña pide su y cuál sudo?

su, la del usuario en el que uno quiere convertirse, normalmente root. sudo, la del usuario que lo ejecuta.

5. ¿Qué diferencia hay entre su y su -?

Con el guion se inicia una sesión completa del otro usuario: su directorio personal, su PATH y su configuración. Sin él se conserva el entorno del usuario anterior.

6. En Ubuntu, su - responde «Authentication failure». ¿Por qué?

Porque la cuenta root no tiene contraseña. En Ubuntu se administra con sudo.

7. Después de sudo whoami, ¿qué muestra whoami?

El nombre del usuario común. Solo el comando lanzado con sudo corrió como root; la shell no cambió de identidad.

8. ¿Por qué sudo no pide la contraseña la segunda vez, y cómo se lo obliga a pedirla?

Porque recuerda la verificación durante 15 minutos en esa terminal. sudo -k la descarta.

9. ¿Qué determina, en Ubuntu, que un usuario pueda usar sudo?

Pertenecer al grupo sudo, al que una regla de /etc/sudoers autoriza a ejecutar cualquier comando.

10. ¿Qué hace sudo -u www-data ls /var/www?

Ejecuta ls con la identidad del usuario www-data, no con la de root.

11. ¿Por qué falla sudo echo "texto" > /etc/archivo, y cómo se hace?

Porque la redirección la realiza la shell del usuario, sin privilegios, antes de ejecutar sudo. Se hace con echo "texto" | sudo tee /etc/archivo.

12. ¿Por qué no funciona sudo cd /root?

Porque cd es un comando interno de la shell y no un programa que sudo pueda ejecutar. Para trabajar en ese directorio se abre una shell de root con sudo -i.

13. ¿Qué ventaja tiene sudoedit sobre sudo nano?

El editor corre con la identidad del usuario, sobre una copia temporal. Solo la operación de reemplazar el archivo se hace con privilegios.

14. ¿Qué queda registrado con sudo comando, y qué con sudo -i?

Con el primero, el comando exacto, el usuario, la terminal y el directorio. Con el segundo, solo que el usuario abrió una shell de root; lo que hizo dentro no.

15. ¿Por qué /etc/sudoers se edita únicamente con visudo?

Porque visudo comprueba la sintaxis antes de instalar el cambio. Un error en ese archivo inutiliza sudo, y en un sistema sin contraseña de root deja al equipo sin forma de administrarlo.

Para practicar

  1. Ejecuta id y sudo id, y compara las dos salidas.
  2. Ejecuta sudo -l e identifica la línea que te autoriza. ¿Qué directorios figuran en secure_path?
  3. Ejecuta sudo true, y luego sudo -k seguido de otro sudo true. ¿En cuál se pidió la contraseña?
  4. Abre una shell de root con sudo -i. Observa el indicador, ejecuta pwd, whoami y echo $HOME, y sal de inmediato. Repite con sudo -s y compara.
  5. Ejecuta sudo -u nobody whoami y sudo -u nobody ls ~. Explica el segundo resultado con namei -l ~.
  6. Reproduce el error de la sección 10 con sudo echo hola > /root/hola.txt. Luego hazlo bien con tee, comprueba con sudo cat, y borra el archivo con sudo rm /root/hola.txt.
  7. Compara sudo ls /root/* con sudo sh -c 'ls /root/*'.
  8. Busca en /var/log/auth.log los últimos cinco usos de sudo: grep COMMAND /var/log/auth.log | tail -n 5. Reconoce los comandos de los ejercicios anteriores.
  9. Lee la configuración con sudo cat /etc/sudoers y lista /etc/sudoers.d. Comprueba la sintaxis, sin modificar nada, con sudo visudo -c.
  10. Con sudo touch ~/practica/de-root.txt, crea un archivo como root en tu directorio. Mira su dueño, intenta agregarle una línea, y resuélvelo con chown. Bórralo al terminar.