Sudo, Sudoers, reglas y alias en Linux

Published:

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.

- Advertisement -
Jorge
Jorgehttps://nksistemas.com
Soy Jorge, Sr Sysadmin Linux/DevOps/SRE y creador de NKSistemas.com Trabajo con plataformas: Linux, Windows, AWS, GCP, VMware, Helm, kubernetes, Docker, etc.

Related articles