next up previous contents Next: uucp et uux. Up: Envoi de télécopies. Previous: De l'imprimante au télécopieur.   Table des matières  


34.2 Binaire d'interface setgid.

Le script présenté ci-dessus n'est toutefois pas suffisant. Dans ce qui précède, sendfax demande un accès au périphérique /dev/ttyS0 et au répertoire /var/lock/ (pour créer un fichier de verrouillage du modem, voir la section 35.4). Ceci ne peut se faire en tant qu'utilisateur lp (sous lequel le filtre que nous utilisons dans le script est exécuté). Sur RedHat, la commande ls -ald /var/lock /dev/ttyS0 montre que seul uucp est autorisé à accéder au modem. Pour contourner cette restriction, nous devons créer un binaire setgid (voir le chapitre 15) qui s'exécute en tant qu'utilisateur uucp. Réalisez cela en compilant le programme suivant:

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 
 
int main(int argc, char **argv) 
{ 
   char **a; 
   int i; 
 
/* set the real group ID to that of the effective group ID */ 
   if (setdig (getegid ())) { 
       perror (``sendfax_wrapper: setgid failed''); 
       exit (1); 
   } 
 
/* copy all arguments */ 
   a = (char **) malloc ((argc + 1) * sizeof (char *)); 
   for (i = 1; i < argc; i++) 
       a[i] = (char *) strdup (argv [i]); 
   a[argc] = NULL; 
 
/* execute sendfax */ 
   a[0] = ``/usr/sbin/sendfax'';  
   execvp (a[0], a); 
 
/* exit on failure */ 
   perror (``sendfax_wrapper: failed to execute /usr/sbin/sendfax''); 
   exit (1);  
}  


en utilisant les commandes:

gcc sendfax_wrapper.c -o /usr/sbin/sendfax_wrapper -Wall 
chown lp:uucp /usr/sbin/sendfax_wrapper 
chmod g+s,o-rwx /usr/sbin/sendfax_wrapper 


Ensuite, remplacez sendfax par sendfax_wrapper dans le script de filtre. Vous constaterez que sendfax_wrapper ne fait qu'exécuter sendfax après avoir converti l'ID du groupe en l'ID effectif du groupe (GID) tel qu'obtenu à partir de la fonction getegid à la ligne 12. L'ID effectif de groupe est uucp en raison du setgid (g+s) se trouvant dans la commande chmod. D'où le fait que sendfax est exécuté sous le groupe uucp avec un accès légitime au périphérique modem.

Sur votre propre système, il peut s'avérer plus judicieux d'essayer de mettre en oeuvre ce qui vient d'être décrit sans une interface (wrapper). Debian, par exemple, a un groupe dialout pour autoriser les accès aux modems. Soyez également conscient que certaines distributions n'utilisent pas forcément uucp de la même manière que RedHat. Vous devrez peut-être créer un utilisateur adéquat pour atteindre votre objectif.


next up previous contents Next: uucp et uux. Up: Envoi de télécopies. Previous: De l'imprimante au télécopieur.   Table des matières  
1-01-2006