¿Cómo permito que los usuarios no root controlen un servicio systemd con instancias?

12

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.

Vitor Eiji
fuente

Respuestas:

1

El archivo Sudoers no funcionará así, o eso me parece a mí. El archivo Sudoers está destinado a dar acceso a un comando específico, no a especificar los argumentos que pueden ir con ese comando.

Cree un script que se ejecute como root y ejecute esto:

/usr/bin/systemctl start database@

Haga que el script tome un argumento como anotherawesomeapp para que ejecute esto:

El script se ejecuta: / usr / bin / systemctl start database @ anotherawsesomeapp

Otorgue a sus usuarios permiso para ejecutar el archivo script.sh con / etc / sudoers.

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

El usuario puede ejecutarlo así:

sh script.sh anotherawsesomeapp

Ejemplo:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi
Baazigar
fuente
1
Tal como está, tiene los mismos problemas que el de los sudoers. Debe citar la variable o se dividirá en espacios.
kyrias
Esto no va a funcionar; setuid no es honrado por los scripts de shell (en Linux).
Martijn
Todo lo que está haciendo es usar sudo para ejecutar un script. No es diferente de lo mismo con un script 'hello world'. Si root puede ejecutar el script, funcionará.
Baazigar
0

Una solución propuesta basada enSUID

Usted 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.

$ cat >> start_database.sh
sudo / usr / bin / systemctl start database @ $ 1
(Ctrl + D)

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:

$ sudo chown root: dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ sudo chmod u + s, g + rx start_database.sh

Luego, para verificar los permisos correctos:

$ ls -la
.
.
.
-rwSr-x --- 1 root dba 35 2 de agosto 19:11 start_database.sh
.
.
.

Entonces, para recapitular:

1. el owner of the script is root
2. el archivo can be read and executed by the dba group members
3. 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.

Angelos Asonitis
fuente
Le falta un shebang en su secuencia de comandos e incluso entonces, SUIDno funcionará para las secuencias de comandos de forma predeterminada.
Jan Tojnar el