Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/08/2019, à 13:33

doc83

[Résolu] Autoriser www-data à exécuter des commandes sans sudo

Bonjour,

Je cherche un moyen de faire exécuter un script à mon serveur web (groupe www-data) avec des commandes nécessitant sudo.

Je ne souhaite pas pour autant modifier le fichier /etc/sudoers.

Existe-t-il une possibilité de "faire croire" au système que les commandes du script peuvent être effectuées sans sudo alors que le groupe qui l'exécute n'a pas les droits root ?

Voici un exemple de ce que www-data devrait être en mesure de pouvoir faire :

// code php exécuté par www-data
shell_exec("./mon_script.sh");
#!/bin/bash
# contenu de 'mon_script.sh'
systemctl reload nginx

J'ai vu qu'il y avait quelque chose comme le 'suid' mais après avoir testé, je n'ai pas l'impression que cela ait un rapport avec l'exécution des commandes contenues dans le script.

Dernière modification par doc83 (Le 21/08/2019, à 18:53)


Financement participatif et crowdfunding https://www.alloprod.com

Hors ligne

#3 Le 20/08/2019, à 16:44

kamaris

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Le suid a un rapport avec l'exécution des commandes contenues dans le script, mais il ne s'appliquera pas, pour des raisons de sécurité : https://unix.stackexchange.com/question … ll-scripts
Tu peux contourner cela en passant par un petit lanceur binaire : https://forum.ubuntu-fr.org/viewtopic.p … #p22110142

Hors ligne

#4 Le 20/08/2019, à 18:09

doc83

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Merci nany, cela n'a pas fonctionné pour moi mais la piste d'utiliser fpm ou cgi est peut-être à creuser en effet.

Merci aussi kamaris, ta solution a l'air de fonctionner, mais me connaissant je risque de me lancer dans une usine à gaz sans nom si je pars là dedans ^^'

Du coup je vais sûrement m'en tenir à sudoers, la seule chose qui m'embête c'est que je vais devoir mettre un wildcard sur le path et ça me plaît pas des masses (je fais un script d'installation générique pour du multi tenancy) :

www-data ALL=(ALL) NOPASSWD: /path/to/*/mon_script.sh

Si je trouve mieux je penserai à éditer le sujet smile


Financement participatif et crowdfunding https://www.alloprod.com

Hors ligne

#5 Le 20/08/2019, à 19:00

Watts

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Bonjour!

Le lanceur en C de Kamaris est très simple, il suffit simplement de copier son programme, de savoir compiler une seul fois ton programme et tu peux modifier ton script à loisir. Presque une meilleure méthode que de toucher au fichier des sudoers.


Acer Aspire X3990-Dual boot Windows 7 / Ubuntu 18.04

Hors ligne

#6 Le 20/08/2019, à 20:49

kamaris

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

C'est aussi et surtout le lanceur de pingouinux à la base (©) wink

Hors ligne

#7 Le 21/08/2019, à 08:15

maxire

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Salut,

Une autre piste possible, www-data est l'utilisateur de nginx, pourquoi ne pas utiliser systemd user manager cela permettrait de passer la commande :

systemctl --user reload nginx

sans du tout passer en mode super utilisateur.

Je n'ai aucune idée de la manière de permettre ce fonctionnement ni même de sa possibilité, il faudrait sans doute revoir le mode de lancement de nginx.
Si SystemD, comme je crois le comprendre, propose une gestion des environnements utilisateurs (user system manager), autant l'utiliser.


Maxire
Archlinux/Mate + Ubuntu 22.04 + Archlinux/Gnome sur poste de travail

Hors ligne

#8 Le 21/08/2019, à 12:01

bruno

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Bonjour,

C'est toujours très risqué de faire exécuter des scripts shell en tant que root via PHP. Si une faille de sécurité qui permet l'injection de code existe dans ton application PHP, cela aboutira à un accès root complet au serveur.
Je ne sais pas quel est ton besoin exact mais une manière sécurisée de faire cela est de passer par une tâche cron (de root) qui exécute régulièrement un script PHP (donc via php-cli et pas l'interpréteur apache ou php-fpm).

Dernière modification par bruno (Le 21/08/2019, à 12:01)

Hors ligne

#9 Le 21/08/2019, à 15:11

doc83

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

@maxire
La commande reload nginx n'était qu'un exemple, en fait je veux aussi créer un vhost à la volée, des répertoires etc.

@kamaris
J'ai réussi à faire fonctionner ton script, très simple en effet. Mais j'ai réussi uniquement avec mon user, quand c'est www-data qui appelle le lanceur, ça me dit que je n'ai pas les droits.

@bruno
Je n'y avais pas pensé je vais aussi essayer ça merci.


Financement participatif et crowdfunding https://www.alloprod.com

Hors ligne

#10 Le 21/08/2019, à 15:55

kamaris

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Si les droits d'exécution du lanceur sont bien attribués à other, il me semble que ça devrait marcher.
Il faudrait que tu donnes un retour de commande complet pour voir plus précisément les choses, ou plutôt même l'état des lieux que je donnais dans le post cité plus haut, avec tous les retours de commandes.

Hors ligne

#11 Le 21/08/2019, à 17:38

doc83

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Merci pour ta remarque, parce que du coup, le fait de détailler les étapes me permet en fait de créer le répertoire.
C'est donc dans mon code php de l'appli qu'il y a un truc qui foire.
Parce qu'avec un fichier php tout simple ça fonctionne du coup :

➜ ls
create_tenant.sh  exec.php  launch_as_root.c

➜ cat launch_as_root.c
#include <unistd.h>
int main () {
    char* arr[] = {"bash", "-p", "./create_tenant.sh", NULL};
    return execv("/bin/bash", arr);
}

➜ cat create_tenant.sh
#!/bin/bash
mkdir /etc/toto

➜ cat exec.php 
<?php
exec('./launch_as_root', $output, $ret);
var_dump($ret);

➜ make launch_as_root     
cc     launch_as_root.c   -o launch_as_root

➜ sudo chown root:root launch_as_root

➜ sudo chmod 4701 launch_as_root

➜ php exec.php
int(0)

C'est quand même bizarre mais je vais vérifier ça, sûrement une erreur débile.


Financement participatif et crowdfunding https://www.alloprod.com

Hors ligne

#12 Le 21/08/2019, à 18:07

doc83

Re : [Résolu] Autoriser www-data à exécuter des commandes sans sudo

Ok j'ai trouvé, comme le script php est exécuté depuis un autre endroit (dans mon appli), il fallait également que je définisse le path relatif dans launch_as_root.c.
Forcément dans l'exemple, tous les fichiers étaient au même niveau (donc erreur débile ^^').
Je vais prendre le temps de fignoler tout ça et quand c'est bon, je passe résolu wink
Merci encore à tout le monde et surtout kamaris !


Financement participatif et crowdfunding https://www.alloprod.com

Hors ligne