le monde de crabs (Christophe Cazajus)

DNS dynamique, Apache, virtual host et suexec

Important

Ce document s'adresse à des personnes ayant déjà une bonne connaissance d'apache, des cgi et de l'administration d'un système. Avoir déjà compiler son propre serveur apache et php est un pré requis.

On se concentre ici sur les produits que sont apache et php, il ne s'agit en aucun cas d'une procédure complète d'installation d'un serveur mutualisé. A vous d'adapter en fonction de votre environnement.

Les objectifs

Mon PC perso se comporte, lorsqu'il est allumé, comme un serveur WEB, serveur de Mail, et Firewall/Routeur. Je le rends accéssible depuis Internet via le DNS dynamique (dyndns.com).

J'ai décidé récemment de faire un produit permettant d'activer et de configurer simplement un firewall autour d'iptables (Netfilter). J'ai doté ce produit d'un petite interface de management (surtout des statistiques, le paramétrage étant réservé à root) via une interface HTTP.

Là j'ai rencontré 2 soucis, je ne voulais pas utilisée une URL de type ~firewall, ET je ne voulais que l'utilisateur par défaut des sites en développement ait accès au données du firewall.

De plus, je voulais doter mon PC d'une interface Web Mail (squirrelmail) accessible depuis une url du type mail.mon_domaine.dyndns.com.

Que faut-il mettre en oeuvre

Après quelques recherches sur le net, il apparaît qu'il faille faire 3 choses

Autant le paramétrage des hôtes virtuels sous apache est directement accessible via le fichier de configuration du serveur http, autant l'activation et la configuration du module suexec ne peut se faire que via la compilation. Ainsi l'équipe de développement d'apache envisage sereinement la mise en oeuvre de ce module en respectant quelques consignes de mise en oeuvre.

Le service de noms (hosts et DNS)

Utilisant un domaine dynamique fourni par dyndns.com, en mode statique (j'ai une ip fixe), j'ai juste activé les 'wildcard' sur mon compte (option 'Enable Wildcard'). Cela fonctionne aussi avec un service en IP dynamique.

Ensuite un petit man hosts pour définir les alias pour la résolution des noms en local, pris automatiquement en compte par la masquerade DNS pour le réseau privé local.

Activer SUEXEC

Fidèle à ma pratique, j'utilise toujours les .SlackBuild fournit dans les sources des packages pour recompiler les produits Slackware.

L'activation de SUEXEC, qui va permettre au démons apache d'effectuer le changement d'utilisateur avant de lancer le script CGI. En réalité un processus apache va lancer le programme suexec qui effectue le changement d'utilisateur et qui lance ensuite le script CGI.

Avant de continuer vous devez décider de comment sera architecturé votre serveur...

Architecturer son serveur

La compilation

Préparation de la compilation

télécharger tous les fichier contenu dans les sources d'apache depuis la zone source de la Slackware (cluster N).

Modification du apache.SlackBuild

# vi apache.SlackBuild

Modification de la variable TMP (début du script)

TMP=$CWD/../TMP

Ajout des options suexec pour apache

--enable-suexec \ --suexec-caller=www_user \ --suexec-uidmin=uid_min \ --suexec-gidmin=gid_min \ --suexec-safepath=/bin:/usr/bin:/usr/local/bin \ --suexec-userdir=www_userdir \ --suexec-umask=022 \ --suexec-docroot=www_home

Lancement de la compilation

# ./apache.SlackBuild

Installation du nouveau package

# apachectl stop
# cd ../TMP
# upgradepkg --reinstall apache-*.tgz
# apachectl start

Et pour PHP ?

La solution que j'ai trouvé pour PHP consiste à ne plus utiliser le module apache php, mais à lancer les scripts PHP en mode CGI.

Important : l'option --enable-discard-path est incompatible avec --enable-force-cgi-redirect.

Pour réaliser la compilation et l'installation, se reporter à ce document : Installer php4 et php5 sur une Slackware Linux

Il faut faudra néanmoins réaliser les adaptations suivantes :

# vi php/crabs_php.SlackBuild
    

modifier le prefix d'installation

./configure --prefix=/usr/php4 \

modifier le sysconfdir

--sysconfdir=/usr/php4/etc

supprimer la ligne --enable-discard-path

Commenter les lignes de compilation du module

# php_configure --disable-static --with-apxs=/usr/sbin/apxs # make -j3 # make install INSTALL_ROOT=$PKG # make distclean # PHP likes to install Pear with some strange permissions. # chmod 755 $PKG/usr/bin/pear

On fera une installation directe

# Make the standalone interpreter: php_configure --enable-force-cgi-redirect --enable-fastcgi --enable-pcntl --enab le-sigchild make -j3 exit make install-cli INSTALL_ROOT=$PKG

Lancer la compilation

# ./crabs_compil.sh

Puis en tant que root

# cd php
# make install
# cd ../php-5.*
# make install

La configuration d'apache

Afin que cela fonctionne correctement, il faut commenter les lignes faisant référence à php comme module dans le httpd.conf :

    #LoadModule php4_module        libexec/apache/libphp4.so
    #AddModule mod_php4.c
    #AddType application/x-httpd-php .php

Et ajouter les redirections php vers cgi

    AddHandler php4-cgi .php
    AddHandler php5-cgi .php5
    Action php4-cgi /cgi-bin/php4.cgi
    Action php5-cgi /cgi-bin/php5.cgi

Modifier le UserDir en fonction de votre paramétrage suexec

    UserDir www_userdir

Puis copier les différents interpréteurs PHP vers votre dossier cgi-bin.

  • L'interpréteur PHP4 : /usr/php4/bin/php vers php4.cgi
  • L'interpréteur PHP5 : /usr/php5/bin/php vers php5.cgi

Ensuite, il faut créer les dossiers etc pour chaque interpreteur PHP et y copier vos php.ini

# mkdir /usr/php4/etc /usr/php5/etc

On termine en redemarrant apache

# apachectl restart

Dès maintenant, une url de type ~user, permet de faire le changement automatique d'uid pour les cgi et les scripts php (si vous avez autorisé le lancement des cgi pour vos utilisateurs).

prérequi pour mettre en oeuvre les 'virtuals hosts'

Tout ce passe dans le fichier de configuration d'apache.

Activer le mécanisme des hôtes virtuels basés sur les noms

décommenter la ligne suivante

NameVirtualHost *:80

Préciser le 'hôte' par défaut

<VirtualHost *:80>
      ServerName localhost
      DocumentRoot votre_DocumentRoot
</VirtualHost>

Tous les ajouts des virtuals hosts se feront après ces lignes.

Ajouter une url de type mail.votre.domaine

Dans ce cas-là, il n'y aura pas de changement d'utilisateur. A vous de paramétrer votre service DNS, je donne l'info en utilisation DnsMasq.

Gestion du DNS : ajout d'alias au nom du serveur

# vi /etc/hosts
ip_réseau_local nom_normal nouveau_nom nouveau_nom.votre.domaine

Fichier de configuration d'apache : ajout des lignes

# vi httpd.conf
<VirtualHost *:80>
   ServerName nouveau_nom
   ServerAlias nouveau_nom nouveau_nom.domaine
   DocumentRoot DocumentRoot_de_ce_serveur
</VirtualHost>

Ajouter une url de type nouveau.domaine

Pour l'exemple, le nouveau domaine est géré par un utilisateur différent de l'utilisateur faisant tourner apache. L'exemple repose sur l'utilisation de DynDNS et DnsMasq. Dans la réalité, il faut gérer au niveau DNS une redirection du nouveau domaine vers l'adresse IP de votre serveur.

Gestion du DNS : ajout d'alias pour le nouveau serveur

# vi /etc/hosts
ip_réseau_local nom_normal user nouveau_domaine

Fichier de configuration d'apache : ajout des lignes

# vi httpd.conf
<VirtualHost *:80>
   ServerName user
   ServerAlias user nouveau_domaine
   DocumentRoot /home/www_userdir
   Action php4-cgi /cgi-bin/user/php4.cgi
   Action php5-cgi /cgi-bin/user/php5.cgi
   User user
   Group group
</VirtualHost>

user et group sont respectivement le username et le groupname de l'utilisateur.

home est le home de votre utilisateur. Ce répertoire doit être un sous-dossier de www_home.

Copier les interpréteurs php pour qu'ils fonctionnent avec le méchanisme suexec

cgi-bin correspond à votre dossier mis en ScriptAlias dans la configuration d'apache

# mkdir cgi-bin/user
# cp /usr/php4/bin/php cgi-bin/user/php4.cgi
# cp /usr/php5/bin/php cgi-bin/user/php5.cgi
# chown -R user:group cgi-bin/user
# chmod -R u+rwx cgi-bin/user

Améliorations ?

Sachant que suexec interdit l'utilisation de lien symbolique, on peut écrire des 'wrapper' pour php4.cgi et php5.cgi. La performance déjà dégradée de PHP par l'utilisation du mode CGI n'en sera pas améliorée, mais il permettra d'économiser presque 10Mo par utilisateur.

Sur mon serveur de développement, j'autorise l'utilisation de tous les cgi pour les utilisateurs, faut-voir s'il n'est pas possible de n'autoriser que les php*.cgi.

Exemple de 'wrapper' pour php4.cgi

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

char*   php4_cgi = "/usr/php4/bin/php" ;
int main( int argc, char**argv )
    {
    char buff [2048]        ;
    extern int errno ;
    execl( php4_cgi, php4_cgi, NULL ) ;
    snprintf(buff,sizeof( buff ),"execl(%s):%s\n",php4_cgi,strerror(errno));
    write( 2, buff, strlen( buff ) ) ;
    exit(100) ;
    }

Renseignez-vous sur les brevets logiciels en Europe :

NoSoftWarePatents.com (en français)

Les images représentant des sociétes, des associations ou des marques restent associées, par un lien, à ces sociétés, associations ou marques. Elles ne signifie en rien que ces sociétés, associations ou marques soutiennent ce site.

Sauf précisions contraire, le contenu de ce site est mis à disposition sous un contrat Creative Commons.

Les informations fournies le sont sans aucune garantie. L'auteur ne pourra être tenu responsable de leurs utilisations.

De par l'utilisation du HTML 4.01 Strict et des CSS 2.1, le monde de crabs sera correctement vu avec les navigateurs respectant ces normes, Mozilla ou FireFox par exemple.

Site : Le Monde de Crabs
Titre : DNS dynamique, Apache, virtual host et suexec
Date du document : 16/10/2005
Auteur : Christophe Cazajus
Mail : crabs(mettre le @)crabs-world.com
ou utiliser ce formulaire de contact
Mots-clé : crabs, monde, francais, francophone, français, apache, suexec, virtual host, cgi, dynamic dns, dns dynamique, dyndns.com
Description : configurer un serveur perso de développement afin que celui-ci se comporte comme un serveur mutualisé.
Validation : html, csshtml, ccs
The Linux Counter
Info iconelvis iconbash iconphp icongimp iconpovray iconxml iconxslt iconcss iconhtml icon
Slackware Linux
Creative Commons License

Le calendrier et les scores du Stade Toulousain sont accessibles sur cette page : Le monde de crabs et le Stade Toulousain.

Crabs's World : English Section