Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
2184 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  lancer un bash avec php-apache

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

lancer un bash avec php-apache

n°1394566
kewan
Posté le 10-09-2016 à 15:33:23  profilanswer
 

:hello: tout le monde j'ai besoin de votre aide.
 
Je voudrais lancer un bash depuis une page php.
 
J'ai pour l'instant fait un bash juste pour faire des essais, le voici :

Code :
  1. #!/bin/bash
  2. echo 'azerty'
  3. mount /dev/sdb1 /mnt/cle


 
Je l'ai placé à la racine /test_bash.sh avec les attributs 777 pour les essais.
 
Voilà mon php :

Code :
  1. <?php
  2. $output = shell_exec('/test_bash.sh 2>&1');
  3. echo "<pre>";
  4. print_r($output);
  5. echo "</pre>";
  6. ?>


 
Le fichier /etc/sudoers :

Code :
  1. root ALL=(ALL:ALL) ALL
  2. www-data ALL = (root) NOPASSWD: /test_bash.sh


 
Et le résultat de :

Code :
  1. azerty
  2. mount: only root can do that


 
Impossible de lancer mon bash.
 
Comment y parvenir ?
 
Merci pour votre aide.

mood
Publicité
Posté le 10-09-2016 à 15:33:23  profilanswer
 

n°1394571
Ivy Gu
parfaitement antipathique
Posté le 10-09-2016 à 19:27:48  profilanswer
 

"sudo /test_bash.sh" peut-être ?


---------------
[:deroute_elkrief]
n°1394572
kewan
Posté le 10-09-2016 à 20:05:18  profilanswer
 

J'ai reussi
 
Reste à sécuriser.
 
/etc/sudoers :
 

Code :
  1. www-data ALL=NOPASSWD: /save_rsync.sh start
  2. www-data ALL=NOPASSWD: /maj_rsync.sh start


 
1er fichier php dans  /var/www/administrateur/sauvegarder.php :
 

Code :
  1. <?php
  2. $output = exec('sudo /save_rsync.sh start');
  3. echo "<pre>";
  4. print_r($output);
  5. echo "</pre>";
  6. ?>


 
2e fichier php dans  /var/www/administrateur/maj.php
 

Code :
  1. <?php
  2. $output = exec('sudo /maj_rsync.sh start');
  3. echo "<pre>";
  4. print_r($output);
  5. echo "</pre>";
  6. ?>


 
1er fichier bash dans /save_rsync.sh avec attributs 770
 

Code :
  1. #!/bin/bash
  2. # Demander le montage de la clé USB.
  3. source /monter_cle.sh
  4. if [ `grep -c "/mnt/cle" /etc/mtab` -eq 0 ]
  5. then
  6.  echo "La clé n'est pas montée"
  7. else
  8.  nom_dossier=$( date +%d_%m_%y-%Hh%M )_maison
  9.  rsync -a /var/www/ /mnt/cle/sauvegarde/$nom_dossier
  10.  mkdir /mnt/cle/sauvegarde/$nom_dossier/_
  11.  USER="root"
  12.  PASS="*****"
  13.  HOST="localhost"
  14.  BASE_SQL="maintenance"
  15.  mysqldump --opt -h$HOST -u$USER -p$PASS $BASE_SQL > /mnt/cle/sauvegarde/$nom_dossier/_/maintenance.sql
  16.  USER="root"
  17.  PASS="*****"
  18.  HOST="localhost"
  19.  BASE_SQL="td"
  20.  mysqldump --opt -h$HOST -u$USER -p$PASS $BASE_SQL > /mnt/cle/sauvegarde/$nom_dossier/_/td.sql
  21.  # Demander le démontage de la clé USB.
  22.  source /demonter_cle.sh
  23. fi


 
2e fichier bash dans /maj_rsync.sh avec attributs 770
 

Code :
  1. #!/bin/bash
  2. # Demander le montage de la clé USB.
  3. source /monter_cle.sh
  4. # Tester si la clé est montée. Si la clé n'est pas montée retourne 0.
  5. if [ `grep -c "/mnt/cle" /etc/mtab` -eq 0 ]
  6. then
  7.  echo "    /!\ Echec la clé n'est pas montée."
  8. else
  9.  # Aller dans le dossier sauvegarde de la clé USB.
  10.  cd /mnt/cle/sauvegarde
  11.  # Création de la variable dossier_save.
  12.  # dossier_save = dernier dossier modifié.
  13.  dossier_save=$(ls -1t | head -1)
  14.  echo $dossier_save
  15.  # Mise à jour de /var/www/
  16.  rsync -a --exclude '_/' --delete-after /mnt/cle/sauvegarde/$dossier_save/ /var/www
  17.  # Mise à jour de la base données.
  18.  USER="root"
  19.  PASS="*****"
  20.  HOST="localhost"
  21.  BASE_SQL="maintenance"
  22.  # Vider les tables.
  23.  mysqldump -u$USER -p$PASS --add-drop-database --add-drop-table --no-data $BASE_SQL > /root/bash/dumpfile.sql
  24.  mysql -u$USER -p$PASS $BASE_SQL < /root/bash/dumpfile.sql
  25.  # Mettre la base de données à jour
  26.  mysql -h$HOST -u$USER -p$PASS $BASE_SQL < $dossier_save/_/maintenance.sql
  27.  # Mise à jour de la base données.
  28.  USER="root"
  29.  PASS="*****"
  30.  HOST="localhost"
  31.  BASE_SQL="td"
  32.  # Vider les tables.
  33.  mysqldump -u$USER -p$PASS --add-drop-database --add-drop-table --no-data $BASE_SQL > /root/bash/dumpfile.sql
  34.  mysql -u$USER -p$PASS $BASE_SQL < /root/bash/dumpfile.sql
  35.  # Mettre la base de données à jour
  36.  mysql -h$HOST -u$USER -p$PASS $BASE_SQL < $dossier_save/_/td.sql
  37.  # Demander le démontage de la clé USB.
  38.  source /demonter_cle.sh
  39. fi

n°1394577
ccp6128
Syntax error
Posté le 10-09-2016 à 21:22:52  profilanswer
 

Si ton script est modifiable par ton utilisateur, alors il n'y a aucune sécurisation, tu viens de donner l'autorisation de lancer toutes les commandes du monde en root, puisque rien n'empêche d'éditer le script et de mettre toutes les commandes qu'il veut dedans.
 
Tes scripts devraient appartenir à l'utilisateur root, avec des droits en 755.
 
Edit : Vu que tu as des mdp dans ton script, plutot root + groupe auquel appartient ton user, et droits en 750, ou, mieux, tu n'autorises pas à lancer le script entier via sudo mais juste les commandes qui en ont besoin (genre mount et umount).


Message édité par ccp6128 le 11-09-2016 à 17:43:30
n°1394621
nex84
Dura lex, sed lex
Posté le 12-09-2016 à 09:13:03  profilanswer
 

+1  
PHP ne devrait pas lancer de script shell, question de sécurité de base.
 
Après question stupide : pourquoi un script shell ?
De quoi as-tu besoin qui doivent se lancer à partir de ton PHP ?


---------------
Come to the Dark Side, we have cookies.
n°1394641
Nukolau
Posté le 12-09-2016 à 13:52:50  profilanswer
 

Idem qu'au dessus, lancer un shell, sous root, depuis le compte du serveur web, c'est extrêmement dangereux.
 
Si tu n'as pas de besoin de réactivité énorme, le mieux serait a mon avis de passer par un traitement asynchrone : ton appli PHP dépose un flag dans un dossier quelconque de l'arborescence web (ou si tu as une base de données, un demande dans l'une des tables), et tu as un cron root (ou autre user avec sudo) qui tourne toutes les X secondes/minutes qui traite les demandes en attente.
 
Si tu as besoin de travailler en mode synchrone par contre, c'est plus compliqué. La seule solution que je vois comme ça, c'est de passer par un daemon qui tourne sous un user autre, et qui contrôle ce qui est demandé pour le déclencher via sudo. Ça évite que ton serveur web ait un droit sudo, mais tu restera vulnérable à certaines attaques :(

n°1394642
Ivy Gu
parfaitement antipathique
Posté le 12-09-2016 à 14:04:38  profilanswer
 

c'est quoi le risque exactement à lancer un script en root avec sudo depuis l'utilisateur d'apache ? (sans avoir les droits d'écriture sur le script)


---------------
[:deroute_elkrief]
n°1394647
nex84
Dura lex, sed lex
Posté le 12-09-2016 à 14:31:11  profilanswer
 

Ivy Gu a écrit :

c'est quoi le risque exactement à lancer un script en root avec sudo depuis l'utilisateur d'apache ? (sans avoir les droits d'écriture sur le script)


Ben ton contexte d'éxécution obtient l'élévation des privilèges root.
Du coup une attaque pouvant injecter du code (par exemple) le lancera avec les droits root.
Ce sera open bar pour lui.


---------------
Come to the Dark Side, we have cookies.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  lancer un bash avec php-apache

 

Sujets relatifs
[Bash] Restreindre sed ou awk à une colonne d'un fichier csvsoucis avec docker et reverse proxy apache
Ligne de log apache douteusesproblème Apache sur serveur perso
[CLOS] Compilation php4 + communication avec ApacheAide script modification HTML bash
Script BASH pour suppression fichiers multiples (même nom) dans arbo ?[Résolu] Bash : Récupérer la date de modification d'un fichier
linux bash concatenation de variableapache 2 - problème droits d'accès
Plus de sujets relatifs à : lancer un bash avec php-apache



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR