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 29/04/2014, à 10:44

tchene

Exécution de script perl en root via du php

Bonjour à tous,

Je viens vous voir aujourd'hui car j'ai un petit soucis de droit par rapport à l'exécution de scripts.

J'explique, j'ai créer deux petits scripts perl, l'un pour modifier les paramètres de la machine (Hostname, adresse IP, etc...) et un autre pour générer un certificat pour mes connexions SSL.
Les données sont saisie dans un formulaire PHP, puis lorsque j'appuie sur l'un ou l'autre des boutons, j'exécute un des scripts perl via la commande :

exec("sudo perl /chemin/vers/mon/script");

Jusqu'à maintenant en tout cas, car pour faire ça, j'avais modifier mon fichier sudoers et rajouté une ligne pour donner les droits a l'utilisateur apache sur l'éxécution de perl  :

www-data ALL= (root) NOPASSWD:/usr/bin/perl

Le soucis, c'est que comme faille de sécurité, je trouve ça pas mal puisque n'importe qui se faisant passer pour mon user apache peut exécuter n'importe quel script perl.

J'ai essayer de passer mes script sous propriétaire root puis de mettre le SUID dessus, mais bien sur, ça ne fonctionne pas (Ça aurait été trop simple hmm).

chown root:root mon_script
chmod 4755 mon_script

J'ai également essayer de modifier le sudoers pour n'exécuter que mes deux scripts :

# User privilege specification
root    ALL=(ALL:ALL) ALL
www-data ALL=(ALL) NOPASSWD: /var/www/apps/scripts/gen_cert.pl
www-data ALL=(ALL) NOPASSWD: /var/www/apps/scripts/modif.pl

Ou comme ça

Cmnd_Alias GENCERT = /var/www/apps/scripts/gen_cert.pl
Cmnd_Alias MODIF = /var/www/apps/scripts/modif.pl

# User privilege specification
root    ALL=(ALL:ALL) ALL
www-data ALL=(ALL) NOPASSWD: GENCERT
www-data ALL=(ALL) NOPASSWD: MODIF

Ça ne fonctionne pas non plus. Enfin pas totalement, les commandes de génération de certificat fonctionne mais pas le "mv" sur les fichiers de conf apache pour modifier le certificat utiliser.

Je me tourne donc vers vous pour savoir si vous ne connaîtriez pas un moyen d’exécuter ces deux scripts en tant que root mais sans donner trop de droits sur mon système et que toutes les commandes système fonctionnent.

Merci d'avance.

Dernière modification par tchene (Le 29/04/2014, à 11:26)

Hors ligne

#2 Le 29/04/2014, à 11:39

bruno

Re : Exécution de script perl en root via du php

Bonjour,

Plutôt que de t'embêter avec sudo et des modifications risquées de sudoers pourquoi ne rend tu pas simplement tes scripts exécutables par l'utilisateur www-data (ces scripts doivent bien sûr être en dehors du répertoire racine du serveur web).


Attention, les bouteilles vendues par Nestlé Waters sont contaminées au monoxyde de dihydrogène.

Hors ligne

#3 Le 29/04/2014, à 11:40

tiramiseb

Re : Exécution de script perl en root via du php

Salut,

Si je ne m'abuse, tu peux mettre la commande complète dans le sudoers : perl puis arguments.

Quelque chose dans ce genre :

www-data ALL= (root) NOPASSWD:/usr/bin/perl /var/www/apps/scripts/gen_cert.pl

Autre possibilité à essayer, mettre ce que tu as mis :

www-data ALL= (root) NOPASSWD:/var/www/apps/scripts/gen_cert.pl

Et dans le script PHP mettre :

exec("sudo /var/www/apps/scripts/gen_cert.pl");

Hors ligne

#4 Le 29/04/2014, à 12:04

tchene

Re : Exécution de script perl en root via du php

Tout d'abord merci à vous.

Bruno : Le soucis, c'est que ces deux scripts modifié des fichiers système pour lesquels seul root peut les modifier, je ne peux donc pas lancer le script en tant que www-data.

tiramiseb : Je viens de tester, il y a du mieux, maintenant mes commandes de génération de certificat s'éxécute bien, mes fichiers .key et .crt se créer bien. Le seul soucis c'est que je ne peux pas modifier le fichier "/etc/apache2/sites-available/default-ssl" pour modifier les certificats à utiliser.

Je vais quand même vous expliquer le script. En gros mon script "gen_cert.pl" va exécuter des commandes via lecture d'un fichier "serveur.conf" contenant les informations qu'il lui faut. Ce fichier est générer par mon script modif.pl au préalable. Ensuite, une fois le certificat générer, le script modifie le fichiers "default-ssl" de apache2 afin qu'il utilise les bons certificats. Et le problème viens de cette dernière partie. Et voici le script gen_cert.pl :

#!/usr/bin/perl

my $ligne="";
my @contenu;
my $i=0;

my $dir="/etc/ssl/certifs";

open(FILE_IN,"/var/www/apps/annexe/serveur.conf");
@contenu = <FILE_IN>;
close(FILE_IN);

foreach $ligne (@contenu)
{
        chomp($contenu[$i]);
        $i++;
}


#Génération de la clé
system "openssl genrsa 1024 > $dir/server.key";

#Génération de la requête intégrant la clé
system "openssl req -new -subj '/C=$contenu[1]/ST=$contenu[2]/L=$contenu[3]/O=$contenu[4]/CN=$contenu[0]'  -key $dir/server.key -out /tmp/server.csr";

#Génération du certificat
system "openssl x509 -req -days 3650 -in /tmp/server.csr -signkey $dir/server.key -out $dir/server.crt";

system "rm /tmp/server.csr";

#Modification du fichier /etc/apache2/sites-available/default-ssl

system "mv /etc/apache2/sites-available/default-ssl /tmp/default-ssl.tmp";
open(FILE_IN,'/tmp/default-ssl.tmp') || die "Impossible d'ouvrir le fichier /tmp/default-ssl.tmp : $!";
@contenu = <FILE_IN>;
close(FILE_IN);

open(FILE_OUT,'>/etc/apache2/sites-available/default-ssl') || die "Impossible de créer le fichier /etc/apache2/sites-available/default-ssl : $!";

foreach $ligne (@contenu)
{
        if ($ligne =~ /\sSSLCertificateFile\s[a-zA-Z0-9\-]*/ )
        {
                $ligne="        SSLCertificateFile $ssldir/server.crt\n";
                print FILE_OUT $ligne;
        }
        elsif ($ligne =~ /\sSSLCertificateKeyFile\s[a-zA-Z0-9\-]*/ )
        {
                $ligne="        SSLCertificateKeyFile $ssldir/server.key\n";
                print FILE_OUT $ligne;
        } 
        else
        {
                print FILE_OUT $ligne
        }
}
close (FILE_OUT);
system "rm /tmp/default-ssl.tmp";

system("service apache2 restart");

Et voici ce que me renvoie l'éxécution du script par l'utilisateur www-data :

Generating RSA private key, 1024 bit long modulus
...........++++++
............................++++++
e is 65537 (0x10001)
Signature ok
subject=/C=FR/ST=Vendee/L=La Roche sur Yon/O=IP3G/CN=Maitre-Distant.vip3g
Getting Private key
mv: impossible de déplacer «/etc/apache2/sites-available/default» vers «/tmp/default.tmp»: Permission non accordée
Impossible d'ouvrir le fichier /tmp/default.tmp : Aucun fichier ou dossier de ce type at gen_cert.pl line 44.

Hors ligne

#5 Le 29/04/2014, à 13:07

bruno

Re : Exécution de script perl en root via du php

Au temps pour moi, j'ai lu trop vite (et n'avais pas vu ta manip avec le SUID).
Je ne comprends pas pourquoi ton script ne semble pas être exécuté en tant que root (permission non accordée sur la commande mv), surtout si tu gardé le SUID dessus…

Il n'y a plus qu'a essayer :

exec("sudo -u root /var/www/apps/scripts/gen_cert.pl");

Attention, les bouteilles vendues par Nestlé Waters sont contaminées au monoxyde de dihydrogène.

Hors ligne

#6 Le 29/04/2014, à 14:03

tchene

Re : Exécution de script perl en root via du php

En fait ça fonctionne, j'avais fait le test en ligne de commande et j'avais zapper le sudo devant, du coup forcément, ça ne pouvais pas fonctionner.

Reste juste une erreur, le serveur apache s'arrête au lieu de redémarrer à la fin du script avec un jolie message d'erreur dans le fichier /var/log/apache2/error.log :

[Tue Apr 29 13:59:45 2014] [notice] caught SIGTERM, shutting down

Je viens de voir que ce message est envoyer lors d'un redémarrage du service, maintenant reste à savoir pourquoi il ne redémarre pas hmm

Dernière modification par tchene (Le 29/04/2014, à 14:08)

Hors ligne

#7 Le 29/04/2014, à 14:10

bruno

Re : Exécution de script perl en root via du php

Tu as probablement une erreur dans le fichier de configuration (default-ssl) que tu génères, ce qui empêche Apache de démarrer…


Attention, les bouteilles vendues par Nestlé Waters sont contaminées au monoxyde de dihydrogène.

Hors ligne

#8 Le 29/04/2014, à 14:35

tchene

Re : Exécution de script perl en root via du php

Je pense que ça doit venir du nom du serveur étant donner que c'est la seule chose qu'il m'affiche dans les logs, après si je le redémarre à la main y a pas de soucis donc je sais vraiment pas si c'est du à ça ou pas.

Hors ligne

#9 Le 29/04/2014, à 14:41

bruno

Re : Exécution de script perl en root via du php

Si cela marche en relançant Apache directement en ligne de commande, c'est que le problème vient du script Perl alors. Peut-être faut-il mettre une temporisation après cette commande :

system("service apache2 restart");

ou mieux tester si la commande s'est bien exécutée avant de terminer le script.

Dernière modification par bruno (Le 29/04/2014, à 14:41)


Attention, les bouteilles vendues par Nestlé Waters sont contaminées au monoxyde de dihydrogène.

Hors ligne

#10 Le 29/04/2014, à 14:43

tchene

Re : Exécution de script perl en root via du php

Et bien la commande marchais sur l'ancien serveur, c'est pour ça que je trouve bizzare qu'elle bug ici, mais j'vais continuer à fouiner de toute manière. Merci pour le coup de main.

Hors ligne