A quoi ça sert ?

Grace à ce script vous pourrez rapidement créer des hébergements Web sur votre serveur, à la manière d'un hébergement mutualisé.
C'est à dire qu'en fournissant au script un login, un mot de passe et un domaine, vous allez générer un espace web accessible par FTP, avec PHP5 ainsi qu'une base de données MySQL accessible via PHPMyAdmin.

Prérequis

Certains logiciels doivent déjà être installés et fonctionnels sur votre machine.
Ce script a été écrit et testé sous Debian Sarge, avec les logiciels suivant :

  • Serveur FTP -> Proftpd 1.2.10
  • Serveur Web -> Apache 1.3.33
  • Serveur de base de données -> MySQL 4.0.24
  • PHP 5.0.4-1 (DotDeb, package php5-cgi)

Principes

Chaque compte web est un compte système sur l'OS, donc à chaque compte correspond un user. Tous ces users seront créés dans le groupe (créé auparavant) vhosts.
Pour chaque user de cré nous avons donc un dossier supplémentaire dans /home, dans ce dossier seront redirigés les logs d'Apache pour le site correspondant, ainsi qu'un lien symbolique www qui pointera sur le répertoire web du compte.
Ce répertoire web se situe dans /var/www (racine d'Apache par défaut sous Debian).

Donc nous allons ainsi obtenir les arborescences de répertoires suivantes :

Arborescence des répertoires

Comme indiqué sur le schéma ci-dessus, chaque répertoire situé dans /var/www contiendra un répertoire cgi-bin ou sera placé l'exécutable php5, ainsi qu'un répertoire www qui lui accueillera les fichiers des sites web.
Le répertoire cgi-bin est indispensable car Apache utilisera le mode suExec pour fonctionner, c'est à dire que pour chaque site (Virtual Host), Apache tournera avec les droits de l'utilisateur associé. (Je vous renvoie à l'article correspondant dans la section Debian de ce site).

Mais pourquoi ce lien symbolique www dans les homes des users ?
Tout simplement car, par défaut dans la configuration de Proftpd, les utilisateurs qui se connectent en FTP sont redirigés dans leur /home/%user%,
or je voulais qu'ils se connectent directement dans leur dossier /var/www/%user%/www, il faut donc les rediriger via une configuration de Proftpd :

ServerName                      "Tatane"
ServerType                      standalone
DeferWelcome                    off
 
# reprise des transferts autoris?s
AllowStoreRestart               on
AllowRetrieveRestart            on
 
# les users du groupe "vhosts" tombent dans leur /var/www/%user%/www grace au lien symbolique
DefaultRoot                     ~/www vhosts
 
# les autres tombent dans leur /home/nom_user/
DefaultRoot                     ~
 
# penser à ajouter les logs des connections et transferts du serveur
SystemLog /var/log/proftpd/access.log
TransferLog /var/log/proftpd/transferts.log

Voilà donc pour le principe général de fonctionnement, passons maintenant au script proprement dit.

Le script

Ce script s'exécute en console et est interactif, il n'est pas difficile de l'adapter afin de l'attaquer via une interface web (ce sera l'objet d'un prochain article).

Paramétrage

Le script commence par vous demander les informations nécessaires à la création du compte :

  • login
  • pass
  • domaine
# récupération des paramêtres
echo -n "Entrez le nom du compte à créer : ";
read login;
 
echo -n "Entrez son mot de passe : ";
read password;
passmysql=$password
 
echo -n "Entrez le nom de domaine (sans \"www\", par exemple domaine.com) : ";
read domaine;
 
# vérification
echo
echo "Domaine  : $domaine"
echo "Compte   : $login"
echo "Passwd   : $password"
echo -n "Est-ce correct ? (o/[n]) "
read ans
if [ _$ans != _o -a _$ans != _O ]
then
     echo "Bye !"
fi

Création du user et des répertoires

Cette partie du script s'occupe de la création du user sur le système, de créer tous les répertoires et liens nécessaires, ainsi que de mettre en place les bonnes permissions d'accès aux fichiers.

# création du user (le programme s'arrête par sécurité si le user existe déjà)
/usr/sbin/useradd $login -p `perl -e "print crypt('$password',pwet)"` -g vhosts -d /home/$login -m -s /bin/bash
if [ $? -ne 0 ]
	then
	echo "L'utilisateur $login existe déjà, opération annulée !"
fi
echo " + Utilisateur \"$login\" cr??\n"
 
# création des répertoires
/bin/mkdir /home/$login/logs /var/www/$login /var/www/$login/www
echo " + Répertoires créés\n"
 
# Copie de php5-cgi dans le répertoire cgi-bin de l'utilisateur
/bin/cp -R /usr/lib/cgi-bin/ /var/www/$login/
echo " + php5-cgi copié\n"
 
# création du lien symbolique "www" nécessaire à Proftpd
cd /home/$login/
ln -s /var/www/$login/www/ www
echo " + Lien \"www\" créé\n"
 
# modifications des droits sur les dossiers
chown -R $login:vhosts /var/www/$login/
chown -R $login /home/$login/
chmod -R 755 /var/www/
echo " + Droits modifiés\n"

Apache

Il faut maintenant indiquer à Apache que le domaine correspond au site spécifié, pour cela nous utilisons les Virtuals Host d'Apache.
Pour simplifier la gestion de ces derniers nous allons isoler chaque Virtual Host dans un fichier de configuration séparé. Il faut donc créer un répertoire /etc/apache/vhosts qui accueillera ces fichiers.

mkdir /etc/apache/vhosts

Ensuite il faut inclure ces fichiers dans le fichier de configuration principal d'Apache, c'est à dire /etc/apache/httpd.conf :

# tout à la fin de votre httpd.conf
NameVirtualHost *
Include vhosts/*.conf

Voici la portion qui permet de créer ce fameux Virtual Host :

# création du virtual host (inclus dans httpd.conf)
echo "
<VirtualHost *>
        ServerName $domaine
        DocumentRoot /var/www/$login/www/
        ErrorLog /home/$login/logs/error.log
        CustomLog /home/$login/logs/access.log combined
        User $login
        Group vhosts
        ScriptAlias /cgi-bin/ /var/www/$login/cgi-bin/
        <Directory /var/www/$login/www/>
                AllowOverride All
                Options -Indexes +ExecCGI
                Order Deny,Allow
                Allow from all
        </Directory>
</VirtualHost>
 
" >> /etc/apache/vhosts/$login.conf
echo " + VirtualHost Apache créé\n\n"

Voilà , le gros du travail est fait, nous pouvons maintenant passer à la dernière étape qui est la création de la base de données.

MySQL

Tout d'abord une petite précision, si vous voulez vous servir de PHPMyAdmin, voilà la configuration d'authentification à utiliser dans le fichier config.inc.php :

// url de votre phpmyadmin
$cfg['PmaAbsoluteUri'] = 'http://mysql.votredomaine.com';
 
[...]
 
// votre phrase secrete pour le cryptage du cookie
$cfg['blowfish_secret'] = 'votresuperphrasequituetout';
 
[...]
 
// méthode d'authentification par cookie
$cfg['Servers'][$i]['auth_type']     = 'cookie';    // Authentication method (config, http or cookie based)?
$cfg['Servers'][$i]['user']          = '';          // MySQL user
$cfg['Servers'][$i]['password']      = '';          // MySQL password (only needed

Cette configuration permet de vous connecter à PHPMyAdmin avec le login et le mot de passe du compte créé et de ne voir que la base de donnée de ce compte (heureusement !).

Voici donc la dernière partie, la création du user et de la base ainsi que les droits associés :

# mysql
echo -n "Faut-il installer une base de donnée mySQL ? (o/[n]) "
read ans
if [ _$ans = _o -o _$ans = _O ]
then
	echo -n "Entrez le password root mysql :";
	read passroot;
 
	# création de la base
	/usr/bin/mysqladmin -u root -p$passroot create $login
	echo "Base MySQL \"$login\" cr??e\n"
 
	# création du compte + db + droits
	/usr/bin/mysql -u root --password=$passroot mysql <<END_COMMANDS
	GRANT ALL PRIVILEGES ON $login.* TO "$login"@"localhost" IDENTIFIED BY '$passmysql';
	FLUSH PRIVILEGES;
END_COMMANDS
 
	# redémarrage de la base
	/usr/bin/mysqladmin -u root -p$passroot reload
	echo "User MySQL \"$login\" cr??\n"
else
	echo "Tant pis ..."
fi

Voilà c'est fini

Ce petit script me simplifie grandement la vie depuis que je l'ai écrit. J'espère qu'il vous aidera vous aussi ...
Il se peut que des coquilles se soient glissées dans cet article, n'hésitez pas à me les faire remonter SVP.

Depuis le temps, avec un ami, nous avons amélioré ce script par l'ajout d'une interface web en PHP ainsi que les scripts de modification et suppression de compte, ils feront peut-être un jour l'objet d'un article, mais pour le moment je vous laisse vous amuser avec ce premier script !