J'ai créé des services systemd qui fonctionnent essentiellement:
emplacement:
/etc/systemd/system/multi-user.target.wants/publicapi.service
contenu:
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=multi-user.target
Lorsque j'essaie de redémarrer le service en tant qu'utilisateur techops dans la ligne de commande, j'obtiens la sortie suivante:
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
1. Myself,,, (defaultuser)
2. ,,, (techops)
Choose identity to authenticate as (1-2):
Je souhaite que seuls les techops puissent redémarrer les services et je souhaite que cette invite n'apparaisse pas lors de la connexion en tant que techops. Comment puis je faire ça?
J'ai lu qu'il existe différentes approches avec polkit-1 ou sudoers, mais je ne suis pas sûr.
[MISE À JOUR] 2019-01-27 4:40 pm
Merci pour cette réponse complète à Thomas et Perlduck. Cela m'a aidé à améliorer ma connaissance de systemd.
Selon l'approche de démarrage du service sans invite de mot de passe, et je tiens à m'excuser de ne pas avoir suffisamment souligné le vrai problème:
En fait, ce qui est le plus important pour moi, c'est qu'aucun autre utilisateur que techops ne devrait arrêter ou démarrer le service. Mais au moins avec les deux premières approches, je peux toujours exécuter service publicapi stop
et je reçois à ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
nouveau l'invite . Lorsque je choisis l'utilisateur par défaut et que je connais le mot de passe, je pouvais arrêter tous les services. Je veux empêcher cet utilisateur de le faire, même s'il a le mot de passe . Informations de fond importantes pour mieux comprendre pourquoi c'est la partie la plus importante pour moi:
l'utilisateur par défaut est le seul utilisateur exposé à ssh mais cet utilisateur ne peut rien faire d'autre (sauf changer pour d'autres utilisateurs si vous avez le mot de passe de ces autres utilisateurs) . Mais pour le moment, il peut démarrer ou arrêter les services, mais cet utilisateur ne doit pas le faire.
Si quelqu'un obtient le mot de passe de l'utilisateur par défaut et se connecte via ssh, il pourrait arrêter tous les services pour le moment. C'est ce que je voulais dire par "Je veux que seuls les techops puissent redémarrer les services". Désolé, je n'étais pas aussi précis à ma question initiale. Je pensais que le sudoing de l'utilisateur techops contournerait peut-être ce problème, mais ce n'est pas le cas. Le problème lui-même n'est pas d'exécuter la commande sans invite de mot de passe. (Je pourrais facilement le faire en tant qu'utilisateur techops lorsque je viens d'exécuter /home/techops/publicapi start
). Le problème lui-même est d'empêcher l'utilisateur par défaut de démarrer ces services.
Et j'espérais que n'importe laquelle des solutions pourrait le faire.
J'ai commencé avec les approches de Thomas. L'approche avec sudo fonctionne quand je ne veux pas qu'on me demande le mot de passe pour l'utilisateur techops quand j'exécute les commandes comme expliqué, par exemple
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
La deuxième approche ne fonctionne pas encore pour moi. Je ne peux pas démarrer le service sans invite de mot de passe ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
et je peux me connecter en tant qu'utilisateur par défaut lorsque j'ai le mot de passe de cet utilisateur.
Avec la troisième approche, le service ne démarre même plus au processus de démarrage, donc je ne sais pas si cette approche est la bonne pour moi. Je ne peux même pas le faire avec systemctl enable publicapi.service
ce qui me conduit à l'erreur suivante:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
L'erreur ne se produit pas lorsque je replace tous les services dans / etc / systemd / system / et les exécute systemctl enable publicapi.service
. Ensuite, le service redémarre au démarrage.
Toutes ces approches aideront plus ou moins à contourner l'invite de mot de passe pour l'utilisateur techops mais lorsque j'exécute service publicapi stop
ou systemctl stop publicapi
avec defaultuser, je peux arrêter les services si j'ai le mot de passe. Mais mon objectif est d'empêcher l'utilisateur par défaut de démarrer ou d'arrêter les services.
/etc/sudoers
fichier s'il existe une référence pour cet utilisateur.
systemctl --user ...
tant qu'utilisateur ettechops
non en tant que root. Ni ma suggestion ni celle de @PerlDuck ne donne desudo
droits à votre utilisateur par défaut mais uniquement à l' utilisateur techops .