Utilizando "sudo" en Debian o como jugar a ser Dios

De todos es sabido, y espero que aún más entre los lectores de esta pequeña gota de agua, insignificante, en el océano de Internet, que trabajar con privilegios de administrador (terminología Windows) o superusuario (terminología Unix) en nuestro sistema durante el día a día está totalmente desaconsejado. Como otras muchas veces, Unix se adelantó a Windows (hoy en día esta ventaja ya no es tal, Windows también lo resuelve perfectamente) en esta separación de roles y, de hecho, desde el mismo momento de la instalación de un sistema Unix se obligaba al usuario que lo estaba instalando a:
1.- Elegir la contraseña de root. "root" siempre es el usuario con máximos privilegios: puede instalar y desinstalar aplicaciones, puede modificar/borrar ficheros del sistema... puede ver los buzones de correo de otros usuarios, e incluso puede borrar archivos y "cuentas" completas de otros usuarios (de hecho, es él quien las crea). Por eso, en el argot de los que trasteamos con los sistemas, cuando adoptamos el rol de root solemos describirlo como "me voy a convertir en Dios", porque es omnipoderoso.
2. A elegir una cuenta de usuario "normal", sin privilegios, que sólo puede utilizar las aplicaciones instaladas por root, no puede ni instalar ni desinstalar, ni modificar partes críticas, clave, del sistema, ni ver los ficheros "confidenciales" de otros usuarios (siempre que los permisos estén bien puestos), etc.

Pero es más, y este es el verdadero quid de la cuestión: desde el inicio, desde el primer "login" a la máquina, el usuario con el que se trabaja (esto es flexible según la distribución, pero hay algunas que lo obligan) es el usuario normal. Y todo el mundo que utilizamos Unix o GNU/Linux en nuestro día a día así lo hacemos.

Pero, ¿qué pasa si en un determinado momento necesitas hacer algo como root? Pues Unix también resolvió esto hace mucho tiempo. Cuando aún no había entornos gráficos los sistemas Unix ya eran multiusuario y multitarea. Habrías otra consola, como si tuvieras varias pantallas para trabajar sobre la misma pantalla física, y entrabas como root. Pero ni siquiera eso era/es necesario: puedes cambiar tu personalidad y pasar a ser root haciendo uso del comando "su", que te pide la contraseña de root y, si la sabes, te convierte en root:

[23:07:39(godo@surco)~]> su
Contraseña:
[23:21:41(root@surco)/home/godo]>

Y ya puedes estar trabajando un rato (no sólo un comando, sino muchos) como root. Y esto es importante para entender la principal diferencia con sudo. ¿Qué permite sudo? sudo permite ser root "sólo" para ejecutar un comando, cuando ese comando termina sigues siendo tú, ese usuario normal sin privilegios. ¿Y qué comando es el que te permite ejecutar sudo? Esta es la segunda clave del tema: sólo aquellos para los que te haya autorizado root a "echarle una mano". Imagínate que quieres montar una determinada partición de una máquina que suele estar desmontada porque en ella se albergan las copias de seguridad. El administrador de esa máquina, root, puede delegarte sólo esa tarea. Para ello en el fichero /etc/sudoers (que nunca se edita de forma directa sino haciendo uso de la utilidad "visudo") root puede escribir estas líneas:

godo ALL=(ALL) NOPASSWD: /bin/mount

(NOPASSWD es para que no te solicite password. Si no se pone, te la solicitaría).

Así, el usuario "godo" puede utilizar sudo "sólo" para ejecutar el comando "mount" como superusuario.

Si el usuario "godo" no estuviera "capacitado" para ejecutar un comando vía "sudo", y aún así lo intentara, "root" sería notificado vía mail, siendo este que sigue el "cuerpo" del correo:

surco : Jun 27 20:33:40 : godo : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/godo ; USER=root ; COMMAND=/usr/bin/apt-get update

¿Qué hacen distribuciones como Ubuntu, y yo suelo configurar en mi Debian? Pues Ubuntu directamente impide que root haga "login" en la máquina, es decir, siempre has de entrar en el sistema con el usuario sin privilegios, y si necesitas utilizar "cualquier comando" (sin límites) en modo "privilegiado" recurres a "sudo". De hecho, "root" en Ubuntu no tiene contraseña y nunca puedes acceder a ser "root" de forma "total" (no funciona "su" hasta que no le pones contraseña a "root" utilizando "sudo" ¡Curioso!). Para que un usuario normal tenga acceso a todos los comandos de "root" sin llegar a "serlo", es decir, vía "sudo", basta que siendo "root" se agregue al usuario "godo", en mi caso, al grupo de usuarios de "sudo" (recuerda que Unix hay grupos de usuarios que comparten "permisos"). Así es como yo lo hago en Debian, supongo que en Ubuntu se hace algo parecido durante la instalación del sistema.

Yo, para recordar esto cuando hago una instalación nueva, conservo unas líneas explicativas en el fichero "sudoers" de mi máquina habitual, que agregué con "visudo", claro. Y desde ahora las conservo aquí también y las comparto con vosotros. Son estas:

[23:30:49(godo@surco)~]> more /etc/sudoers
more: no se puede abrir /etc/sudoers: Permiso denegado
[23:30:57(godo@surco)~]> sudo more /etc/sudoers
[sudo] password for godo:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#

# ¡¡OJO!! MIRA UN POCO MAS ABAJO. BASTA CON:
# 1. AÑADIR EL USUARIO godo AL GRUPO sudo.
# 2. CERRAR LA SESIÓN Y VOLVER A ENTRAR.

#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
# Agregamos a Godo al grupo sudo con:
# [20:32:31(root@surco)/var/log]> adduser godo sudo
# Añadiendo al usuario `godo' al grupo `sudo' ...
# Añadiendo al usuario godo al grupo sudo
# Hecho.
# Otra forma de hacerlo es:
# [20:37:04(root@surco)/home/godo]> gpasswd -a godo sudo
# Añadiendo al usuario godo al grupo sudo

%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
[23:31:12(godo@surco)~]>

Observad al principio, cuando ejecuto el comando "more", como con mi usuario no tengo permisos para ver el fichero, pero sí utilizando "sudo".

Una última cosa, antes hablé de "su", y de que la contraseña que te solicita es la de "root", es decir, te tienes que saber la contraseña de "root", por tanto, cuando utilizas "su" te conviertes en root de "manera ancha". Sin embargo "sudo" no nace para hacer lo mismo que "su", aunque puede "casi llegar a hacerlo", sino que lo que quiere conseguir es un acceso a "hacer uso de privilegios" de forma más granular. Lo que te solicita por tanto no es la contraseña de "root", esta puede seguir siendo totalmente privada para "root" (¡root/Dios sólo hay uno!), sino la tuya, con el único fin de dejar "huella" en el sistema y que "root" sepa quién ha hecho qué. ¡Una verdadera maravilla del ingenio humano!

Espero que os haya gustado y que os acostumbréis a usarlo. Pero sobre todo, que os ayude a pensar.

Y el séptimo día descansó.

Clasificado en artículos de:

comment reply