Necesito permitir que los usuarios del dba
grupo controlen los database@
servicios. La respuesta a esta pregunta relacionada es simplemente enumerar todos los systemctl
"verbos" que quiero permitir en el sudoers
archivo, 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 sudo
no va a resolver mi problema (aunque espero estar equivocado). ¿Hay alguna otra forma de permitir que los usuarios no root controlen los systemd
servicios?
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
SUID
Usted podría crear dicho script que llame a systemctl con sudo. Haga que el script sea propiedad de root. Proporcione
SUID
permiso 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
SUID
que 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 root
2. el archivo
can be read and executed by the dba group members
3.
no-one else will be able to even read
it.4.
SUID
permitirá 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
SUID
porque puede dejar espacio para el abuso permiso.fuente
SUID
no funcionará para las secuencias de comandos de forma predeterminada.