Los sistemas Linux poseen 2 tipos de usuarios, el root que es el que puede hacer todo en el sistema, y los usuarios comunes que no pueden hacer tareas de tipo administrativas como:
- Crear, eliminar y administrar cuentas de otros usuarios.
- Modificar los permisos y propietarios de cualquier archivo o directorio.
- Instalar paquetes manualmente y acceder a archivos fuente en el filesystem.
- Modificar o eliminar archivos del sistema.
- Detener, iniciar o reiniciar servicios del sistema.
Para administrar el equipo no vamos a darle acceso root a todos, si no que existen herramientas como sudo, que permiten a un administrador darle la posibilidad a otros usuarios de acceder a ciertas tareas administrativas (o a todas, si se quiere) utilizando su propia contraseña de usuario común.
La configuración de sudo se encuentra en /etc/sudoers, podemos acceder como root y un editor de texto o directamente con el comando visudo que invocará el editor por defecto, para cambiar el editor de texto por defecto en el sistema podemos editar la configuración.
1- Cambiando la configuración de visudo
sudo update-alternatives --config editor
Nos mostrará una lista de los editores presentes en el sistema y nos pedirá que opción queremos definir por defecto, a partir de ese momento cuando lancemos el comando visudo o crontab -e se abrirá el editor definido.
2- El archivo sudoers
Para entender lo que vemos en el archivo de configuración de sudo que es /etc/sudoers
Usuario quién/dónde = (como_quién) qué
Un ejemplo que vemos es
nk2 ALL=(ALL) ALL
Establece permiso para el usuario ‘nk2’ en cualquier host, ejecutar cualquier comando de cualquier usuario, por supuesto incluyendo los de root.
3- Sintaxis de sudoers
Veamos la siguiente sintáxis
usuario1 Equipo=(user5) Comando
Cuando antepongamos el comando sudo se verificarán todas las líneas del sudoers y los archivos contenidos en sudoers.d para otorgarnos los privilegios, que es una ubicación para ordenar los accesos.
Esta línea anterior el usuario «usuario1» puede ejecutar el comando «Comando» con los privilegios de. usuario «user5» en el ordenador Equipo.
4- Listar que permisos tiene el usuario actual
sudo -l
4.1- Para listar los permisos que tiene otro usuario
sudo -l -U nk2
5- Usuarios y grupos
Cuando dijimos usuario1 hace referencia al nombre de usuario en el sistema, o también a un grupo si le anteponemos el símbolo porcentual. Es decir, podemos otorgar ciertos privilegios al usuario usuario1, o a un grupo que puede ser %administradores.
El campo Equipo puede ser un nombre de host, una dirección IP, una red entera como 192.168.0.0/24, pero no puede ser la dirección IP de loopback (127.0.0.1).
El campo user5 también puede ser un username o un grupo con el prefijo %, y ambos pueden ser también UIDs o GIDs, por lo que en cualquiera de estas dos ubicaciones podríamos poner al usuario usuario1, o 1001, o al grupo %admin, o al grupo %104, según sean los nombres e ID’s que correspondan.
Cuando un usuario ejecuta un comando invocando a sudo, el comando se ejecutará como root. No obstante, el comando sudo permite especificar un usuario o grupo diferente de root para ejecutar un comando. Es decir, uno podría ejecutar sudo -u usuario30 comando o sudo -g administradores comando para invocar al comando con los privilegios del usuario usuario30 o el grupo administradores respectivamente.
sudo -u usuario30 /comando_de_usuario30
6- Alias
Un alias se refiere a un usuario, un comando o a un equipo. El alias engloba bajo un solo nombre (nombre del alias) una serie de elementos que después en la parte de definición de reglas serán refiridos aplicados bajos cierto criterio. Es decir, regresando a EBNF estamos creando las reglas de producción inicial. La forma para crear un alias es la siguiente:
tipo_alias NOMBRE_DEL_ALIAS = elemento1, elemento2, elemento3, ... etc
tipo_alias NOMBRE1 = elemento1, elemento2 : NOMBRE2 = elemento1, elemento2
En el segundo caso, separado por «:» es posible indicar más de un alias en una misma definción.
El tipo_alias define los elementos, es decir, dependiendo del tipo de alias serán sus elementos. Los tipo de alias son cuatro y son los siguientes:
- Cmnd_Alias – define alias de comandos.
- User_Alias – define alias de usuarios normales.
- Runas_Alias – define alias de usuarios administradores o con privilegios.
- Host_Alias – define alias de hosts o equipos.
El NOMBRE_DEL_ALIAS puede llevar letras, números o guión bajo ( _ ) y DEBE de comenzar con una letra mayúscula.
Los elementos del alias varian dependiendo del tipo de alias, asi que veámoslos por partes asi como varios ejemplos para que comience a quedar claro todo esto.
Ejemplo de User_Alias
User_Alias ADMINS = usuario1, usuario2, %admistradores
Ejemplo de Cmnd_Alias
Cmnd_Alias NOPERMITIDO = !/bin/apt, !/bin/passwd, !/bin/useradd
Ejemplo para no permitir
ADMINS ALL=(ALL:ALL) NOPERMITIDO
NOTA: cuando uso el signo !, en realidad estoy negando el permiso de correr ese comando o en el caso de los usuarios que aplique todo menos al usuario que tenga el signo delante.
Cuando uso el signo % es para especificar grupos.
6.1- Entonces creamos un archivo con el siguiente contenido
nano /etc/sudoers.d/nopermitidos
#alias User_Alias ADMINS = nk2, %nk2, !nk1 Cmnd_Alias NOPERMITIDO = !/bin/apt, !/bin/passwd, !/bin/useradd #No permitir ADMINS ALL=(ALL:ALL) NOPERMITIDO
6.2- Siempre es recomendable comprobar que el archivo sudoers esta correctamente configurado.
visudo -c
Y probamos
sudo apt install mc
6.3- En el caso de obtener un error como el siguiente:
/etc/sudoers.d/nopermitidos: bad permissions, should be mode 0440
Debemos ajustar los permisos de nopermitidos a 0440, con un usuario que tenga permisos para cambiarlo.
sudo chmod 0440 /etc/sudoers.d/nopermitidos
Si todo está bien debería darnos OK.
NOTA: cuidado con cambiar los permisos del archivo /etc/sudoers, por defecto se usa el permiso 0640 y si por ejemplo le damos cambiamos los permisos mal, podemos tener un error:
sudo: /etc/sudoers is world writable sudo: no valid sudoers sources found, quitting sudo: error initializing audit plugin sudoers_audit
La solución es volver a dejarlo como estaba por defecto, esto lo hacemos con el usuario root
chmod 0640 /etc/sudoers
6.4- Vamos a permitir ahora que un usuario pueda ejecutar determinadas funciones.
Podemos editar el archivo nopermitidos, o moverlo a permitidos
mv nopermitidos permitidos
Editamos con nano o editor preferido y en este caso voy a quitar el !, haciendo que el usuario pueda ejecutar las ordenes.
User_Alias ADMINS = nk2, %nk2 Cmnd_Alias PERMITIDO = /bin/useradd, /bin/passwd, /bin/apt #No permitir ADMINS ALL=(ALL:ALL) PERMITIDO
Guardamos y probamos que nk2, pueda instalar un paquete:
sudo apt install mc
6.5- Directorio sudoers.d
Al final de la línea vemos
@includedir /etc/sudoers.d
En versiones anteriores tenía un # delante, pero OJO no era un comentario, si no una referencia que además de leer el archivo sudoers también va a leer los archivos que estén en /etc/sudoers.d/.
7- Logs
Los errores o aciertos suelen registrarse en /var/log/auth.log, /var/log/messages o /var/log/secure dependiendo de tu distribución:
cat /var/log/secure | grep sudo
8- Usando un grupo con privilegios administrativos
Algunos sistemas vienen configurados con grupos que permiten la ejecución de comandos con el prefijo sudo. Agregar usuarios a estos grupos es la forma más fácil y rápida de darles privilegios sudo, pero esta opción no está disponible en algunas versiones de ciertas distribuciones Linux.
8.1- Debian/Ubuntu
En estos sistemas, el grupo que otorga permisos administrativos y agrega al usuario a la lista de sudoers se llama simplemente sudo. Podemos agregar un usuario a este grupo usando el siguiente comando:
usermod -aG sudo miusuario
Recuerda sustituir miusuario con el nombre real del usuario de tu sistema. También se puede utilizar el siguiente comando:
gpasswd -a miusuario sudo
8.2- RHEL, CentOS, AlmaLinux, RockyLinux, Fedora.
En estos sistemas el grupo que agrega a un usuario a la lista de sudoers se llama wheel.
usermod -aG wheel miusuario
También se puede usar gpasswd:
gpasswd -a miusuario wheel
Por supuesto, es recomendable cambiar esta configuración por defecto, y hacer todo más personalizado y restrictivo.
9- Etiquetas
Vamos a poder hacer más definiciones aplicando etiquetas.
9.1- NOPASSWD Y PASSWD
Podemos definir que un comando requiera autenticación o no. Veamos ejemplos prácticos. Y para probar todo el ejemplo intercambiar los comandos.
nano /etc/sudoers.d/nopermitidos
Host_Alias SERVER=192.168.186.128 nk2 SERVER=(ALL) NOPASSWD: /bin/apt, PASSWD: /bin/nano Defaults:nk2 timestamp_timeout=0
Voy a hacer uso de varias cosas:
a) Un Host_Alias de mi server actual seguido del = y la IP. (Cuidado que no hay espacios antes o después del =)
b) Uso NOPASSWD para que no pide la contraseña y PASSWD para que ese comando si la pida.
c) Utilizo en Defaults para que sudo siempre solicite la clave. Porque por defecto es 5 minutos.
Para saber todos los parámetros incluyendo el tiempo por defecto, hacemos
sudo -V o sudo -V | grep "Password prompt timeout"
9.2- NOEXEC Y EXEC
Permite NO ejecutar un comando o lo permite.
nano /etc/sudoers.d/nopermitidos
Host_Alias SERVER=192.168.186.128 nk2 SERVER=(ALL) EXEC: /bin/apt
Intercambiar EXEC con NOEXEC y ver la diferencia.
9.3- Defaults, flags o booleanos
Vamos a hacer usos de algunos defaults, que explicaremos con ejemplos, dados que algunos vienen en ON y otros en OFF, para ver en detalle consultaremos el manual porque son varios.
Host_Alias SERVER=192.168.186.128 nk2 SERVER=(ALL) EXEC: /bin/apt Defaults:nk2 timestamp_timeout=0 Defaults authenticate Defaults badpass_message="Intenta de nuevo: "
a) Defaults authenticate: lo que hace es solicitar siempre autenticación, en este caso para todos los usuarios. Si anteponemos ! veamos que pasa.
b) Defaults badpass_message: va a mostrar un mensaje cuando nos equivoquemos al usar sudo, por ejemplo colocando mal la clave. También se usa Defaults mail_always para enviar mail de notificación cuando alguien usa el sudo.





