Comment autoriser les utilisateurs non root à contrôler un service systemd avec des instances?

12

Je dois autoriser les utilisateurs du dbagroupe à contrôler les database@services. La réponse à cette question connexe est de simplement lister tous les systemctl"verbes" que je veux autoriser dans le sudoersfichier, cependant, cela ne s'applique pas à mon cas car je ne sais pas à l'avance quelles bases de données peuvent exister dans le système. Par exemple, si je liste

%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

qui ne couvre pas les cas qui pourraient exister dans le futur, et un dba ne pourra pas

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

Quoi qu'il en soit, je pense plus en termes d'emballage que de fidélité à un système spécifique.

Notez que, comme le montre cette réponse étonnante à une autre question connexe , l'utilisation de sudo globs pour cela n'est finalement pas sécurisée:

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

permet

$ sudo systemctl start database@awsesomeapp unrelatedservice

Je soupçonne que l'utilisation sudone résoudra pas mon problème (même si j'espère que je me trompe). Existe-t-il un autre moyen de permettre aux utilisateurs non root de contrôler les systemdservices?

Pour ce que ça vaut, je dois le faire dans un système CentOS 7 et des systèmes RHEL7 à l'avenir. Je serais également intéressé par des solutions qui fonctionnent sur Arch Linux.

Vitor Eiji
la source

Réponses:

1

Le fichier Sudoers ne fonctionnera pas comme ça, du moins il me semble. Le fichier Sudoers est destiné à donner un accès à une commande spécifique, et non à spécifier les arguments qui peuvent accompagner cette commande.

Créez un script qui s'exécute en tant que root et exécute ceci:

/usr/bin/systemctl start database@

Faites en sorte que le script prenne un argument tel que anotherawesomeapp pour qu'il exécute ceci:

Le script s'exécute: / usr / bin / systemctl start database @ anotherawsesomeapp

Donnez à vos utilisateurs l'autorisation d'exécuter le fichier script.sh avec / etc / sudoers.

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

L'utilisateur peut l'exécuter comme ceci:

sh script.sh anotherawsesomeapp

Exemple:

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
la source
1
En l'état, cela a les mêmes problèmes que celui des sudoers. Vous devez citer la variable ou elle sera divisée en espaces.
kyrias
Ça ne va pas marcher; setuid n'est pas honoré pour les scripts shell (sous Linux).
Martijn
Tout ce qu'il fait, c'est utiliser sudo pour exécuter un script. Ce n'est pas différent du même avec un script «bonjour le monde». Si root peut exécuter le script, cela fonctionnera.
Baazigar
0

Une solution proposée basée surSUID

You pourrait créer ledit script qui appelle systemctl avec sudo. Rendez le script détenu par root. Fournissez l' SUIDautorisation de rooter, de lire et d'exécuter des autorisations au groupe d'administrateurs de base de données (dba).
Faites juste attention à ne pas donner de permission d'écriture au groupe ou aux autres, car de cette façon, ils peuvent changer le script et le faire exécuter tout ce qui est précédé de sudo! Assurez-vous également que le script est à l'épreuve des balles en entrée.

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

Ce script pourrait être amélioré en vérifiant si l'argument est bien fourni et en imprimant un message Usage: sinon ..., aussi puisqu'il s'agit d'un script avec lequel SUIDil conviendrait de vérifier; pour éviter l'injection d'autres commandes après l'argument. Ou encore mieux, assurez-vous de n'autoriser en entrée qu'une des chaînes liées à l'application que vous avez mentionnées!
Ensuite, vous devez vous assurer que les autorisations pour le script sont strictement les suivantes:

$ 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

Ensuite, pour vérifier les autorisations correctes:

$ ls -la
.
.
.
-rwSr-x --- 1 root dba 35 2 août 19:11 start_database.sh
.
.
.

Donc, pour récapituler:

1. le owner of the script is root
2. le fichier can be read and executed by the dba group members
3. no-one else will be able to even readle.
4. SUIDpermettra à l'utilisateur qui exécute le script de devenir root tant que le script est exécuté.
5. Donc sudo ne s'arrêtera pas pour un mot de passe.

Dans tous les cas, dans un système avec plusieurs utilisateurs, être très prudent avec SUIDcar il peut laisser place à l' abus d'autorisation.

Angelos Asonitis
la source
Il vous manque un shebang dans votre script et même alors, SUIDne fonctionnera pas pour les scripts par défaut.
Jan Tojnar