Introducción
La separación de privilegios es uno de los paradigmas de seguridad fundamentales implementados en Linux y en los sistemas operativos tipo Unix. Los usuarios normales operan con privilegios limitados para reducir el alcance de su influencia a su propio entorno, y no al sistema operativo en general.
Un usuario especial, llamado root, tiene privilegios de superusuario. Se trata de una cuenta administrativa sin las restricciones que tienen los usuarios normales. Los usuarios pueden ejecutar comandos con privilegios de superusuario o root de diferentes maneras.
En este artículo, hablaremos de cómo obtener correctamente y de forma segura los privilegios de root, centrándonos especialmente en la edición del archivo /etc/sudoers
.
Estaremos completando estos pasos en un servidor Ubuntu 20.04, pero la mayoría de las distribuciones modernas de Linux, como Debian y CentOS, deberían funcionar de manera similar.
Esta guía asume que usted ya ha completado la configuración inicial del servidor discutida aquí. Inicie sesión en su servidor como usuario normal, no root, y continúe a continuación.
Nota: Este tutorial profundiza en la escalada de privilegios y en el archivo sudoers
. Si sólo quieres añadir sudo
privilegios a un usuario, echa un vistazo a nuestros tutoriales de inicio rápido Cómo crear un nuevo usuario con Sudo para Ubuntu y CentOS.
Cómo obtener privilegios de root
Hay tres formas básicas de obtener privilegios de root, que varían en su nivel de sofisticación.
Iniciar sesión como root
El método más sencillo y directo para obtener privilegios de root es iniciar sesión directamente en su servidor como usuario root.
Si está iniciando sesión en una máquina local (o utilizando una función de consola fuera de banda en un servidor virtual), introduzca root
como nombre de usuario en el indicador de inicio de sesión e introduzca la contraseña de root cuando se le pida.
Si va a iniciar sesión a través de SSH, especifique el usuario root antes de la dirección IP o el nombre de dominio en su cadena de conexión SSH:
- ssh root@server_domain_or_ip
Si no ha configurado claves SSH para el usuario root, introduzca la contraseña root cuando se le solicite.
Utilizar su para ser root
Entrar directamente como root no suele ser recomendable, porque es fácil empezar a utilizar el sistema para tareas no administrativas, lo cual es peligroso.
La siguiente forma de obtener privilegios de superusuario permite convertirse en usuario root en cualquier momento, según se necesite.
Podemos hacerlo invocando el comando su
, que significa «usuario sustituto». Para obtener privilegios de root, escribe:
- su
Se te pedirá la contraseña del usuario root, tras lo cual, entrarás en una sesión de shell de root.
Cuando haya terminado las tareas que requieren privilegios de root, vuelva a su shell normal escribiendo:
- exit
Utilizar sudo para ejecutar comandos como root
La última forma de obtener privilegios de root que vamos a discutir es con el comando sudo
.
El comando sudo
permite ejecutar comandos puntuales con privilegios de root, sin necesidad de generar un nuevo shell. Se ejecuta así:
- sudo command_to_execute
A diferencia de su
, el comando sudo
solicitará la contraseña del usuario actual, no la de root.
Debido a sus implicaciones de seguridad, sudo
el acceso no se concede a los usuarios por defecto, y debe ser configurado antes de que funcione correctamente. Echa un vistazo a nuestros tutoriales de inicio rápido de Cómo crear un nuevo usuario habilitado para Sudo en Ubuntu y CentOS para aprender a configurar un usuario habilitado para sudo
.
En la siguiente sección, hablaremos de cómo modificar la configuración de sudo
con más detalle.
¿Qué es Visudo?
El comando sudo
se configura a través de un archivo ubicado en /etc/sudoers
.
Atención: ¡Nunca edites este archivo con un editor de texto normal! Utilice siempre el comando visudo
.
Debido a que una sintaxis incorrecta en el archivo /etc/sudoers
puede dejarle con un sistema roto en el que es imposible obtener privilegios elevados, es importante utilizar el comando visudo
para editar el archivo.
El comando visudo
abre un editor de texto como el normal, pero valida la sintaxis del archivo al guardarlo. Esto evita que los errores de configuración bloqueen las operaciones de sudo
, que pueden ser su única forma de obtener privilegios de root.
Tradicionalmente, visudo
abre el archivo /etc/sudoers
con el editor de texto vi
. Ubuntu, sin embargo, ha configurado visudo
para utilizar el editor de texto nano
en su lugar.
Si quieres volver a cambiarlo por vi
, emite el siguiente comando:
- sudo update-alternatives --config editor
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status------------------------------------------------------------* 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/vim.basic 30 manual mode 4 /usr/bin/vim.tiny 10 manual modePress <enter> to keep the current choice, or type selection number:
Selecciona el número que se corresponda con la elección que quieras hacer.
En CentOS, puedes cambiar este valor añadiendo la siguiente línea a tu ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Fuente el archivo para implementar los cambios:
- . ~/.bashrc
Después de haber configurado visudo
, ejecuta el comando para acceder al archivo /etc/sudoers
:
- sudo visudo
Cómo modificar el archivo Sudoers
Se te presentará el archivo /etc/sudoers
en tu editor de texto seleccionado.
He copiado y pegado el archivo de Ubuntu 18.04, con los comentarios eliminados. El archivo de CentOS /etc/sudoers
tiene muchas más líneas, algunas de las cuales no discutiremos en esta guía.
Defaults env_resetDefaults mail_badpassDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"root ALL=(ALL:ALL) ALL%admin ALL=(ALL) ALL%sudo ALL=(ALL:ALL) ALL#includedir /etc/sudoers.d
Veamos qué hacen estas líneas.
Líneas por defecto
La primera línea, «Defaults env_reset», reinicia el entorno de la terminal para eliminar cualquier variable de usuario. Esta es una medida de seguridad utilizada para borrar las variables de entorno potencialmente dañinas de la sudo
sesión.
La segunda línea, Defaults mail_badpass
, le dice al sistema que envíe por correo avisos de intentos de contraseñas erróneas al usuario mailto
configurado. Por defecto, ésta es la cuenta de root.
La tercera línea, que comienza con «Defaults secure_path=…», especifica los PATH
(los lugares del sistema de archivos en los que el sistema operativo buscará las aplicaciones) que se utilizarán para las operaciones sudo
. Esto evita que se utilicen rutas de usuario que pueden ser perjudiciales.
Líneas de privilegios del usuario
La cuarta línea, que dicta los privilegios del usuario root sudo
, es diferente a las líneas anteriores. Veamos qué significan los diferentes campos:
-
root ALL=(ALL:ALL) ALL
El primer campo indica el nombre de usuario al que se aplicará la regla (root). -
root ALL=(ALL:ALL) ALL
El primer «ALL» indica que esta regla se aplica a todos los hosts. -
root ALL=(ALL:ALL) ALL
Este «ALL» indica que el usuario root puede ejecutar comandos como todos los usuarios. -
root ALL=(ALL:ALL) ALL
Este «ALL» indica que el usuario root puede ejecutar comandos como todos los grupos. -
root ALL=(ALL:ALL) ALL
El último «ALL» indica que estas reglas se aplican a todos los comandos.
Esto significa que nuestro usuario root puede ejecutar cualquier comando utilizando sudo
, siempre que proporcione su contraseña.
Líneas de privilegio de grupo
Las siguientes dos líneas son similares a las de privilegio de usuario, pero especifican sudo
reglas para los grupos.
Los nombres que comienzan con un %
indican nombres de grupos.
Aquí vemos que el grupo admin puede ejecutar cualquier comando como cualquier usuario en cualquier host. Del mismo modo, el grupo sudo tiene los mismos privilegios, pero puede ejecutar como cualquier grupo también.
Incluido /etc/sudoers.d Line
La última línea podría parecer un comentario a primera vista:
. . .#includedir /etc/sudoers.d
Empieza con un #
, que suele indicar un comentario. Sin embargo, esta línea en realidad indica que los archivos dentro del directorio /etc/sudoers.d
se obtendrán y aplicarán también.
Los archivos dentro de ese directorio siguen las mismas reglas que el propio archivo /etc/sudoers
. Cualquier archivo que no termine en ~
y que no tenga un .
en él será leído y anexado a la configuración sudo
.
Esto está pensado principalmente para que las aplicaciones alteren los privilegios de sudo
al instalarse. Poner todas las reglas asociadas dentro de un único archivo en el directorio /etc/sudoers.d
puede facilitar ver qué privilegios están asociados a qué cuentas y revertir las credenciales fácilmente sin tener que intentar manipular el archivo /etc/sudoers
directamente.
Al igual que con el propio archivo /etc/sudoers
, siempre hay que editar los archivos dentro del directorio /etc/sudoers.d
con visudo
. La sintaxis para editar estos archivos sería:
- sudo visudo -f /etc/sudoers.d/file_to_edit
Cómo dar privilegios Sudo a un usuario
La operación más común que los usuarios quieren realizar al gestionar los permisos sudo
es conceder a un nuevo usuario acceso general sudo
. Esto es útil si quieres dar a una cuenta acceso administrativo completo al sistema.
La forma más fácil de hacer esto en un sistema configurado con un grupo de administración de propósito general, como el sistema Ubuntu en esta guía, es en realidad añadir al usuario en cuestión a ese grupo.
Por ejemplo, en Ubuntu 20.04, el grupo sudo
tiene privilegios de administración completos. Podemos conceder a un usuario estos mismos privilegios añadiéndolo al grupo así:
- sudo usermod -aG sudo username
También se puede utilizar el comando gpasswd
:
- sudo gpasswd -a username sudo
Ambos conseguirán lo mismo.
En CentOS, esto suele ser el grupo wheel
en lugar del grupo sudo
:
- sudo usermod -aG wheel username
O bien, utilizando gpasswd
:
- sudo gpasswd -a username wheel
En CentOS, si añadir el usuario al grupo no funciona inmediatamente, puede que tengas que editar el archivo /etc/sudoers
para descomentar el nombre del grupo:
- sudo visudo
. . .%wheel ALL=(ALL) ALL. . .
Cómo configurar reglas personalizadas
Ahora que nos hemos familiarizado con la sintaxis general del archivo, vamos a crear algunas reglas nuevas.
Cómo crear alias
El archivo sudoers
puede organizarse más fácilmente agrupando cosas con varios tipos de «alias».
Por ejemplo, podemos crear tres grupos diferentes de usuarios, con membresía superpuesta:
. . .User_Alias GROUPONE = abby, brent, carlUser_Alias GROUPTWO = brent, doris, eric, User_Alias GROUPTHREE = doris, felicia, grant. . .
Los nombres de los grupos deben comenzar con una letra mayúscula. Entonces podemos permitir a los miembros de GROUPTWO
actualizar la base de datos apt
creando una regla como esta:
. . .GROUPTWO ALL = /usr/bin/apt-get update. . .
Si no especificamos un usuario/grupo para ejecutar como, como en el caso anterior, sudo
por defecto el usuario root.
Podemos permitir a los miembros de GROUPTHREE
apagar y reiniciar la máquina creando un «alias de comando» y usándolo en una regla para GROUPTHREE
:
. . .Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restartGROUPTHREE ALL = POWER. . .
Creamos un alias de comando llamado POWER
que contiene comandos para apagar y reiniciar la máquina. Luego permitimos que los miembros de GROUPTHREE
ejecuten estos comandos.
También podemos crear alias «Ejecutar como», que pueden reemplazar la parte de la regla que especifica el usuario para ejecutar el comando como:
. . .Runas_Alias WEB = www-data, apacheGROUPONE ALL = (WEB) ALL. . .
Esto permitirá a cualquiera que sea miembro de GROUPONE
ejecutar comandos como el usuario www-data
o el usuario apache
.
Sólo hay que tener en cuenta que las reglas posteriores anularán las reglas anteriores cuando haya un conflicto entre ambas.
Cómo bloquear las reglas
Hay varias formas de conseguir un mayor control sobre cómo sudo
reacciona a una llamada.
El comando updatedb
asociado al paquete mlocate
es relativamente inofensivo en un sistema monopuesto. Si queremos permitir que los usuarios lo ejecuten con privilegios de root sin tener que escribir una contraseña, podemos hacer una regla como esta:
. . .GROUPONE ALL = NOPASSWD: /usr/bin/updatedb. . .
NOPASSWD
es una «etiqueta» que significa que no se solicitará ninguna contraseña. Tiene un comando compañero llamado PASSWD
, que es el comportamiento por defecto. Una etiqueta es relevante para el resto de la regla a menos que sea anulada por su etiqueta «gemela» más adelante en la línea.
Por ejemplo, podemos tener una línea como esta:
. . .GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill. . .
Otra etiqueta útil es NOEXEC
, que se puede utilizar para prevenir algunos comportamientos peligrosos en ciertos programas.
Por ejemplo, algunos programas, como less
, pueden generar otros comandos escribiendo esto desde su interfaz:
!command_to_run
Esto básicamente ejecuta cualquier comando que el usuario le dé con los mismos permisos con los que less
se está ejecutando, lo que puede ser bastante peligroso.
Para restringir esto, podríamos usar una línea como esta:
. . .username ALL = NOEXEC: /usr/bin/less. . .
Información variada
Hay algunos datos más que pueden ser útiles cuando se trata de sudo
.
Si has especificado un usuario o grupo para «ejecutar como» en el archivo de configuración, puedes ejecutar los comandos como esos usuarios utilizando las banderas -u
y -g
, respectivamente:
- sudo -u run_as_user command
- sudo -g run_as_group command
Para mayor comodidad, por defecto, sudo
guardará tus datos de autenticación durante un tiempo determinado en un terminal. Esto significa que no tendrás que volver a escribir tu contraseña hasta que ese temporizador se agote.
Por motivos de seguridad, si deseas borrar este temporizador cuando termines de ejecutar comandos administrativos, puedes ejecutar:
- sudo -k
Si, por el contrario, quieres «cebar» el comando sudo
para que no se te pida más tarde, o para renovar tu sudo
alquiler, siempre puedes escribir:
- sudo -v
Se te pedirá tu contraseña, que se guardará en la caché para posteriores sudo
usos hasta que expire el sudo
plazo.
Si simplemente te preguntas qué tipo de privilegios están definidos para tu nombre de usuario, puedes escribir:
- sudo -l
Esto listará todas las reglas en el archivo /etc/sudoers
que se aplican a tu usuario. Esto le da una buena idea de lo que podrá o no podrá hacer con sudo
como cualquier usuario.
Hay muchas veces en las que ejecutará un comando y fallará porque se olvidó de precederlo con sudo
. Para evitar tener que volver a escribir el comando, puedes aprovechar una funcionalidad de bash que significa «repetir el último comando»:
- sudo !!
El doble signo de exclamación repetirá el último comando. Lo precedemos con sudo
para cambiar rápidamente el comando no privilegiado por un comando privilegiado.
Para divertirte un poco, puedes añadir la siguiente línea a tu archivo /etc/sudoers
con visudo
:
- sudo visudo
. . .Defaults insults. . .
Esto hará que sudo
devuelva un insulto tonto cuando un usuario escriba una contraseña incorrecta para sudo
. Podemos usar sudo -k
para borrar la anterior sudo
contraseña en caché para probarla:
- sudo -k
- sudo ls
Output password for demo: # enter an incorrect password here to see the resultsYour mind just hasn't been the same since the electro-shock, has it? password for demo: My mind is going. I can feel it.
Conclusión
Ahora deberías tener un conocimiento básico de cómo leer y modificar el archivo sudoers
, y un conocimiento de los distintos métodos que puedes utilizar para obtener privilegios de root.
Recuerda que los privilegios de superusuario no se dan a los usuarios normales por una razón. Es esencial que entiendas lo que hace cada comando que ejecutas con privilegios de root. No tome la responsabilidad a la ligera. Aprenda la mejor manera de utilizar estas herramientas para su caso de uso, y bloquee cualquier funcionalidad que no sea necesaria.