5.2.1.- sudo
Sintaxis: sudo [-lLb] [-u user] [comando]
El mandato sudo permite a un usuario ejecutar comandos como si dicha persona hubiera accedido como el usuario root. Esta capacidad resulta muy útil por tres motivos:
Incrementa la seguridad.
Permite un mayor control de los comandos de uso restringido.
Permite saber mejor quién hizo cada cosa en el equipo al registrarse cada acción.
En Ubuntu, el comando sudo se encuentra disponible y configurado para el usuario que se creó al instalar Ubuntu. Si se accede como dicho usuario, se puede utilizar el comando directamente. También se puede habilitar el acceso a sudo para otros usuarios, agregando a éstos al grupo admin. Al ejecutar el comando sudo, éste pide que se introduzca la contraseña (para confirmar que somos quien decimos ser), y después se nos permitirá hacer uso del comando durante 5 minutos en Red Hat y 15 en Ubuntu. Cuando pase este periódo, se nos solicitará de nuevo la contraseña.
Este comando admite opciones, algunas de las más comunes son las que se citan a continuación:
-l: Imprime una lista de los comandos permitidos (y prohibidos) para el usuario actual del host actual.
-L: Lista algunas opciones por defecto del archivo sudoers.
-b: Ejecuta el comando indicado en segundo plano.
-u user: Ejecuta el comando indicado como un usuario distinto de root.
CONFIGURACIÓN DE SUDO
El comando sudo busca la autorización para ejecutar comandos en el archivo /etc/sudoers. Podemos configurar el archivo sudoers para restringir el acceso a usuarios concretos, a ciertos comandos, y en hosts particulares.
Veamos el archivo /etc/sudoers. En primer lugar, necesitamos utilizar el comando visudo para modificar el archivo /etc/sudoers. El comando visudo utiliza el editor que tengamos definido por defecto, siendo el modo más seguro para modificar el archivo sudoers. El comando bloquea el archivo para evitar varias ediciones simultáneas, realiza comprobaciones de seguridad básicas, y busca posibles errores de procesamiento. Si el archivo /etc/sudoers está siendo editado, recibiremos un mensaje indicando que debemos intentarlo de nuevo más adelante.
El formato utilizado para permitir a un usuario sin privilegios ejecutar un comando con privilegios de superusuario es:
username host = (user,group) NOPASSWD:command
username: nombre del usuario que adquiere esos privilegios.
host: Si se utiliza un único archivo sudoers centralizado para definir la configuración de varios hosts, esta opción define la autorización para cada host específico. Si en cada equipo se utiliza su propio archivo sudoers establecer esta opción a ALL.
(user,group): el usuario especificado en username puede cambiar al usuario o grupo. Si se especifica (ALL,ALL) puede cambiar a cualquier usuario o grupo.
NOPASSWD:: No solicita que se introduzca la contraseña al ejecutar el comando sudo.
command: Lista de comandos separados por comas. Todos los comandos especificados se deben definir con su ruta completa.
Ejemplos:
dppascual ALL=NOPASSWD:/bin/userdel
Se permite al usuario dppascual utilizar el comando /bin/userdel como si fuera el usuario root. Al utilizar la opción NOPASSWD no se pide la contraseña al ejecutar el comando sudo.
Podemos ser algo más selectivos con nuestras autorizaciones concediendo el acceso a los comandos de un directorio concreto:
dppascual es-mad-rhel-1=/bin/*
Esto sólo se aplica al directorio definido, y no a ninguno de sus subdirectorios. Por ejemplo, si autorizamos el acceso al directorio /bin/*
, luego no podemos ejecutar ningún comando del directorio /bin/prueba/ a menos que definamos explícitamente el acceso a dicho directorio.
En ocasiones querremos conceder a un usuario el acceso a un comando concreto, pero para que ejecute dicho comando bajo otro usuario. Por ejemplo, supongamos que necesitamos iniciar y detener algunos demonios bajo usuarios específicos, como los demonios MySQL o named. Podemos especificar el usuario que queremos que inicie el comando indicando el nombre de usuario entre paréntesis delante del comando, como sigue:
dppascual ALL=(mysql) /usr/bin/mysqld,(named) /usr/sbin/named
Como se puede imaginar, las listas de comandos, usuarios y hosts se pueden volver bastante largas. El comando sudo también permite la definición de alias. Los alias son colecciones de usuarios, comandos y hosts similares.
User_Alias ADMIN = dppascual, wsmith
Cmnd_Alias USER_COMMANDS = /bin/userdel,/bin/useradd
Host_Alias SERVERS = es-mad-rhel-1, es-mad-rhel-2
Se pueden combinar estos alias con los que se definieron anteriormente:
ADMIN ALL=USER_COMMANDS
dppascual ALL=USER_COMMANDS
ADMIN SERVERS=USER_COMMANDS
También se pueden negar los alias anteponiendo un signo de exclamación (!) a éstos. Veamos un ejemplo:
Cmnd_Alias DENIED_COMMANDS = /bin/su,/bin/mount
dppascual SERVERS=/bin/*, !DENIED_COMMANDS
Aquí el usuario dppascual puede utilizar todos los comandos del directorio /bin/ excepto aquellos definidos en el alias de comando DENIED_COMMANDS.
Dentro del archivo sudoers se puede definir otro tipo de alias en función de la información de grupos de nuestro host, prefijando el nombre del grupo con %:
``` %groupname ALL=(ALL) ALL
Esto significa que todos los miembros del grupo definido podrán ejecutar aquellos comandos que les autoricemos a utilizar, que en este caso son todos (ALL) los comandos de todos los hosts.
En los hosts Red Hat ya existe un grupo llamado wheel para este fin, por lo que todos los usuarios agregados al grupo wheel podrán utilizar el comando sudo para obtener privilegios de root en el host. En Ubuntu, este grupo se llama admin en lugar de wheel.