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 regulares operan con privilegios limitados para reducir el alcance de su influencia en su propio entorno, y no en el sistema operativo en general.
Un usuario especial, llamado root, tiene privilegios de superusuario. Esta es una cuenta administrativa sin las restricciones que tienen los usuarios normales. Los usuarios pueden ejecutar comandos con privilegios de superusuario o root de varias maneras.
En este artículo, explicaremos cómo obtener privilegios root de forma correcta y segura, con un enfoque especial en la edición del archivo /etc/sudoers
.
Completaremos estos pasos en un servidor de 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 usted ya ha completado la configuración inicial del servidor que se mencionó aquí. Inicie sesión en su servidor como usuario no root regular y continúe como se indica abajo.
Nota: Este tutorial profundiza sobre la escalada de privilegios y el archivo sudoers
. Si solo desea añadir privilegios sudo
a un usuario, consulte nuestros tutoriales de inicio rápido Cómo crear un nuevo usuario habilitado para sudo en Ubuntu y CentOS.
Existen tres formas básicas de obtener privilegios root, que varían en su nivel de sofisticación.
El método más sencillo y directo para obtener privilegios 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), introduzca root
como su nombre de usuario en mensaje de inicio de sesión e ingrese la contraseña root cuando se le solicite.
Si está iniciando 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 las claves SSH para el usuario root, ingrese la contraseña root cuando se le solicite.
su
para convertirse en rootIniciar sesión directamente como root normalmente no suele ser recomendable, ya que 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 usuario root en cualquier momento, cuando lo necesite.
Podemos hacerlo invocando el comando su
, que significa “usuario sustituto”. Para obtener privilegios root, escriba lo siguiente:
- su
Se le solicitará la contraseña del usuario root, después de lo cual, iniciará una sesión de shell root.
Cuando haya terminado las tareas que requieren privilegios root, vuelva a su shell normal escribiendo lo siguiente:
- exit
sudo
para ejecutar comandos como rootLa última forma de obtener privilegios root que explicaremos es con el comando sudo
.
El comando sudo
permite ejecutar comandos irrepetibles con privilegios root, sin necesidad de generar una shell nueva. Se ejecuta así:
- sudo command_to_execute
A diferencia de su
, el comando sudo
solicitará la contraseña del usuario actual, y no la contraseña root.
Debido a sus implicaciones de seguridad, no se concede acceso sudo
a los usuarios de manera predeterminada, y debe configurarse antes de que funcione correctamente. Consulte nuestros tutoriales de inicio rápido 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, explicaremos en mayor detalle cómo modificar la configuración sudo
.
El comando sudo
se configura a través de un archivo ubicado en /etc/sudoers
.
Advertencia: Nunca edite este archivo con un editor de texto normal. ¡Siempre utilice el comando visudo
en su lugar!
Dado que una sintaxis inadecuada en el archivo /etc/sudoers
puede generar un sistema fallido, 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 igual al normal, pero valida la sintaxis del archivo al guardarlo. Esto evita que los errores de configuración bloqueen las operaciones sudo
, que pueden ser su única forma de obtener privilegios 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 desea cambiarlo de nuevo 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 mode
Press <enter> to keep the current choice[*], or type selection number:
Seleccione el número que coincida con la elección que desea realizar.
En CentOS, puede cambiar este valor añadiendo la siguiente línea a su ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Obtenga el archivo para implementar los cambios:
- . ~/.bashrc
Después de configurar visudo
, ejecute el comando para acceder al archivo /etc/sudoers
:
- sudo visudo
El archivo /etc/sudoers
aparecerá en su editor de texto seleccionado.
He copiado y pegado el archivo de Ubuntu 18.04, con los comentarios eliminados. El archivo /etc/sudoers
de CentOS tiene muchas más líneas, algunas de las que no explicaremos en esta guía.
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
Veamos qué hacen estas líneas.
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 que se utiliza para eliminar las variables de entorno potencialmente dañinas de la sesión sudo
.
La segunda línea, Defaults mail_badpass
, indica al sistema que envíe notificaciones por correo de intentos de contraseñas erróneas de sudo
al usuario mailto
configurado. De manera predeterminada, esta es la cuenta root.
La tercera línea, que comienza con “Defaults secure_path=…”, especifica el PATH
(las ubicaciones del sistema de archivos en los que el sistema operativo buscará aplicaciones) que se utilizarán para las operaciones sudo
. Esto evita el uso de rutas de usuario que puedan ser perjudiciales.
La cuarta línea, que dicta los privilegios sudo
del usuario root, es diferente de 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 usando sudo
, siempre que proporcione su contraseña.
Las siguientes dos líneas son similares a las líneas de privilegios de usuario, pero especifican reglas sudo
para los grupos.
Los nombres que comienzan con un %
indican los nombres de grupo.
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 ejecutarse como cualquier grupo.
La última línea puede parecer un comentario a primera vista:
. . .
#includedir /etc/sudoers.d
**Comienza con un #
, que normalmente indica un comentario. Sin embargo, esta línea en realidad indica que los archivos dentro del directorio /etc/sudoers.d
también se consultarán y aplicarán.
Los archivos dentro de ese directorio siguen las mismas reglas que el archivo /etc/sudoers
. Cualquier archivo que no termine en ~
y que no tenga un .
se leerá y anexará a la configuración sudo
.
Esto está pensado principalmente para que las aplicaciones alteren los privilegios sudo
después de instalarse. Poner todas las reglas asociadas dentro de un solo archivo en el directorio /etc/sudoers.d
puede facilitar la tarea de ver qué privilegios están asociados con qué cuentas y revertir las credenciales fácilmente sin tener que manipular el archivo /etc/sudoers
directamente.
Al igual que con el archivo /etc/sudoers
, siempre debe editar los archivos dentro del directorio /etc/sudoers.d
con visudo
. La sintaxis para editar estos archivos sería la siguiente:
- sudo visudo -f /etc/sudoers.d/file_to_edit
La operación más común que los usuarios desean lograr al administrar los permisos sudo
es conceder a un nuevo usuario acceso sudo
general. Esto resulta útil si desea dar a una cuenta acceso administrativo completo al sistema.
La forma más sencilla de hacerlo en un sistema configurado con un grupo de administración de uso general, como el sistema Ubuntu en esta guía, es en realidad añadir el usuario en cuestión a ese grupo.
Por ejemplo, en Ubuntu 20.04, el grupo sudo
tiene privilegios completos de administrador. Podemos conceder a un usuario estos mismos privilegios añadiéndolo al grupo de la siguiente manera:
- sudo usermod -aG sudo username
También se puede usar el comando gpasswd
:
- sudo gpasswd -a username sudo
Ambos lograrán lo mismo.
En CentOS, normalmente es el grupo wheel
, en lugar del grupo sudo
:
- sudo usermod -aG wheel username
O usando gpasswd
:
- sudo gpasswd -a username wheel
En CentOS, si añadir el usuario al grupo no funciona inmediatamente, es posible que tenga que editar el archivo /etc/sudoers
para eliminar los comentarios del nombre del grupo:
- sudo visudo
. . .
%wheel ALL=(ALL) ALL
. . .
Ahora que nos familiarizamos con la sintaxis general del archivo, crearemos algunas reglas nuevas.
El archivo sudoers
puede organizarse más fácilmente agrupando las cosas con varios tipos de “alias”.
Por ejemplo, podemos crear tres grupos diferentes de usuarios, con miembros superpuestos:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
Los nombres de los grupos 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 ejecutarse, como en el caso anterior, sudo
será el usuario root de manera predeterminada.
Podemos permitir que los miembros de GROUPTHREE
apaguen y reinicien la máquina creando un “alias de comando” y usando 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 los alias “Ejecutar como”, que pueden sustituir la parte de la regla que especifica el usuario con el que se ejecuta el siguiente comando:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Eso permitirá que cualquier miembro del GROUPONE
ejecute comandos como usuario www-data
o como usuario apache
.
Solo tenga en cuenta que las reglas posteriores anularán las reglas anteriores cuando haya un conflicto entre ambas.
Existen varias formas en las que se puede obtener más 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 que los usuarios lo ejecuten con privilegios root sin necesidad de escribir una contraseña, podemos crear una regla como la siguiente:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
es un “etiqueta” que significa que no se solicitará ninguna contraseña. Tiene un comando compañero llamado PASSWD
, que es el comportamiento predeterminado. Una etiqueta es importante para el resto de la regla a menos que su etiqueta “gemela” la anule más adelante en la línea.
Por ejemplo, podemos tener una línea como la siguiente:
. . .
GROUPTWO ALL = 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
Esto básicamente ejecuta cualquier comando que el usuario proporcione con los mismos permisos con los que se está ejecutando less
, lo que puede ser bastante peligroso.
Para restringir esto, podríamos usar una línea como la siguiente:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
Existen algunos otros datos que pueden ser útiles cuando se trata de sudo
.
Si especificó un usuario o un grupo para “ejecutar como” en el archivo de configuración, puede ejecutar comandos como esos usuarios usando los indicadores -u
y -g
, respectivamente:
- sudo -u run_as_user command
- sudo -g run_as_group command
Por conveniencia y de manera predeterminada, sudo
guardará sus detalles de autenticación durante un tiempo determinado en un solo terminal. Esto significa que no tendrá que escribir su contraseña de nuevo hasta que se agote el tiempo del temporizador.
Para cuestiones de seguridad, si desea eliminar dicho temporizador cuando haya terminado de ejecutar comandos administrativos, puede ejecutar:
- sudo -k
Si, por otro lado, desea “imprimir” el comando sudo
para que no se le solicite más adelante o para renovar su concesión sudo
, siempre puede escribir lo siguiente:
- sudo -v
Se le solicitará su contraseña, que se almacenará en caché para usos de sudo
posteriores hasta que el plazo de sudo
expire.
Si simplemente se pregunta qué tipo de privilegios están definidos para su nombre de usuario, puede escribir lo siguiente:
- sudo -l
Esto generará una lista de todas las reglas en el archivo /etc/sudoers
que se aplican a su usuario. Eso le dará una buena idea de lo que se podrá hacer o no con sudo
como cualquier usuario.
Habrá muchas veces en las que se ejecutará un comando y fallará porque se olvidó precederlo con sudo.
Para evitar tener que volver a escribir el comando, puede 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 de un comando sin privilegios a un comando con privilegios.
Para divertirse, puede añadir la siguiente línea a su 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 eliminar la contraseña anterior sudo
del caché para probarla:
- sudo -k
- 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.
Ahora, debería tener una compresión básica sobre cómo leer y modificar el archivo sudoers
, y una comprensión de los diferentes métodos que puede usar para obtener privilegios root.
Recuerde que los privilegios de superusuario no se dan a los usuarios regulares por un motivo. Es fundamental que entienda qué hace cada comando que ejecuta con privilegios root. No tome esa responsabilidad a la ligera. Aprenda la mejor forma de utilizar estas herramientas para su caso de uso, y bloquee cualquier funcionalidad que no necesite.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!