Cómo editar el archivo sudoers

Introducción
La separación de privilegios es uno de los paradigmas de seguridad fundamentales implementados en Linux y sistemas operativos similares a Unix. Los usuarios comunes 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 distintas maneras.
En este artículo, analizaremos cómo obtener privilegios de root de forma correcta y segura , con un enfoque especial en la edición del /etc/sudoers
archivo.
Completaremos 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 supone que ya ha completado la configuración inicial del servidor que se describe aquí. Inicie sesión en su servidor como usuario normal, no como usuario root , y continúe con los pasos a continuación.
Nota: Este tutorial profundiza en la escalada de privilegios y el sudoers
archivo. Si solo desea agregar sudo
privilegios a un usuario, consulte nuestros tutoriales de inicio rápido Cómo crear un nuevo usuario habilitado para 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 simple y directo de 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 usando una función de consola fuera de banda en un servidor virtual), ingrese root
su nombre de usuario en el mensaje de inicio de sesión e ingrese la contraseña de root cuando se le solicite.
Si inicia sesión a través de SSH, especifique el usuario raíz 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 , ingrese la contraseña root cuando se le solicite.
Usando supara convertirse en root
Generalmente no se recomienda iniciar sesión directamente como root , porque es fácil comenzar a utilizar el sistema para tareas no administrativas, lo cual es peligroso.
La siguiente forma de obtener privilegios de superusuario le permite convertirse en el usuario root en cualquier momento, según lo necesite.
Podemos hacer esto invocando el su
comando que significa “usuario sustituto”. Para obtener privilegios de root , escriba:
- su
Se le solicitará la contraseña del usuario root , después de lo cual será llevado a una sesión de shell root .
Cuando haya terminado las tareas que requieren privilegios de root , regrese a su shell normal escribiendo:
- exit
Uso sudopara ejecutar comandos como root
La última forma de obtener privilegios de root que discutiremos es con el sudo
comando.
El sudo
comando permite ejecutar comandos puntuales con privilegios de root , sin necesidad de crear un nuevo shell. Se ejecuta de la siguiente manera:
- sudo command_to_execute
A diferencia de su
, el sudo
comando solicitará la contraseña del usuario actual , no la contraseña root .
Debido a sus implicaciones de seguridad, sudo
el acceso no se otorga a los usuarios de forma predeterminada y se debe configurar para que funcione correctamente. Consulta nuestros tutoriales de inicio rápido Cómo crear un nuevo usuario habilitado con Sudo para Ubuntu y CentOS para aprender a configurar un sudo
usuario habilitado con Sudo.
En la siguiente sección, discutiremos cómo modificar la sudo
configuración con mayor detalle.
¿Qué es Visudo?
El sudo
comando se configura a través de un archivo ubicado en /etc/sudoers
.
Advertencia: ¡Nunca edites este archivo con un editor de texto normal! ¡Utiliza siempre el visudo
comando en su lugar!
Debido a que una sintaxis incorrecta en el /etc/sudoers
archivo puede dejarlo con un sistema dañado donde es imposible obtener privilegios elevados, es importante usar el visudo
comando para editar el archivo.
El visudo
comando abre un editor de texto de forma normal, pero valida la sintaxis del archivo al guardarlo. Esto evita que errores de configuración bloqueen sudo
las operaciones, que pueden ser la única forma de obtener privilegios de root .
Tradicionalmente, visudo
el /etc/sudoers
archivo se abre con el vi
editor de texto. Sin embargo, Ubuntu lo ha configurado visudo
para utilizar el nano
editor de texto en su lugar.
Si desea volver a cambiarlo a vi
, emita 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:
Seleccione el número que corresponde con la elección que desea realizar.
En CentOS, puede cambiar este valor agregando la siguiente línea a su ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Obtenga el archivo para implementar los cambios:
- . ~/.bashrc
Después de haber configurado visudo
, ejecute el comando para acceder al /etc/sudoers
archivo:
- sudo visudo
Cómo modificar el archivo sudoers
Se le presentará el /etc/sudoers
archivo en el editor de texto seleccionado.
He copiado y pegado el archivo de Ubuntu 20.04, sin los comentarios. El /etc/sudoers
archivo de CentOS tiene muchas más líneas, algunas de las cuales no analizaremos en esta guía.
/etc/sudoers
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
Echemos un vistazo a lo que hacen estas líneas.
Líneas predeterminadas
La primera línea, Defaults env_reset
, restablece el entorno de la terminal para eliminar todas las variables de usuario. Se trata de una medida de seguridad que se utiliza para eliminar de la sudo
sesión las variables de entorno potencialmente dañinas.
La segunda línea, Defaults mail_badpass
, le indica al sistema que envíe avisos de sudo
intentos incorrectos de ingresar la contraseña al mailto
usuario configurado. De manera predeterminada, esta es la cuenta raíz .
La tercera línea, que comienza con Defaults secure_path=...
, especifica los PATH
lugares en el sistema de archivos donde el sistema operativo buscará aplicaciones que se utilizarán para sudo
las operaciones. Esto evita el uso de rutas de usuario que pueden ser perjudiciales.
Líneas de privilegios de usuario
La cuarta línea, que indica los privilegios del usuario rootsudo
, es diferente de las líneas anteriores. Veamos qué significan los distintos 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 usando sudo
, siempre que proporcione su contraseña.
Líneas de privilegio grupal
Las siguientes dos líneas son similares a las líneas de privilegios de usuario, pero especifican sudo
reglas para los grupos.
Los nombres que comienzan con %
indican nombres de grupos.
Aquí, vemos que el grupo admin puede ejecutar cualquier comando como cualquier usuario en cualquier host. De manera similar, el grupo sudo tiene los mismos privilegios, pero también puede ejecutar como cualquier grupo.
Línea /etc/sudoers.d incluida
La última línea podría parecer un comentario a primera vista:
/etc/sudoers
. . .#includedir /etc/sudoers.d
Comienza con un , que generalmente indica un comentario. Sin embargo, esta línea en realidad indica que también se obtendrán y aplicarán los archivos dentro del directorio .#
/etc/sudoers.d
Los archivos dentro de ese directorio siguen las mismas reglas que el /etc/sudoers
archivo en sí. Cualquier archivo que no termine en ~
y que no tenga una .
en él se leerá y se agregará a la sudo
configuración.
Esto está pensado principalmente para que las aplicaciones modifiquen sudo
los privilegios al instalarse. Poner todas las reglas asociadas dentro de un solo archivo en el /etc/sudoers.d
directorio puede facilitar la visualización de los privilegios asociados con las cuentas y revertir las credenciales fácilmente sin tener que intentar manipular el /etc/sudoers
archivo directamente.
Al igual que con el /etc/sudoers
archivo en sí, siempre debe editar los archivos dentro del /etc/sudoers.d
directorio con visudo
. La sintaxis para editar estos archivos sería:
- sudo visudo -f /etc/sudoers.d/file_to_edit
Cómo otorgarle privilegios sudo a un usuario
La operación más común que los usuarios desean realizar al administrar sudo
permisos es otorgarle a un nuevo usuario sudo
acceso general. Esto resulta útil si desea otorgarle 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 agregar el usuario en cuestión a ese grupo.
Por ejemplo, en Ubuntu 20.04, el sudo
grupo tiene privilegios de administrador completos. Podemos otorgarle a un usuario estos mismos privilegios agregándolo al grupo de la siguiente manera:
- sudo usermod -aG sudo username
El gpasswd
comando también se puede utilizar:
- sudo gpasswd -a username sudo
Ambos lograrán lo mismo.
En CentOS, normalmente es el wheel
grupo en lugar del sudo
grupo:
- sudo usermod -aG wheel username
O bien, utilizando gpasswd
:
- sudo gpasswd -a username wheel
En CentOS, si agregar el usuario al grupo no funciona de inmediato, es posible que tengas que editar el /etc/sudoers
archivo para descomentar el nombre del grupo:
- 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 reglas nuevas.
Cómo crear alias
El sudoers
archivo se puede organizar más fácilmente agrupando cosas con varios tipos de “alias”.
Por ejemplo, podemos crear tres grupos diferentes de usuarios, con membresía superpuesta:
/etc/sudoers
. . .User_AliasGROUPONE = abby, brent, carlUser_AliasGROUPTWO = brent, doris, eric,User_AliasGROUPTHREE = doris, felicia, grant. . .
Los nombres de los grupos deben comenzar con mayúscula. Podemos permitir que los miembros GROUPTWO
actualicen la apt
base de datos creando una regla como esta:
/etc/sudoers
. . .GROUPTWOALL = /usr/bin/apt-get update. . .
Si no especificamos un usuario/grupo para ejecutar, como se indicó anteriormente, sudo
el valor predeterminado es el usuario root .
Podemos permitir que los miembros GROUPTHREE
apaguen y reinicien la máquina creando un “alias de comando” y usándolo en una regla para GROUPTHREE
:
/etc/sudoers
. . .Cmnd_AliasPOWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restartGROUPTHREEALL = 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 que el usuario debe ejecutar el comando como:
/etc/sudoers
. . .Runas_AliasWEB = www-data, apacheGROUPONEALL = (WEB) ALL. . .
Esto permitirá que cualquier persona que sea miembro de GROUPONE
ejecute comandos como www-data
usuario o como apache
usuario.
Simplemente tenga en cuenta que las reglas posteriores prevalecerán sobre las reglas anteriores cuando haya un conflicto entre ambas.
Cómo bloquear las reglas
Hay varias formas de lograr un mayor control sobre cómo sudo
reacciona ante una llamada.
El updatedb
comando asociado al mlocate
paquete es relativamente inofensivo en un sistema monousuario. Si queremos permitir que los usuarios lo ejecuten con privilegios de root sin necesidad de escribir una contraseña, podemos crear una regla como esta:
/etc/sudoers
. . .GROUPONEALL = NOPASSWD: /usr/bin/updatedb. . .
NOPASSWD
es una “etiqueta” que significa que no se solicitará ninguna contraseña. Tiene un comando complementario llamado PASSWD
, que es el comportamiento predeterminado. Una etiqueta es relevante para el resto de la regla a menos que su etiqueta “gemela” la anule más adelante.
Por ejemplo, podemos tener una línea como esta:
/etc/sudoers
. . .GROUPTWOALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill. . .
Otra etiqueta útil es NOEXEC
, que puede usarse para evitar algunos comportamientos peligrosos en ciertos programas.
Por ejemplo, algunos programas, como less
, pueden generar otros comandos escribiendo esto desde su interfaz:
!command_to_run
Básicamente, esto 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:
/etc/sudoers
. . .usernameALL = NOEXEC: /usr/bin/less. . .
Información miscelánea
Hay algunos datos más que pueden resultar útiles a la hora de tratar con sudo
.
Si especificó un usuario o grupo para “ejecutar como” en el archivo de configuración, puede ejecutar comandos como esos usuarios utilizando los indicadores -u
y -g
, respectivamente:
- sudo -u run_as_user command
- sudo -g run_as_group command
Para mayor comodidad, de forma predeterminada, sudo
se guardarán los datos de autenticación durante un tiempo determinado en una terminal. Esto significa que no tendrá que volver a escribir su contraseña hasta que se agote el tiempo.
Por motivos de seguridad, si desea borrar este temporizador cuando haya terminado de ejecutar comandos administrativos, puede ejecutar:
- sudo -k
Si, por el contrario, deseas “preparar” el sudo
comando para que no se te solicite más tarde, o para renovar tu sudo
contrato de arrendamiento, siempre puedes escribir:
- sudo -v
Se le solicitará su contraseña, que se almacenará en caché para sudo
usos posteriores hasta que sudo
expire el período de tiempo.
Si simplemente se pregunta qué tipo de privilegios están definidos para su nombre de usuario, puede escribir:
- sudo -l
Esto mostrará todas las reglas del /etc/sudoers
archivo que se aplican a su usuario. Esto le dará una buena idea de lo que podrá o no podrá hacer como sudo
usuario.
Hay muchas ocasiones en las que ejecutarás un comando y fallará porque olvidaste anteponerlo con sudo
. Para evitar tener que volver a escribir el comando, puedes aprovechar una función de bash que significa “repetir el último comando”:
- sudo !!
El doble signo de exclamación repetirá el último comando. Lo hemos precedido con sudo
para cambiar rápidamente el comando sin privilegios a un comando privilegiado.
Para divertirte un poco, puedes agregar la siguiente línea a tu /etc/sudoers
archivo con visudo
:
- sudo visudo
/etc/sudoers
. . .Defaultsinsults. . .
Esto hará sudo
que se devuelva un insulto tonto cuando un usuario escriba una contraseña incorrecta para sudo
. Podemos usar sudo -k
para borrar la sudo
contraseña anterior almacenada en caché para probarlo:
- sudo -k
- sudo ls
Output[sudo] 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?[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 sudoers
archivo, y una comprensión de los distintos métodos que puede utilizar para obtener privilegios de root .
Remember, super-user privileges are not given to regular users for a reason. It is essential that you understand what each command does that you execute with root privileges. Do not take the responsibility lightly. Learn the best way to use these tools for your use-case, and lock down any functionality that is not needed.
Deja una respuesta