Vous êtes sur un serveur CentOS, connecté en utilisateur non root, par exemple ici en utilisateur owner du dossier d’installation de tomcat, appelons le mytomcatuser.

Et lorsque vous voulez stopper tomcat en utilisant le service systemd tomcat.service vous obtenez une demande d’authentification 😕

systemctl stop tomcat
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
Authentication is required to stop 'tomcat.service'.
Authenticating as: macgiver
Password: Failed to stop tomcat.service: Connection timed out
See system logs and 'systemctl status tomcat.service' for details.

Soit votre utilisateur fait parti des sudo users, mais cela ne serait pas top niveau sécurité, cela signifierait que quiconque accède à cet utilisateur a la possibilité d’effectuer des actions root.

Mais bon si tel est le cas, pour lever cette demande d’authentification il suffit de faire :

sudo systemctl stop tomcat

Maintenant, si votre serveur est mieux sécurisé que votre utilisateur n’est pas un sudo user, alors vous allez devoir ajouter une nouvelle PolicyKit à Polkit.

Tout d’abord vous pouvez constatez que Polkit cause cette demande d’authentification :

vim /usr/share/polkit-1/actions/org.freedesktop.systemd1.policy

Vous obtenez un contenu XML dans lequel vous retrouvez la politique d’action pour les services systemd :

       <action id="org.freedesktop.systemd1.manage-units">
                <description gettext-domain="systemd">Manage system services or other units</description>
                <message gettext-domain="systemd">Authentication is required to manage system services or other units.</message>
                <defaults>
                        <allow_any>auth_admin</allow_any>
                        <allow_inactive>auth_admin</allow_inactive>
                        <allow_active>auth_admin_keep</allow_active>
                </defaults>
        </action>

Nous allons maintenant créer une nouvelle règle à Polkit pour autoriser notre utilisateur mytomcatuser.

vim /etc/polkit-1/rules.d/57-manage-units.rules
// Allow mytomcatuser to manage tomcat.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "tomcat.service" &&
        subject.user == "mytomcatuser") {
        return polkit.Result.YES;
    }
});

Et voilà le tour est joué, la commande systemctl stop tomcat exécutée par mytomcatuser ne demandera plus d’authentification 🙂

Partager sur les réseaux