Tecnología
15 minutos
Bienvenidos a esta nueva entrada de nuestro Blog en el que profundizaremos en el uso dos comandos esenciales en el mundo de la administración de sistemas de información y en concreto en la administración de servidores Linux. Y vamos a comenzar explicando las diferencias entre estos dos comandos, algo que no todo el mundo tiene claro y cuyos conceptos se utilizan equivocadamente.
Unix vs Linux
Sí, ambos tienen una u, una i, una n y una x. Pero no son lo mismo:
Linux se refiere al kernel del sistema operativo GNU / Linux. De manera más general, se refiere a la familia de distribuciones derivadas. Linux fue desarrollado para ser ejecutados en PCs.
Unix se refiere al sistema operativo original desarrollado por AT&T. De manera más general, se refiere a la familia de sistemas operativos derivados. Unix fue desarrollado principalmente para grandes estaciones de trabajo y servidores.
¿Todavía no queda claro? Ok, vamos a simplificarlo:
Linux es solo el núcleo (kernel) del sistema.
Unix es un sistema operativo completo.
Continuemos. Los primeros sistemas Unix requerían administradores de sistemas a tiempo completo, y usaban la cuenta root como su única cuenta administrativa. En esos tiempos, la persona a la que se le confiaba la contraseña de root iniciaba sesión como root en una máquina de teletipo o terminal, y luego realizaba las tareas administrativas necesarias para administrar el sistema Unix.
Por norma general, el usuario root también dispone de una cuenta no root para actividades no root, como escribir documentos y administrar su correo electrónico personal. Es posible que un usuario necesite ejecutar uno o dos comandos como root, pero con muy poca frecuencia.
En primer lugar, el comando sudo (superuser do) se utiliza para dar a un usuario privilegios de root para una única tarea. En su forma más simple, sudo se puede usar para ejecutar un comando como el usuario root. Esto significa que el usuario puede realizar cualquier tarea como root sin tener que iniciar sesión como root. El usuario necesita tener la contraseña de root para utilizar sudo, lo que significa que el usuario solo puede ejecutar comandos como root si conoce la contraseña.
Por otro lado, el comando su (switch user) se utiliza para cambiar al usuario root y obtener acceso completo al sistema. Esto significa que el usuario puede ejecutar cualquier comando como root sin necesidad de la contraseña de root. Esto significa que el usuario puede realizar cualquier tarea como root sin tener que recordar la contraseña de root.
La mayoría de los administradores de sistemas rara vez usan sudo porque requiere escribir más de lo necesario para ejecutar comandos esenciales.
Estos comandos proporcionan privilegios escalados, pero la forma en que lo hacen es significativamente diferente. Esta diferencia se debe a los distintos casos de uso para los que fueron diseñados originalmente.
Trabajar como root significa que tienes el privilegio de:
Eliminar cualquiera o todos los archivos
Cambiar los permisos de cualquiera o todos los archivos
Cambiar el nivel de ejecución del sistema
Modificar cuentas de usuario
Montar o desmontar sistemas de archivos
Quitar o instalar software
Crear, eliminar y modificar sistemas de archivos
Básicamente, puedes hacer cualquier cosa en un sistema como usuario root, ya que es la cuenta administrativa todopoderosa. A diferencia de otros sistemas operativos, no veremos un cuadro de diálogo para prevenirnos de lo que va a hacer el comando rm -rf *, por ejemplo. Como podemos imaginar, los errores cometidos como usuario root pueden ser irreversibles y devastadores. Hay una alternativa: sudo.
El comando sudo (superuser do)
La intención original de sudo era permitir que el usuario root delegara a uno o dos usuarios no root el acceso a uno o dos comandos privilegiados específicos que necesitan regularmente. El comando sudo otorga a los usuarios no root acceso temporal a los privilegios elevados necesarios para realizar tareas como agregar y eliminar usuarios, eliminar archivos que pertenecen a otros usuarios, instalar nuevo software y, en general, cualquier tarea necesaria para administrar un sistema Linux moderno.
Permitir que los usuarios accedan a uno o dos comandos de uso frecuente que requieren privilegios elevados, ahorra al administrador del sistema muchas solicitudes de los usuarios y elimina el tiempo de espera. El comando sudo no cambia la cuenta de usuario para que se convierta en root; la mayoría de los usuarios no root nunca deben tener acceso root completo. En la mayoría de los casos, sudo permite que un usuario ejecute uno o dos comandos y luego permite que expire la escalada de privilegios. Durante este breve intervalo de tiempo, normalmente configurado para ser de 5 minutos, el usuario puede realizar cualquier tarea administrativa necesaria que requiera privilegios elevados. Los usuarios que necesitan seguir trabajando con privilegios elevados, pero no están listos para ejecutar otro comando relacionado con la tarea, pueden ejecutar el comando sudo -v para revalidar las credenciales y extender el tiempo por otros 5 minutos.
El uso del comando sudo tiene el efecto secundario, ya que generar entradas de registro de los comandos utilizados por usuarios no root, junto con sus identificadores de usuario.
El comando su (switch user)
El objetivo principal del comando su es permitir cambiar a otro usuario durante una sesión de login. En otras palabras, la herramienta permite asumir la identidad de otro usuario sin tener que cerrar sesión y luego iniciar sesión como ese usuario.
El comando su se usa principalmente para cambiar a la cuenta de root pero, como ya se mencionó anteriormente, también puede utilizarse para cambiar a cualquier otro usuario no root. Está destinado a permitir que un usuario no root eleve su nivel de privilegio al de root; de hecho, el usuario no root se convierte en el usuario root. El único requisito es que el usuario conozca la contraseña de root.
No se establece ningún límite de tiempo en la escalada de privilegios proporcionada por el comando su. El usuario puede trabajar como root durante el tiempo que sea necesario sin necesidad de volver a autenticarse. Cuando haya terminado, el usuario puede ejecutar el comando exit para regresar a su propia cuenta no root.
Así es como puedes usar este comando para cambiar al usuario root:
jlopez@PORTATIL05:~$ su
Password:
En general, el comando su requiere que proporcionemos la contraseña del usuario objetivo. Después de ingresar la contraseña correcta, la herramienta inicia una subsesión dentro de la sesión existente en el terminal.
El comando su –
Hay otra forma de cambiar al usuario root, y sería ejecutando el comando su -:
La diferencia entre su y su -, es que el primero mantiene el entorno del usuario original incluso después de que se haya realizado el cambio a root. En cambio, el segundo crea un nuevo entorno (según el contenido del fichero .bashrc del usuario root). Sería equivalente a iniciar sesión explícitamente como usuario root desde la pantalla de login.
Podemos decir que iniciar sesión con 'su -' tiene más sentido, aunque a veces puede ser útil para un administrador utilizar el entorno de shell de un usuario normal en lugar del suyo propio. Ocasionalmente, la forma más eficiente de resolver el problema de un usuario es iniciar sesión en la cuenta de ese usuario para reproducir o depurar el problema.
Sin embargo, en muchas situaciones no es deseable, o incluso puede ser peligroso, que el usuario root opere desde la shell de un usuario normal y con las variables de entorno de esa cuenta en lugar de desde la suya propia. Al usar inadvertidamente la shell de un usuario normal, root podría instalar un programa o realizar otros cambios en el sistema que no tendrían el mismo resultado que si se realizaran mientras se usa la cuenta root.
El comando su -c
Hay otra opción del comando su que vale la pena mencionar: -c.
Nos permite pasar como argumento un comando, el cual se ejecutará después de hacer el cambio usuario de destino.
jlopez@PORTATIL05:~$ su invitado -c 'echo $LOGNAME'
Password:
invitado
El comando sudo su
Debido a los riesgos potenciales con el uso de su o el registro directamente como root, algunas distribuciones de Linux, como Ubuntu, deshabilitan la cuenta de usuario root de forma predeterminada. De este modo, se anima a los usuarios a usar sudo siempre que necesiten privilegios de root.
Sin embargo, aun podemos ejecutar sin problemas su, es decir, sin ingresar la contraseña de root. Solo tendremos que ejecutar el siguiente comando:
jlopez@PORTATIL05:~$ sudo su
[sudo] password for jlopez:
root@PORTATIL05:/home/jlopez#
Al ejecutar el comando con sudo, solo tendremos que introducir la contraseña de usuario. Una vez hecho esto, el comando su se ejecutará como root, lo que significa que no se requiere de ninguna contraseña.
Sudo vs. Su
A continuación, vamos a detallar todas las diferencias entre los comandos sudo y su.
Contraseña
Mientras que sudo requiere la contraseña del usuario actual, su requiere que proporcionemos la contraseña del usuario root.
Podemos considerar sudo como mejor alternativa entre los dos comandos en lo que respecta a la seguridad. Por ejemplo, en el caso de un sistema utilizado por varios usuarios que también requieren acceso de root, utilizar 'su' significaría compartir la contraseña de root con todos los usuarios, lo cual no es una buena práctica.
En el caso de que deseemos revocar el acceso de root de un usuario en particular, la única forma sería cambiar la contraseña de root y luego redistribuir la nueva contraseña de root entre todos los demás usuarios
Con sudo podríamos gestionar ambos escenarios sin esfuerzo. Dado que sudo requiere que los usuarios proporcionen su propia contraseña, no sería necesario compartir la contraseña de root con todos los usuarios. Y para evitar que un usuario en particular acceda a los privilegios de root, todo lo que habría que hacer es revocar los permisos de 'sudoer’ al usuario en cuestión.
Comportamiento predeterminado
Mientras que sudo solo nos permite ejecutar un solo comando con privilegios elevados, el comando su lanza una nueva shell, lo que nos permitiría ejecutar tantos comandos como deseemos con privilegios de root hasta que salgamos explícitamente de la sesión.
Por lo tanto, el comportamiento predeterminado del comando 'su' es potencialmente peligroso dada la posibilidad de que un usuario pueda olvidar el hecho de que está trabajando como root y realizar de forma involuntaria algunos cambios irrecuperables.
Logging
Aunque los comandos ejecutados a través de sudo se ejecutan como el usuario de destino (que es 'root' de forma predeterminada), se etiquetan con el nombre de usuario sudoer. En el caso de su, no es posible rastrear directamente lo que hizo un usuario después de escalar a la cuenta root.
Flexibilidad
El comando sudo es mucho más flexible, ya que incluso podemos limitar los comandos a los que deseamos que los sudoers tengan acceso. Sin embargo, con su esta limitación no es posible.
Instalación del paquete sudo
En la mayoría de las distribuciones Linux, el paquete sudo se instala de forma predeterminada. Si sudo está instalado, al invocar el comando se mostrarán los detalles de uso del paquete sudo. Si no es así, se mostrará un mensaje de "comando no encontrado".
A continuación, veremos cómo instalar sudo en algunas de las distribuciones Linux más extendidas, si es que por algún motivo no viene instalado por defecto con la distribución Linux que estamos utilizando.
El comando que tendremos que utilizar sería muy similar, ya que lo único que varía es el gestor de paquetes con el que invocamos la instalación. yum/dnf para distribuciones CentOs/Fedora/RedHat, apt para Debian/Ubuntu y zypper para SLES/OpenSUSE.
jlopez@PORTATIL05:~$ apt|yum|dnf|zypper install sudo
Otorgar el acceso sudo
Necesitaremos otorgar acceso sudo a un usuario para convertirlo en un sudoer. Los privilegios sudo de usuario y grupo se definen en el fichero /etc/sudoers. Podemos agregar el usuario directamente a este archivo o agregar el usuario al grupo sudo.
Agregar un usuario al archivo sudoers
Debemos utilizar siempre el comando visudo para editar el fichero /etc/sudoers, ya que comprueba el archivo en busca de errores de sintaxis cuando guardamos los cambios. Si hay algún error, los cambios no se aplican. Si editamos el archivo con un editor de texto normal, un error de sintaxis puede romper el funcionamiento de sudo.
jlopez@PORTATIL05:~$ visudo
Para agregar el usuario al fichero /etc/sudoers, insertaremos la línea:
invitado ALL=(ALL) NOPASSWD:ALL
Con esta configuración, no será necesario proporcionar la contraseña de usuario cuando se utilice sudo, y se otorgarán todos los privilegios sudo.
También podemos restringir la configuración a privilegios específicos como crear o eliminar un directorio. Para ello, podemos añadir:
invitado ALL=(ALL) NOPASSWD:/bin/mkdir,/bin/rm
Agregar un usuario al grupo sudo
El grupo sudo es un grupo de usuarios con acceso a la cuenta root. Esto es similar al grupo de administradores de Windows. Con el siguiente comando, podremos añadir al usuario invitado al grupo sudo. Para poder ejecutar el comando, necesitaremos ser usuario root o un usuario con privilegios sudo.
jlopez@PORTATIL05:~$ sudo usermod -aG sudo invitado
Verificación del privilegio sudo de un usuario
A veces, necesitamos comprobar si a un usuario se le ha concedido el privilegio sudo. A continuación, veremos cómo realizar la verificación de privilegios sudo.
Si queremos comprobar el privilegio sudo de otro usuario, podemos usar las opciones -l y -U del comando sudo. Para ello, el usuario verificador debe tener el permiso sudo para poder hacer dicha comprobación.
Como podemos comprobar a continuación, el usuario invitado no tiene permisos de sudo, por lo que no puede obtener la información solicitada.
invitado@PORTATIL05:~$ sudo -l -U jlopez
[sudo] password for invitado:
Sorry, user invitado is not allowed to execute 'list' as jlopez on PORTATIL05.
Sin embargo, mi usuario jlopez cuenta con el privilegio sudo. Cuando verificamos el usuario invitado, sudo informa que el usuario objetivo no tiene el permiso sudo concedido.
jlopez@PORTATIL05:~$ sudo -l -U invitado
User invitado is not allowed to run sudo on PORTATIL05.
De lo contrario, si el usuario de destino tiene permiso sudo, la información detallada del permiso del usuario se mostrará en la salida.
jlopez@PORTATIL05:~$ sudo -l -U jlopez
Matching Defaults entries for jlopez on PORTATIL05:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User jlopez may run the following commands on PORTATIL05:
(ALL : ALL) ALL
Conclusión
Una de las mayores cualidades de Linux y el código abierto es que generalmente ofrecen muchas opciones para cada tarea que necesitamos realizar. En este artículo hemos analizado diferentes opciones para poder ejecutar comandos con privilegios de root.
Tanto su como sudo tienen sus ventajas (e inconvenientes), y ambos pueden ser seguros cuando se aplican correctamente para sus casos de uso previstos.
Te invitamos a seguir leyendo entradas de nuestro blog sobre tecnología e innovación y seguir refrescando lo ya conocido. Si además necesitas de un equipo experto en administración de sistemas, en Qualoom Expertise Technology podemos ayudar. Ponte en contacto con nosotros. Te esperamos!