Su/Sudo et autentification automatique

Su/Sudo et autentification automatique - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 03-09-2007 à 20:47:50    

Bonjour,
 
Je suis en train de faire une petite interface web qui doit permettre aux utilisateurs d'un de nos serveurs de changer leur mot de passe sans devoir passer par ssh.
Mon problème est le suivant :
Quand j'execute "su -l username -c 'command'" il me demande le mot de passe de l'utilisateur (logique). Cependant je n'arrive pas à le lui passer (vu qu'il le demande à apache). J'ai pensé à passer par les pipes mais apparemment su ne l'accepte pas.
 
Est-ce que vous auriez une idée de comment je peux m'y prendre?
 
Merci d'avance
 
P.S: Je sais que je peux donner les droits à apache (dans visudo) d'exécuter la commande qu'il me faut mais ça me semble vraiment pas très sécurisant (encore moins que la solution que je cherche)  


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 03-09-2007 à 20:47:50   

Reply

Marsh Posté le 04-09-2007 à 10:14:35    

Bon j'ai toujours pas trouvé comment faire en passant par Su, j'ai donc écrit un script passant par sudo en sécurisant le sécurisable :
 
visudo.sh (a executer en root la 1ere fois)
 

Code :
  1. echo "www-data CColomb=(ALL,!root) NOPASSWD: /usr/bin/passwd" >> /etc/sudoers


 
(Où www-data est l'utilisateur avec lequel tourne apache, CColomb est le nom de mon serveur, veillez à changer les path selon vos besoins)
 
La partie "interessante" du php  
 

Code :
  1. if(eregi('^[[:alnum:]_.[:space:]-_]*$',$_POST['password']))
  2.  { 
  3.   $command = 'sudo -u '.$user.' passwd';
  4.             $descriptorspec = array(
  5.        0 => array("pipe", "r" ),  // stdin is a pipe that the child will read from
  6.        1 => array("pipe", "w" ),  // stdout is a pipe that the child will write to
  7.        2 => array("file", "/tmp/error-output.txt", "a" ) // stderr is a file to write to
  8.        );
  9.   $process = proc_open($command, $descriptorspec, $pipes, $cwd, $env);
  10.   if (is_resource($process)) {
  11.    // 0 => writeable handle connected to child stdin
  12.    // 1 => readable handle connected to child stdout
  13.    // Any error output will be appended to /tmp/error-output.txt
  14.    fwrite($pipes[0], $_POST['password']."\n" );
  15.    fwrite($pipes[0], $_POST['password']."\n" );
  16.    fclose($pipes[0]);
  17.    fclose($pipes[1]);
  18.    // It is important that you close any pipes before calling
  19.    // proc_close in order to avoid a deadlock
  20.    $return_value = proc_close($process);
  21.    file_put_contents('/tmp/error-output.txt',"\n".$return_value."\n" );
  22.               }
  23.  }
  24.        else
  25.          echo '<p> Sorry but the password cannot contain special caracters other than white space, dot, underscore and dash</p>';


 
Attention : La seule raison pour laquelle je n'ai pas fait de test sur la variable $user (par exemple controler qu'elle ne contient pas de caractères dangeureux) est qu'elle est considérée comme "sûre" dans cette partie du code étant donné qu'elle est récupérée à partir d'un fichier en lecture seule, dont tout le contenu est sûr. Si vous obtenez le username via le formulaire il vous faut absolument faire les contrôles qui vont bien dessus ! Autrement vous risquez qu'on vous injecte du code dans votre ligne de commande (avec les conséquences qui s'en suivent!)
 
Si qqn à mieux je suis tout à fait ouvert :D
 
 
 


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed