Necesito permitir que los usuarios del dbagrupo controlen los database@servicios. La respuesta a esta pregunta relacionada es simplemente enumerar todos los systemctl"verbos" que quiero permitir en el sudoersarchivo, sin embargo, eso no se aplica a mi caso porque no sé de antemano qué bases de datos pueden existir en el sistema. Por ejemplo, si enumero
%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity
eso no cubre instancias que puedan existir en el futuro, y un dba no podrá
$ sudo systemctl start database@omgwowyetanotherawsesomeapp
De todos modos, estoy pensando más en términos de empaque que en manipular un sistema específico.
Tenga en cuenta que, como se muestra en esta sorprendente respuesta a otra pregunta relacionada , el uso de sudo globs para esto es en última instancia inseguro:
%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!
permite
$ sudo systemctl start database@awsesomeapp unrelatedservice
Sospecho que usar sudono va a resolver mi problema (aunque espero estar equivocado). ¿Hay alguna otra forma de permitir que los usuarios no root controlen los systemdservicios?
Para lo que vale, necesito hacer esto en un sistema CentOS 7 y sistemas RHEL7 en el futuro. También estaría interesado en soluciones que funcionen en Arch Linux.
fuente

Una solución propuesta basada en
SUIDUsted podría crear dicho script que llame a systemctl con sudo. Haga que el script sea propiedad de root. Proporcione
SUIDpermiso para rootear y leer y ejecutar permisos para el grupo de administradores de bases de datos (dba).¡Solo tenga cuidado de no proporcionar permiso de escritura al grupo ni a otros porque de esa manera pueden cambiar el guión y hacer que ejecute cualquier cosa precedida por sudo! También asegúrese de que el script sea a prueba de viñetas.
Este script podría mejorarse verificando si el argumento es realmente suministrado e imprime un mensaje Usage: si no ..., también dado que es un script con el
SUIDque sería apropiado verificarlo; para evitar la inyección de otros comandos siguiendo el argumento. ¡O incluso mejor, asegúrese de permitir como entrada solo una de las cadenas relacionadas con la aplicación que mencionó!Luego debe asegurarse de que los permisos para el script sean estrictamente los siguientes:
Luego, para verificar los permisos correctos:
Entonces, para recapitular:
1. el
owner of the script is root2. el archivo
can be read and executed by the dba group members3.
no-one else will be able to even readit.4.
SUIDpermitirá que el usuario que ejecuta el script se convierta en root mientras se ejecute el script.5. Entonces sudo no se detendrá por una contraseña.
En cualquier caso, en un sistema con varios usuarios, ser muy cuidadoso con
SUIDporque puede dejar espacio para el abuso permiso.fuente
SUIDno funcionará para las secuencias de comandos de forma predeterminada.