Dar acceso a un conjunto de comandos a un usuario no root sin sudo

13

Quiero dar acceso no sudo a un usuario no root en mi máquina, hay un usuario dns-manager, su único rol es ejecutar todos los comandos BIND (rndc, dnssec-keygen), etc.

Ahora, cada vez que tiene que ejecutar un comando, escribe,

sudo rndc reload

¿Hay alguna manera de deshacerme de este sudo, pero solo en un conjunto particular de comandos (y solo para dns-manager)?

Resp.
fuente
55
El control de acceso discrecional como este es más o menos para qué sudosirve. ¿Cuáles son sus objeciones comerciales a su uso sudopara esto?
MadHatter
1
@peterh Repito mi pregunta: el control de acceso discrecional (es decir, la delegación parcial del sistema) es el rol de sudo. ¿Cuáles son las objeciones?
MadHatter
3
¿Qué tal sin contraseña sudo, entonces? O sudo con contraseña para ejecutar la herramienta de administración de DNS , que luego puede operar con namedprivilegios de grupo o usuario, o privilegio raíz, según sea necesario.
MadHatter
44
@peterh "una buena razón para hacerlo de esta manera" sería la parte que falta. Por lo general, preguntas como esta resultan ser problemas XY disfrazados, y creo que comprender el problema subyacente es clave para responderlos de manera completa y profesional.
MadHatter
2
@ Peter Creo que estamos de acuerdo el uno con el otro. Yo también quiero ver al OP mejorar su pregunta; profundizar en él funciona bien para mí como una forma de ayudar al autor a pensar fuera de la caja que ha construido a su alrededor. Es muy posible que tenga una buena razón para querer evitar sudo. Al tratar de explicárnoslo, puede aclarar nuestra confusión, o la suya, ¡o ambas!
MadHatter

Respuestas:

31

Si entiendo sus comentarios correctamente, el problema aquí es que el comando se emitirá a través de una conexión que no tiene la capacidad de ingresar la contraseña que sudo no solicita. Además, en muchas distribuciones del sistema operativo, sudo requerirá por defecto un TTY, que este programa puede no tener.

Sin embargo, sudo puede tener una estructura de permisos muy fina, lo que permite que uno o más usuarios emitan un comando en particular sin contraseña y TTY. A continuación, le mostraré tres formas de configurar esto para sus necesidades. Cualquiera que elija, el usuario ahora podrá emitir el comando sudo rndc reloadsin tener que ingresar una contraseña.

(Además, esto puede ser innecesario, pero ... por favor, recuerde que debe hacer una copia de seguridad del archivo sudoers antes de editarlo, para mantener una concha en la que están abiertos raíces en caso de que necesite volver a la copia de seguridad, y para editar usando en visudolugar de sudo vi /etc/sudoers. Esperemos que estas precauciones sean innecesarias, pero ... ¡es mejor tenerlas y no necesitarlas que a la inversa!)

1. Si no desea solicitar un TTY para cualquier solicitud

La forma más fácil de deshacerse de los requisitos de TTY (si existe) es asegurarse de que la línea que comienza con Defaultsin /etc/sudoersno contenga la palabra requiretty; en su lugar, debería contenerla !requiretty. Sin embargo, si haces esto, significa que ningún comando sudo requerirá un tty.

También necesitará agregar la línea.

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Si desea solicitar un TTY para todos los usuarios excepto este

Esto se puede hacer estableciendo un valor predeterminado para este usuario, como este:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Si desea solicitar un TTY para todos los comandos excepto este comando por este usuario

Esto es un poco más complejo, debido a la sintaxis del archivo sudoers. Debería crear un alias de comando para el comando y luego establecer un valor predeterminado para ese alias de comando, de esta manera:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD
Jenny D
fuente
Por supuesto, esto se puede combinar con un script de envoltura que llama al comando usando sudo, si por alguna razón no puede usar sudo directamente, incluso cuando no tiene contraseña.
Jenny D
4

Si. sudo se puede configurar de manera muy flexible. Aun así, debo mencionar: este tipo de soluciones no deben considerarse muy seguras, y solo deben usarse en un entorno cooperativo donde existan otros controles (por lo tanto, puede otorgar estos privilegios mejorados a su leal subordinado, pero no debería hacerlo para un cliente que solo conoce de la red).

La configuración de sudo está /etc/sudoersen la mayoría de los sistemas. Puede averiguar su sintaxis buscando en Google o mediante un man sudocomando.

No debe editar este archivo directamente; hacerlo puede conducir a condiciones de carrera de seguridad. En su lugar, use el visudocomando (que es un contenedor alrededor de su $EDITORvariable de entorno).


Después de configurar sudo, puede ajustar fácilmente esto alrededor de los comandos visibles. Es muy simple:

  1. Cree un directorio para una lista de sus scripts de sudo wrapper (fe /usr/local/dnsadmin/bin)
  2. Cree una secuencia de comandos de envoltura para los comandos que desea que puedan utilizarse sin sudo. Será un comando muy simple, por ejemplo, /usr/local/dnsadmin/bin/rndcserá:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Obtenga este directorio en su PATHvariable de entorno (por ejemplo, en todo el sistema o en su local .profile).

peterh - Restablece a Monica
fuente
Por curiosidad, ¿por qué execusarías el script de shell en lugar de solo llamar al comando directamente? (No digo que esté mal, solo me gustaría saber por qué lo harías para que tal vez pueda aprender algo)
Jenny D
2
Ya terminé con el bit sudo sin contraseña, la idea de los scripts de envoltura es genial.
Respuestas
2
@JennyD :-) Debido a la estabilidad y el rendimiento. En caso de exec, el comando llamado se sustituirá en el lugar del shell. La cáscara se irá. Sin un ejecutivo, el shell iniciará ese comando y luego esperará su finalización y luego se cerrará. Este segundo, exec-exe significa múltiples procesos de cooperación, lo cual es innecesario. Pero no hay una gran diferencia, sin un ejecutivo esto funcionaría tan bien como con eso.
peterh - Restablecer Monica
@JennyD Mi súplica :-)
peterh - Restablecer Monica
@Snowbody ¡Muchas gracias a los lectores! Es un gran honor.
peterh - Restablecer Monica
2

Si bien esta no es una solución general en el caso específico de rndcque no la necesite sudoen absoluto.

rndcpuede comunicarse con cualquier namedproceso a través de un socket local o un puerto remoto, utilizando una clave secreta para autenticarse. Por defecto (o al menos, para Debian, que es la distribución que uso), este archivo se puede encontrar /etc/bind/rndc.keyy normalmente solo se puede leer para el usuario bindy el grupo bind.

Cualquier persona que tenga acceso de lectura a ese archivo de clave (o una copia idéntica del mismo) puede usar rndcpara controlar el servidor BIND, por lo que la solución más fácil en este caso particular sería agregar al usuario al bindgrupo.

Un sorprendente número de demonios comunes tienen algo similar (personalmente estoy descubriendo las posibilidades de los poderosos en ese sentido, pero hasta ahora parece prometedor). Si no quiere hacerlo sudo, tendrá que verificar si lo que quiere lograr es posible caso por caso.

Shadur
fuente
-1

No desea usar sudo para otorgar root a algunos comandos. En cambio, podría chmod 4750 un programa específico [que puede ajustar el comando], para elevar los derechos de un usuario normal para ejecutarlo como root.

bbaassssiiee
fuente