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.sudoers
. Si solo desea agregar privilegios de sudo
a un usuario, consulte nuestros tutoriales de inicio rápido sobre
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:
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:
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:
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:
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:
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 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
:
Carga el archivo para implementar los cambios:
Después de haber configurado visudo
, ejecuta el comando para acceder al archivo /etc/sudoers
:
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.
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:
. . .
#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:
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:
El comando gpasswd
también se puede utilizar:
Ambos lograrán lo mismo.
En CentOS, generalmente es el grupo wheel
en lugar del grupo sudo
:
O, utilizando gpasswd
:
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:
. . .
%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:
. . .
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:
. . .
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
:
. . .
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:
. . .
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:
. . .
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:
. . .
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:
. . .
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:
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:
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:
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:
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”:
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
:
. . .
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:
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