Cómo Editar el Archivo Sudoers

Introducción

La separación de privilegios es uno de los paradigmas de seguridad fundamentales implementados en los sistemas operativos Linux y tipo Unix. Los usuarios regulares operan con privilegios limitados para reducir el alcance de su influencia a su propio entorno, y no al sistema operativo en general.

A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users. Users can execute commands with super-user or root privileges in a number of different ways.

En este artículo, discutiremos cómo obtener correctamente y de forma segura los privilegios de root, con un enfoque especial en la edición del archivo /etc/sudoers.

Realizaremos estos pasos en un servidor Ubuntu 20.04, pero la mayoría de las distribuciones de Linux modernas como Debian y CentOS deberían funcionar de manera similar.

Esta guía asume que ya ha completado la configuración inicial del servidor discutida aquí. Inicie sesión en su servidor como usuario regular, no como root, y continúe a continuación.Nota: Este tutorial profundiza en la escalada de privilegios y en el archivo sudoers. Si solo desea agregar privilegios de sudo a un usuario, consulte nuestros tutoriales de inicio rápido sobre Cómo crear un nuevo usuario con privilegios de sudo para Ubuntu y CentOS.

Nota: Este tutorial profundiza en la escalada de privilegios y el archivo sudoers. Si solo desea agregar privilegios sudo a un usuario, consulte nuestros tutoriales rápidos de Cómo crear un nuevo usuario habilitado para sudo para Ubuntu y CentOS.

Cómo Obtener Privilegios de Root

Existen tres formas básicas de obtener privilegios root, que varían en su nivel de sofisticación.

Iniciar Sesión Como Root

El método más simple y directo de obtener privilegios root es iniciar sesión directamente en su servidor como el 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), ingrese root como su nombre de usuario en el aviso de inicio de sesión y escriba la contraseña root cuando se le solicite.

Si estás iniciando sesión a través de SSH, especifica el usuario root antes de la dirección IP o el nombre de dominio en tu cadena de conexión SSH:

  1. ssh root@server_domain_or_ip

Si no has configurado claves SSH para el usuario root, introduce la contraseña root cuando se te solicite.

Usando su para Convertirte en Root

Iniciar sesión directamente como root generalmente no se recomienda, porque es fácil comenzar a usar el sistema para tareas no administrativas, lo cual es peligroso.

La siguiente forma de obtener privilegios de superusuario te permite convertirte en el usuario root en cualquier momento, cuando lo necesites.

Podemos hacer esto invocando el comando su, que significa “usuario sustituto”. Para obtener privilegios root, escribe:

  1. su

Se te pedirá la contraseña del usuario root, después de lo cual, serás llevado a una sesión de shell root.

Cuando hayas terminado con las tareas que requieren privilegios root, regresa a tu shell normal escribiendo:

  1. exit

Usando sudo para Ejecutar Comandos como Root

La forma final de obtener privilegios root que discutiremos es con el comando sudo.

El comando sudo te permite ejecutar comandos puntuales con privilegios root, sin la necesidad de abrir una nueva shell. Se ejecuta de la siguiente manera:

  1. sudo command_to_execute

A diferencia de su, el comando sudo solicitará la contraseña del usuario actual, no la contraseña de root.

Debido a sus implicaciones de seguridad, el acceso a sudo no se otorga a los usuarios por defecto y debe configurarse antes de que funcione correctamente. Echa un vistazo a nuestros tutoriales rápidos de Cómo Crear un Nuevo Usuario Habilitado para Sudo para Ubuntu y CentOS para aprender cómo configurar un usuario habilitado para sudo.

En la siguiente sección, discutiremos cómo modificar la configuración de sudo con mayor detalle.

¿Qué es Visudo?

El comando sudo se configura a través de un archivo ubicado en /etc/sudoers.

Advertencia: ¡Nunca edites este archivo con un editor de texto normal! ¡Siempre utiliza el comando visudo en su lugar!

Debido a que una sintaxis incorrecta en el archivo /etc/sudoers puede dejarte 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 de costumbre, pero valida la sintaxis del archivo al guardarlo. Esto evita errores de configuración que bloqueen las operaciones de sudo, que pueden ser tu única manera de obtener privilegios de root.

Tradicionalmente, visudo abre el archivo /etc/sudoers con el editor de texto vi. Sin embargo, Ubuntu ha configurado visudo para utilizar el editor de texto nano en su lugar.

Si deseas cambiarlo de vuelta a vi, ejecuta el siguiente comando:

  1. sudo update-alternatives --config editor
Output
There 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 mode Press <enter> to keep the current choice[*], or type selection number:

Selecciona el número que corresponda con la opción que deseas realizar.

En CentOS, puedes cambiar este valor agregando la siguiente línea a tu ~/.bashrc:

  1. export EDITOR=`which name_of_editor`

Carga el archivo para implementar los cambios:

  1. . ~/.bashrc

Después de haber configurado visudo, ejecuta el comando para acceder al archivo /etc/sudoers:

  1. sudo visudo

Cómo Modificar el Archivo Sudoers

Se te presentará el archivo /etc/sudoers en tu editor de texto seleccionado.

I have copied and pasted the file from Ubuntu 20.04, with comments removed. The CentOS /etc/sudoers file has many more lines, some of which we will not discuss in this guide.

/etc/sudoers
Defaults        env_reset
Defaults        mail_badpass
Defaults        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

Echemos un vistazo a lo que hacen estas líneas.

Líneas predeterminadas

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 variables de entorno potencialmente dañinas de la sesión sudo.

La segunda línea, Defaults mail_badpass, le indica al sistema que envíe notificaciones de intentos de contraseña incorrectos de sudo al usuario mailto configurado. Por defecto, este es el root cuenta.

La tercera línea, que comienza con Defaults secure_path=..., especifica el PATH (los lugares en el sistema de archivos donde el sistema operativo buscará aplicaciones) que se utilizará para las operaciones sudo. Esto evita el uso de rutas de usuario que pueden ser dañinas.

Líneas de privilegios de usuario

La cuarta línea, que dicta los privilegios sudo del usuario root, es diferente de las líneas anteriores. Echemos un vistazo a lo que 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 privilegios de grupo

Las siguientes dos líneas son similares a las líneas de privilegios de usuario, pero especifican reglas de sudo para grupos.

Los nombres que comienzan con un % indican nombres de grupo.

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 también puede ejecutar como cualquier grupo.

Línea incluida /etc/sudoers.d

La última línea podría parecer un comentario a primera vista:

/etc/sudoers
. . .

#includedir /etc/sudoers.d

Comienza con un #, lo que generalmente indica un comentario. Sin embargo, esta línea en realidad indica que los archivos dentro del directorio /etc/sudoers.d también se cargarán y se aplicarán.

Los archivos dentro de ese directorio siguen las mismas reglas que el archivo /etc/sudoers en sí. Cualquier archivo que no termine en ~ y que no tenga un . en él será leído y añadido a la configuración de sudo.

Esto está principalmente destinado para aplicaciones que alteran los privilegios de sudo durante la instalación. Colocar todas las reglas asociadas en un solo archivo en el directorio /etc/sudoers.d puede facilitar ver qué privilegios están asociados con cuáles cuentas y revertir credenciales fácilmente sin tener que manipular directamente el archivo /etc/sudoers.

Al igual que con el archivo /etc/sudoers en sí, siempre debe editar los archivos dentro del directorio /etc/sudoers.d con visudo. La sintaxis para editar estos archivos sería:

  1. sudo visudo -f /etc/sudoers.d/file_to_edit

Cómo otorgar a un usuario privilegios de Sudo

La operación más común que los usuarios desean realizar al gestionar permisos de sudo es otorgar a un nuevo usuario acceso general a sudo. Esto es útil si desea otorgar 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 de Ubuntu en esta guía, es agregar realmente al usuario en cuestión a ese grupo.

Por ejemplo, en Ubuntu 20.04, el grupo sudo tiene privilegios de administrador completos. Podemos otorgar al usuario estos mismos privilegios agregando al usuario al grupo de la siguiente manera:

  1. sudo usermod -aG sudo username

El comando gpasswd también se puede utilizar:

  1. sudo gpasswd -a username sudo

Ambos lograrán lo mismo.

En CentOS, generalmente es el grupo wheel en lugar del grupo sudo:

  1. sudo usermod -aG wheel username

O, utilizando gpasswd:

  1. sudo gpasswd -a username wheel

En CentOS, si agregar el usuario al grupo no funciona de inmediato, es posible que tenga que editar el archivo /etc/sudoers para deshabilitar el nombre del grupo:

  1. sudo visudo
/etc/sudoers
. . .
%wheel ALL=(ALL) ALL
. . .

Cómo Configurar Reglas Personalizadas

Ahora que nos hemos familiarizado con la sintaxis general del archivo, creemos algunas nuevas reglas.

Cómo Crear Alias

El archivo sudoers puede organizarse de manera más fácil agrupando cosas con varios tipos de “alias”.

Por ejemplo, podemos crear tres grupos diferentes de usuarios, con membresía superpuesta:

/etc/sudoers
. . .
User_Alias		GROUPONE = abby, brent, carl
User_Alias		GROUPTWO = brent, doris, eric,
User_Alias		GROUPTHREE = doris, felicia, grant
. . .

Los nombres de grupo deben comenzar con una letra mayúscula. Luego podemos permitir que los miembros de GROUPTWO actualicen la base de datos apt creando una regla como esta:

/etc/sudoers
. . .
GROUPTWO	ALL = /usr/bin/apt-get update
. . .

Si no especificamos un usuario/grupo para ejecutar, como arriba, sudo por defecto es el usuario root.

Podemos permitir que los miembros de GROUPTHREE apaguen y reinicien la máquina creando un “alias de comando” y utilizando eso en una regla para GROUPTHREE:

/etc/sudoers
. . .
Cmnd_Alias		POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE	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 de “Ejecutar como”, que pueden reemplazar la parte de la regla que especifica el usuario para ejecutar el comando:

/etc/sudoers
. . .
Runas_Alias		WEB = www-data, apache
GROUPONE	ALL = (WEB) ALL
. . .

Esto permitirá que cualquiera que sea miembro de GROUPONE ejecute comandos como el usuario www-data o el usuario apache.

Solo ten en cuenta que las reglas posteriores anularán las anteriores cuando haya un conflicto entre las dos.

Cómo bloquear reglas

Hay varias formas en que puedes lograr un mayor control sobre cómo sudo reacciona a una llamada.

El comando updatedb asociado con el paquete mlocate es relativamente inofensivo en un sistema de un solo usuario. Si queremos permitir que los usuarios lo ejecuten con privilegios root sin tener que escribir una contraseña, podemos hacer una regla como esta:

/etc/sudoers
. . .
GROUPONE	ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWD es una “etiqueta” que significa que no se solicitará contraseña. Tiene un comando compañero llamado PASSWD, que es el comportamiento predeterminado. Una etiqueta es relevante para el resto de la regla a menos que sea anulado por su “gemelo” etiqueta más adelante en la línea.

Por ejemplo, podemos tener una línea como esta:

/etc/sudoers
. . .
GROUPTWO	ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

Otro tag útil es NOEXEC, que se puede utilizar para prevenir cierta conducta peligrosa 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 se está ejecutando less, lo cual puede ser bastante peligroso.

Para restringir esto, podríamos usar una línea como esta:

/etc/sudoers
. . .
username	ALL = NOEXEC: /usr/bin/less
. . .

Información Miscelánea

Hay algunas piezas más de información que pueden ser útiles al tratar con sudo.

Si especificaste un usuario o grupo para “ejecutar como” en el archivo de configuración, puedes ejecutar comandos como esos usuarios utilizando las banderas -u y -g, respectivamente:

  1. sudo -u run_as_user command
  2. sudo -g run_as_group command

Por conveniencia, por defecto, sudo guardará tus detalles de autenticación por un cierto período de tiempo en un terminal. Esto significa que no tendrás que volver a escribir tu contraseña hasta que ese temporizador se agote.

Por razones de seguridad, si deseas borrar este temporizador cuando hayas terminado de ejecutar comandos administrativos, puedes ejecutar:

  1. sudo -k

Si, por otro lado, deseas “preparar” el comando sudo para que no se te solicite más tarde, o renovar tu “arrendamiento” de sudo, siempre puedes escribir:

  1. sudo -v

Se le pedirá su contraseña, que se almacenará en caché para usos posteriores de sudo hasta que caduque el período de tiempo de sudo.

Si solo se pregunta qué tipo de privilegios están definidos para su nombre de usuario, puede escribir:

  1. sudo -l

Esto mostrará todas las reglas en el archivo /etc/sudoers que se aplican a su usuario. Esto le da una buena idea de lo que podrá o no podrá hacer con sudo como cualquier usuario.

Hay muchas veces en que ejecutará un comando y fallará porque olvidó prefijarlo con sudo. Para evitar tener que volver a escribir el comando, puede aprovechar una funcionalidad de bash que significa “repetir el último comando”:

  1. sudo !!

El doble signo de exclamación repetirá el último comando. Lo precedimos con sudo para cambiar rápidamente el comando sin privilegios a un comando con privilegios.

Para divertirse, puede agregar la siguiente línea a su archivo /etc/sudoers con visudo:

  1. sudo visudo
/etc/sudoers
. . .
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 contraseña de sudo almacenada previamente en caché para probarlo:

  1. sudo -k
  2. sudo ls
Output
[sudo] password for demo: # enter an incorrect password here to see the results Your mind just hasn't been the same since the electro-shock, has it? [sudo] password for demo: My mind is going. I can feel it.

Conclusión

Ahora debería tener una comprensión básica de cómo leer y modificar el archivo sudoers, y una idea de los diversos métodos que puede utilizar para obtener privilegios de root.

Recuerda, los privilegios de superusuario no se otorgan a usuarios regulares por una razón. Es esencial que comprendas qué hace cada comando que ejecutas con privilegios de root. No tomes la responsabilidad a la ligera. Aprende la mejor manera de usar estas herramientas para tu caso de uso y bloquea cualquier funcionalidad que no sea necesaria.

Source:
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file