Claramente, sudo
sería la primera opción para mí en tal caso. Los principales aparece punto a ser que la mayoría de los administradores (reales) no utilizan realmente /etc/sudoers
en toda su extensión posible ( User_Alias
, Runas_Alias
, Host_Alias
, Cmnd_Alias
).
La mayoría de los administradores terminan usando solo algunas de las reglas existentes y agregando usuarios, o peor, simplemente agregando usuarios al sudo
grupo para el que generalmente existe una regla en las configuraciones de Ubuntu ( %sudo
...). Esto, por supuesto, le da a los respectivos usuarios un reinado gratuito y el poder total de la cuenta de superusuario.
Dado su comentario:
así que los agregué a /etc/sudoers
Creo que tampoco lo usas en la medida de lo posible.
En un escenario como el suyo, literalmente escribiría las pocas acciones a las que se limitaría Bob. De hecho, esto es lo que hice en un servidor que mantengo, para permitir que dos usuarios particulares reinicien un invitado KVM particular en un host. Los scripts contendrían un hashbang con ruta absoluta al intérprete (por ejemplo, en #!/bin/dash
lugar de #!/usr/bin/env bash
) y probablemente se ejecutarían con un shell que se usa en otro lugar para tareas privilegiadas ( /bin/dash
o /bin/sh
). Esas son solo precauciones. Aparte de eso, me aseguraría de codificar todas las rutas absolutas a los archivos binarios y usar la menor cantidad posible. Por ejemplo, cuando use bash
/ dash
preferiría builtin
s sobre command
s (ver man bash
). Puede hacer que esto se pueda mantener asignando una variable a la ruta absoluta y haciendo referencia al programa basado en esa variable ($VIRSH
en lugar de /usr/bin/virsh
). Si puede, examine el código de cualquier script externo antes de llamarlo. Especialmente si necesita llamarlos en un contexto privilegiado. En mi caso, también confino a los usuarios en un directorio raíz particular y un subsistema SSH particular, ya que solo se conectan a la máquina mediante sshd
una autenticación de clave pública. Obviamente no necesitas eso.
Asegúrese chown root: <the-script>; chmod u=rw,a=,a+rx <the-script>
de evitar que alguien que no sea el root
adecuado juegue con él. También tenga cuidado con setuid
y los setgid
bits habilitados en los binarios de destino ( find
se pueden usar para detectarlos). Supongamos por el momento que reside tu script /usr/sbin/priv-action
.
Ahora edita tu /etc/sudoers
. noexec
también se puede usar para evitar otros binarios que los permitidos explícitamente. En realidad, hay muchas configuraciones adicionales, no solo las que describo aquí. Así que asegúrese de consultar man sudoers
.
Ahora prefiero nombrar a los usuarios ( User_Alias
) en mi sudoers
archivo, pero también podría usar un Group_Alias
( man sudoers
) o un grupo de sistema real (por ejemplo %sudo
):
# The list is comma-separated: bob,alice,...
User_Alias LIMITED_ADMINS=bob
y luego agregue un alias de comando para permitir ejecutar ese script en particular:
# The list is comma-separated: /usr/sbin/priv-action,/bin/bash,...
Cmnd_Alias PRIV_ACTION=/usr/sbin/priv-action
Por último, pero no menos importante, viene la línea mágica para permitir bob
(o más bien a los usuarios enumerados a continuación LIMITED_ADMINS
) ejecutar los comandos privilegiados a través del script:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
A diferencia de las definiciones de alias anteriores, esa línea requiere una explicación. Así que primero profundicemos en las partes en una línea de "Especificación del usuario". Aquí man sudoers
ayuda:
La estructura básica de una especificación de usuario es who where = (as_whom) what
.
Línea de ejemplo (que se encuentra en la mayoría de las configuraciones de Ubuntu):
root ALL=(ALL) ALL
Esto dice que un usuario llamado root
(use #0
para vincularlo al UID 0
) puede, en todos los hosts, ejecutarse en cualquier contexto de usuario, pero se le pedirá su contraseña (asumiendo el comportamiento predeterminado). Agregar la NOPASSWD
etiqueta antes de la última ALL
también permitiría root
hacer lo mismo sin que se le pida una contraseña (así:) root ALL=(ALL) NOPASSWD:ALL
. ALL
es un alias intrínseco comodín para los distintos tipos de alias.
Pero volviendo a Bob:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
permitiría bob
y otros miembros de la lista User_Alias LIMITED_ADMINS
ejecutar (en todos los hosts, para eso ALL
es) como usuario root
(grupo implícito, pero podría darse, ver man sudoers
) los comandos dados en el Cmnd_Alias PRIV_ACTION
. Se pone mejor. Aún suponiendo que escriba este script, podría permitir varios parámetros, evitando así escribir múltiples scripts. /etc/sudoers
con mucho gusto toma comodines con forma de shell para limitar las posibilidades de argumentos permitidos.
Constantemente he descubierto que los administradores no usan sudoers
la forma en que debería usarse, por eso aprecié el respectivo "Hack" de los dos libros "Linux Server Hacks" y "Linux Server Hacks Volume Two", que me ayudaron a comenzar con Un uso más sofisticado de esta gran instalación.
Puede encontrar todo tipo de soluciones intrincadas, que pueden no ayudar exactamente al aspecto de seguridad, para su caso particular, pero una vez que hable el vocabulario básico /etc/sudoers
, puede realizar hazañas bastante mágicas :)
NB: tenga en cuenta que también puede crear un nuevo archivo debajo /etc/sudoers.d/
si lo desea. Esto supone que /etc/sudoers
contiene la línea:
#includedir /etc/sudoers.d
sudoers
archivo, puedes consultar su página de manual para obtener más información.sudoers
: no es un primer recurso debido a problemas de seguridad. Vea también la respuesta de enzotib: parte del problema era la confusión entresudo
y PolicyKit.