Installation complète d'un serveur web sous Debian

Olivier Lange

Ce tutoriel vous explique étape par étape la configuration d'un serveur dédié sous Debian pour l'utiliser comme serveur web. Il a été installé sur une Debian Etch.

Attention. Ce tutoriel n'est valable QUE pour la version Etch de Debian (4.0). Si vous utilisez une Sarge (3.1), il est nécessaire de prendre le tutoriel correspondant. Néanmoins, certaines parties peuvent être reprises de celui-ci (notamment la partie SMTP ou les scripts). ♪

- Titre : Installation complète d'un serveur web sous Debian

- Auteur : Olivier Lange

- Parution : 1 novembre 2007

- Mise à jour : 1 novembre 2007

- Licence : Copyright ® 2007 Onet. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Prérequis

- I-A. Connaissances

- I-B. Matériel

- I-C. Software

- I-D. Remerciements

- I-E. Conventions typographiques

- I-F. Responsabilité

- II. Installation de base

- II-A. Préparer son serveur

- II-B. Installer apache 2

- II-C. Installer php 5

- II-D. Installer la base de données (Mysql)

- II-E. Installation de BIND9 (serveur DNS)

- II-F. Installation du serveur mail

- II-G. Installation du FTP (VSFTPD)

- III. Configuration d'Apache 2

- III-A. Introduction

- III-B. Prérequis

- III-C. Configuration d'apache2.conf

- III-D. Installation des virtualhosts

- IV. Configuration de Bind 9

- IV-A. Introduction

- IV-B. Named.conf

- IV-C. Création du fichier de configuration de zone

- V. Configuration de VSFTPD en mode « utilisateur virtuel »

- V-A. Introduction

- V-B. Préparation

- V-C. La base de données

- V-D. Modification de vsftpd.conf

- V-E. Paramétrer les utilisateurs

- V-F. Redémarrage et test

- V-G. Ajouter des users ultérieurement

- VI. Configuration de Postfix

- VI-A. Introduction

- VI-B. Création de l'utilisateur

- VI-C. Configuration de Mysql

- VI-D. Fichiers de configuration

- VI-E. Configurer le SMTP

- VI-F. Configuration du courrier

- VI-G. Test du serveur

- VI-H. Conclusion

- VII. Script

- VII-A. Installation d'un nouvel hébergement

- VII-B. création d'un sous-domaine

I - Prérequis

I-A - Connaissances

Ce tutoriel vous explique pas à pas comment installer un serveur dédié sous Debian. Chaque étape y est expliquée clairement, et dans l'absolu, il n'est pas nécessaire d'avoir des connaissances en informatique pour le suivre.

Néanmoins, et malgré la démocratisation des offres pour serveurs dédiés disponibles en francophonie (Suisse / France / Belgique) offert par OVH et FREE (par exemple), la gestion et la sécurisation d'un serveur dédié demande un minimum de connaissances du système Linux.

Pour bien pouvoir suivre ce tutoriel, vous devrez savoir au moins :

1. Vous connectez en root au moyen de SSH sur votre machine ;

2. Éditer un fichier de configuration en mode texte (VI, VIM, Nano, etc.) ;

3. Avoir des bases en programmation (copier, c'est bien, comprendre, c'est mieux !) ;

4. Être prêt à investir du temps, beaucoup de temps dans l'apprentissage de Linux !

S'il vous manque certaines informations, sachez qu'Internet en regorge. Ce tutoriel ne prétend pas voir tous les aspects de l'hébergement web. Il reste actuellement pas mal de points qui pourraient nécessiter une explication (installation d'.htaccess, configuration du SSL, création de script de sauvegarde…). Ce tutoriel sera donc amené à évoluer dans le futur. N'hésitez pas à me faire parvenir vos envies / idées.

I-B - Matériel

Qui dit serveur, dit obligatoirement ordinateur. L'avantage de Linux, c'est que vous pourrez faire tourner votre serveur web sur votre vieux 386 qui traine dans un coin. Ce tutoriel part du principe que vous disposez :

1. D'un serveur physique (hors VMWare, par exemple) ;

2. D'une adresse IP fixe ;

3. Ou simplement d'un serveur dédié loué chez un fournisseur (Sivit, OVH, Dedibox, etc.).

I-C - Software

Ce tutoriel est basé sur Debian Etch. La version utilisée est celle fournie par OVH sur ses distributions. Dans l'absolu, il n'y a que peu de différence entre différentes installations, et l'utilisation d'un serveur installé avec un cd original devrait sensiblement être identique.

Un tutoriel ne sera JAMAIS totalement complet ou totalement adapté à vos besoins. C'est une base de travail. À vous de le faire évoluer en fonction de vos besoins. Il est évidemment fourni en l'état, sans certification quant à sa réalisation. Néanmoins, je l'utilise personnellement en production, sans aucun problème depuis bientôt 1 an, à l'heure où j'écris ces lignes. :) (novembre 2007)

I-D - Remerciements

Il me sera difficile de remercier toutes les personnes qui ont contribué à ce tutoriel. Et j'ai peur d'en oublier (n'hésitez pas à me le rappeler, le cas échéant !). Mais je souhaiterais tout de même remercier :

- les membres de Developpez qui m'ont donné des idées ou des propositions d'évolutions ;

- les membres de Kimsufi.com qui m'ont supporté, et montré la nécessité d'un tel tutoriel ;

- plus particulièrement Fred036 pour m'avoir autorisé à reprendre et adapter son tutoriel sur Postfix ;

- spécialement Julien de fbtech.com pour son aide et sa patience quant à la résolution et la configuration du serveur SMTP authentifié ! ;

- Akira, mon chat, pour lequel j'ai été « absent » plusieurs jours à cause de celui-ci ;) ;

- un grand merci à Julp qui a effectué la correction orthographique de ce tutoriel (et qui s'est même remis au fourneau pour la correction de ce second tutoriel !).

I-E - Conventions typographiques

Rien de particulier à préciser, si ce n'est :

- # signifie que c'est une commande qui doit être écrite dans le shell ;

- > signifie que c'est une commande MySql qui doit être écrite après une connexion mysql en shell ;

- Chaque fichier $ édité est écrit avec son chemin absolu dans l'en-tête du code à modifier/écrire ;

- J'utilise nano comme éditeur de texte, notamment afin de simplifier l'utilisation par quelqu'un de non habitué.

I-F - Responsabilité

Ce tutoriel est avant tout une base de travail pour installer un serveur dédié. Chaque personne l'utilisant le fait à ses risques et périls. Je ne pourrais en AUCUN cas être tenu pour responsable en cas de perte d'informations, de destruction de données ou d'indisponibilité de votre serveur. Ce tutoriel est mis à la disposition sans AUCUNE garantie, et peut être amené à changer à tout moment! Si vous trouvez des erreurs, n'hésitez pas à me les signaler, que je puisse le mettre à jour !

II - Installation de base

II-A - Préparer son serveur

Se connecter en root sur le serveur puis effectuer une mise à jour :

aptitude update
aptitude upgrade

Une fois le serveur à jour, on peut commencer à installer les différents services nécessaires sur notre serveur. Attention, pensez à redémarrer les services après chaque installation ou reconfiguration :

# /etc/init.d/nom_service restart

II-B - Installer apache 2

Il nous faut installer un serveur HTTP qui va s'occuper d'afficher nos différentes pages. Pour cela, je vous propose d'installer l'un des serveurs les plus utilisés et les plus connus : Apache. Nous installerons ici sa version 2.

# aptitude install apache2
Tester l'installation d'apache : http://xxx.xxx.xxx.xxx/ (IP du serveur)

Vous pouvez supprimer la redirection sur /apache2-default/ :

# nano /etc/apache2/sites-available/default

#RedirectMatch ^/$ /apache2-default/

Pour accéder directement à la configuration des virtualhosts : ici

II-C - Installer php 5

Actuellement, notre serveur peut nous afficher des pages statiques au format HTML. La plupart des sites que vous voudrez installer disposeront d'une partie dynamique. C'est pourquoi nous poursuivons par l'installation de PHP 5 sur le serveur.

# aptitude install php5

II-D - Installer la base de données (Mysql)

PHP est très très souvent couplé à un système de base de données : Mysql. Nous installons ici Mysql-server version 5. Vous verrez plus bas que nous allons également installer phpmyadmin. Il s'agit d'un script php qui permet de gérer ses bases de données Mysql de façon très simple.

# aptitude install mysql-server

Définir le mot de passe root de Mysql (« mysql » par exemple). Dans l'écran suivant, il demande s'il faut gérer les connexions d'hôtes qui utilisent Debian Sarge. On répond OUI (répondre non empêchera la configuration de Postfix par la suite !).

On vérifie que Mysql fonctionne bien :

# mysql -p
entrer le mot de passe
>Exit;

Installer les librairies php5-mysql :

# aptitude install php5-mysql

Installer PhpMyAdmin :

# aptitude install phpmyadmin
Choix du serveur à paramétrer : Apache2
On redémarre Apache quand proposé

On se connecte par l'adresse http://xxx.xxx.xxx.xxx/phpmyadmin.

II-E - Installation de BIND9 (serveur DNS)

Maintenant que nous avons notre serveur web installé, il faut que nos visiteurs puissent nous trouver. Et il n'est guère facile de leur faire retenir une adresse du style: 213.251.175.34/~nom_de_mon_site. Si vous y arrivez, vous êtes un champion ;). C'est donc le travail de Bind de traduire notre nom de domaine. Il vous suffira de définir votre nom de serveur chez votre registar, dans la partie NS1.

# aptitude install bind9

Pour accéder directement à la configuration de Bind 9 : ici

II-F - Installation du serveur mail

Un serveur web sans serveur mail ne vous sera pas très utile. Le serveur mail est nécessaire pour différentes tâches administratives (envois de rapport cron, information en cas de problèmes, etc.), mais aussi simplement parce que vos sites hébergés souhaiteront disposer d'une ou plusieurs boîtes mails associées à leurs domaines !

# aptitude install postfix postfix-mysql
Choix de distribution : pas de configuration

II-G - Installation du FTP (VSFTPD)

Avoir un site disponible sur le NET, c'est bien. Pouvoir y mettre des fichiers, c'est mieux ;). Et c'est le but de VSFTPD qui est un serveur FTP très sécurisé.

# aptitude install vsftpd

III - Configuration d'Apache 2

III-A - Introduction

Pour commencer, il faut installer un serveur web au sens premier. C'est lui qui va nous permettre d'interpréter nos pages HTML, PHP, etc. Apache 2 est le serveur http le plus utilisé sur les serveurs. Il dispose d'un bon niveau de sécurité et de beaucoup de documentations disponibles sur le NET.

D'autre part, il permet de gérer des sites virtuels. Et c'est de cette manière que nous allons le configurer. En effet, le but étant de disposer de plusieurs sites sur notre serveur, il nous faut pouvoir les contacter directement avec une URL propre. Notre serveur ne dispose évidemment pas d'une adresse IP pour chaque site installé. Ce serait beaucoup trop complexe du point de vue physique à mettre en place. Et surtout, avec le système d'IPV4 utilisé actuellement, c'est impensable. Pour la petite histoire, le système IPV4 utilise quatre nombres de 0 à 255 sous la forme xxx.xxx.xxx.xxx. Cette série de nombres représente de manière unique chaque ordinateur connecté physiquement à Internet.

Certaines plages IP sont réservées pour des réseaux privés (192.168.x.x ou 10.x.x.x par exemple). Mais ce souci va être prochainement résolu avec l'utilisation de l'IPV6 qui est en train de s'implémenter. Cette nouvelle notation permet de passer de 2^32 à 2^128 IP différentes. Ce qui permettra d'en attribuer plusieurs à un même serveur, dans le futur.

Comme actuellement, c'est le protocole IPV4 qui est le plus utilisé, nous ne disposons en conséquence qu'une seule adresse IP pour 10 ou 100 sites à héberger sur notre serveur. Lorsqu'une requête HTTP est envoyée à notre serveur, le nom de domaine est transformé en adresse IP. La seule façon de différencier une demande venant de site1-cpnv.com ou de site2-cpnv.com, qui renvoient la même IP, passe par l'en-tête http, qui elle contiendra toujours le nom de domaine initialement demandé.

Lorsque la requête que nous désirons a atteint notre serveur http, celui-ci va regarder dans ses règles afin de trouver dans quel répertoire il doit se diriger. C'est là que la gestion des virtualhosts va intervenir. En conséquence, nous créerons une entrée pour chaque site hébergé sur notre serveur. Cette entrée contiendra le domaine prévu, et le répertoire de redirection.

III-B - Prérequis

Une fois que le serveur est installé de base, nous allons créer et configurer nos espaces d'hébergements. Tout d'abord, ce tutoriel part des principes suivants :

- vous désirez pouvoir accéder à vos sites par ip_du_server/~nom_user ;

- vous n'avez qu'une seule IP pour tous vos sites ;

- vous allez configurer BIND.

Dans cette première partie, nous allons modifier un fichier: /etc/apache2/apache2.conf, et créer des fichiers dans les répertoires /etc/apache2/sites-available et /etc/apache2/sites-enabled. Mais allons-y par étapes.

III-C - Configuration d'apache2.conf

On édite le fichier de configuration principal d'apache2 :

# nano /etc/apache2/apache2.conf

On vérifie la présence de ces lignes à la fin du fichier :

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/[^.#]*

On sauve les modifications, et on ferme le fichier.

À ce niveau-là, un /etc/init.d/apache2 restart permet déjà d'accéder aux répertoires privés de chacun de ses utilisateurs (penser à rajouter un dossier public_html dans ceux-ci pour voir quelque chose !).

Pour accéder directement à la configuration de VSFTPD : ici

III-D - Installation des virtualhosts

On va maintenant créer nos hôtes virtuels. Par défaut, je les appellerai test1.com et test2.com. À vous de mettre les noms que vous désirez. Mais avant de s'attaquer aux utilisateurs, on commence par modifier le squelette de la création des nouveaux users. L'avantage ? Ne pas avoir besoin à chaque fois de devoir créer le répertoire public_html et logs quand on crée un nouvel utilisateur, mais aussi d'avoir directement une page d'accueil.

Cette étape est inutile si vous utilisez mes scripts de configuration automatique à la fin de ce tutoriel.

# mkdir /etc/skel/public_html
# mkdir /etc/skel/logs
# echo " <h1>Nouvel espace web crée</h1> " > /etc/skel/public_html/index.html

Une fois le squelette créé, on peut ajouter un nouvel utilisateur :

# useradd -g www-data -m test1

On copie le contenu ci-dessous :

# nano /etc/apache2/sites-available/test1.com

<VirtualHost *>
ServerAdmin postmaster@test1.com
ServerName www.test1.com
ServerAlias test1.com *.test1.com
DocumentRoot /home/test1/public_html/
<Directory /home/test1/public_html/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
</Directory>
ErrorLog /home/test1/logs/error.log
LogLevel warn
CustomLog /home/test1/logs/access.log combined
ServerSignature Off
</VirtualHost>

On valide et on ferme le fichier. On rend le domaine créé disponible.

# ln -s /etc/apache2/sites-available/test1.com /etc/apache2/sites-enabled/test1.com

On redémarre apache2 :

/etc/init.d/apache2 restart

Et on peut accéder à notre répertoire :

http://xxx.xxx.xxx.xxx/~test1

Et on devrait voir une page web ! Il ne reste plus qu'à informer les visiteurs de la présence de ce site sur ce serveur. Et cela, c'est Bind qui s'en charge !

IV - Configuration de Bind 9

IV-A - Introduction

Un des points les plus problématiques de l'installation, la configuration de Bind9. Bind9 (Berkeley Internet Name Domain) est le serveur DNS le plus utilisé sur Internet. C'est lui qui va autoriser notre URL www.site1.com à pointer sur notre serveur (dans le cas d'une utilisation locale). En effet, il permet de transformer les différents alias en adresse IP, et donc de rediriger au bon endroit (sur le même serveur, en l'occurrence).

La configuration de Bind est un peu plus complexe que ce que nous avons vu jusqu'à maintenant. D'une part, parce que les différents tests à effectuer prennent du temps. En effet, la propagation des DNS prend de 6 à 48 heures, en fonction des FAI, et des registars. Ensuite, c'est la première étape qui aura une réelle incidence du point de vue extérieur sur notre serveur. Un Bind mal configuré, et nos sites sont inaccessibles !

L'installation de Bind en elle-même se fait comme pour les autres, vu que nous utilisons ici aussi les binaires disponibles. Une fois Bind installé, nous devons effectuer quelques ajustements. En effet, de base, le serveur Bind est fourni en open DNS. Ce qui signifie que n'importe qui peut utiliser notre serveur DNS. Cela peut poser des problèmes de sécurité, et surtout de serveur de relay DNS à des pirates, ou des spammeurs. Nous devons donc n'autoriser l'utilisation du serveur que depuis le serveur lui-même (localhost).

Une fois ceci effectué, nous devons créer une entrée dans la zone pour chaque domaine que nous hébergeons. Il s'agit en fait d'un simple fichier, que nous nommons : db.nom_domaine.tld par principe. Il est important de décortiquer ce fichier, qui contient de nombreux paramètres à configurer, et surtout à veiller à bien le faire.

Pour avoir des détails sur Bind, et les DNS ; je vous invite à vous rendre sur Wikipedia, où vous trouverez toutes les informations adéquates : BINDDNS

IV-B - Named.conf

Pour configurer Bind, nous allons modifier un ficher /etc/bind/named.conf et en créer un pour chaque domaine que nous désirons héberger.

# nano /etc/bind/named.conf

On ne touche pas aux données par défaut, mais on rajoute, après la dernière zone (1 entrée pour chaque domaine, évidemment. Et test1.com est à changer par votre nom de domaine, cela va de soi !). Nous avons 2 solutions ici. Soit nous modifions directement le fichier named.conf, soit nous pouvons ajouter nos déclarations de zones dans named.conf.local. À vous de voir comment vous désirez le faire :

zone "test1.com" {
type master;
file "/etc/bind/db.test1.com";
};

Une petite modification à effectuer, pour éviter que notre serveur ne serve de relay DNS ouvert. On ajoute ces lignes dans le fichier (entre les {}) :

# nano /etc/bind/named.conf.options

allow-recursion { localhost; };

Dans le cas où le fichier /etc/bind/named.conf.options n'existe pas (possible sur certains systèmes), il suffit d'ajouter le code suivant dans le fichier /etc/bind/named.conf :

# nano /etc/bind/named.conf

options {
allow-recursion { localhost; };
};

On valide et on sort du fichier.

IV-C - Création du fichier de configuration de zone

On crée le fichier de description de notre zone :

# nano  /etc/bind/db.test1.com

On entre les valeurs de notre domaine (ceci est un exemple. À vous de l'adapter à vos besoins/envies) :

$ttl 86400
test1.com.       IN      SOA     ksXXXXX.kimsufi.com. webmaster.test1.com. (
2006121903
21600
3600
604800
86400 )
test1.com.    IN      NS             ksXXXXX.kimsufi.com.
test1.com.    IN      NS             ns.kimsufi.com.
test1.com.    IN      MX              10 mail.test1.com.
test1.com.    IN    A           xxx.xxx.xxx.xxx
Server        IN    A        xxx.xxx.xxx.xxx
www        IN    A           xxx.xxx.xxx.xxx
mail        IN    A           xxx.xxx.xxx.xxx
smtp        IN    A           xxx.xxx.xxx.xxx
pop         IN    A           xxx.xxx.xxx.xxx
pop3        IN    CNAME        Server
imap        IN    A           xxx.xxx.xxx.xxx
sql        IN    A           xxx.xxx.xxx.xxx
mysql        IN    A           xxx.xxx.xxx.xxx

Quelques explications :

Champ

Description

2006121903

Est à modifier à chaque édition du fichier. Par convention, on l'écrit : année-mois-jour-numéro à deux chiffres

21600

Temps que le serveur esclave doit attendre avant de questionner à nouveau le serveur maître. Unité de temps: [s]

3600

Temps à attendre avant d'effectuer une nouvelle demande au serveur maître en cas de non-réponse. Unité de temps: [s]

604800

Temps d'expiration du serveur principal en cas de non-réponse. Unité de temps: [s]

86400

Temps de mise en cache minimum par d'autres serveurs DNS. Unité de temps: [s]

CNAME

Enregistrement de nom canonique qui dit au serveur de noms qu'un nom donné est aussi connu qu'un autre (alias)

A

Enregistrement d'adresse qui spécifie une adresse IP à assigner à un nom

NS

Enregistrement de serveur de noms (NameServer) qui annonce les serveurs de noms faisant autorité pour une zone particulière

MX

Enregistrement Mail eXchange, qui dit où doit se diriger le courrier envoyé à un nom d'espace particulier contrôlé par cette zone

SOA

Enregistrement « Start Of Authority », qui proclame des informations importantes faisant autorité à propos des espaces de nom pour les serveurs de noms

PTR

Enregistrement PoinTeR record, conçu pour orienter vers une autre partie de l'espace de nom

Si vous désirez avoir plus d'exemples sur la création de ce fichier, vous pouvez vous référer à l'adresse suivante : http://www.linux-kheops.com/doc/redhat72/rhl-rg-fr-7.2/s1-bind-configuration.html

On sauvegarde, on redémarre bind9.

# /etc/init.d/bind9 restart

Et voilà, il ne nous reste plus qu'à tester notre redirection, avec nos noms de domaine. Il est également possible d'avoir une description complète des différentes options de bind sous Google. Une simple recherche vous donnera une foule de sites pour cela !

Il y a deux possibilités pour tester notre fichier de configuration de zone :

- http://www.afnic.fr/outils/zonecheck ;

- http://www.dnsstuff.com/.

Si vous désirez installer un .fr, vous ne devrez plus avoir aucune erreur (fatal chez zonecheck ou case rouge chez dnsstuff). En effet, l'afnic refuse d'enregistrer vos domaines avec une erreur. Pour les autres domaines, c'est à tester directement avec votre registar. Mais quoi qu'il en soit, idéalement, il ne faudrait pas avoir une seule erreur, c'est évident !

V - Configuration de VSFTPD en mode « utilisateur virtuel »

V-A - Introduction

Maintenant que nous avons un site serveur web opérationnel, et la possibilité de créer nos bases de données, il devient nécessaire de mettre nos fichiers sur le serveur. Pour cela, nous installons VSFTPD. C'est un serveur FTP très sécurisé (Very Secure File Transfert Protocol Daemon).

VSFTPD dispose de plusieurs styles de paramétrage de base. Là encore, étant donné que nous souhaitons pouvoir disposer de plusieurs comptes FTP par domaine, et notamment d'avoir des comptes FTP qui pointent sur des sous-domaines, nous utiliserons le paramétrage par utilisateur virtuel.

Pour ce faire, nous allons utiliser une base de données de type Berkeley. Il s'agit d'une base de type non-sql. Elle n'est pas prévue pour être interrogée comme Mysql ou SQL server. En fait, il s'agit d'une table de hachage. Chaque enregistrement ne sera constitué que d'un login et d'un mot de passe. Ce type de base de données est indexé, extrêmement rapide et simple à mettre en œuvre. L'utilisation de ce type de base de données est obligatoire pour l'utilisation d'une identification de type PAM.

Pour le principe, nous ne définissons qu'un seul utilisateur UNIX à notre serveur FTP. Lorsque l'on se connecte avec un utilisateur, le programme vérifie dans notre base de données si celui-ci existe, et si le mot de passe correspond. À partir de là, il va chercher les paramètres concernés (chroot, droits spécifiques) et renvoie le répertoire concerné.

Grâce au chroot, il n'y a aucun souci de sécurité, car le répertoire est considéré comme étant un répertoire racine, il n'est donc pas possible de remonter la hiérarchie. Ce point est important du point de vue sécuritaire, car chaque connexion FTP utilise exactement le même utilisateur Unix : www-data.

Pour créer un nouvel utilisateur, il suffit de lui créer une entrée dans la base Berkeley, et un fichier de configuration personnel.

V-B - Préparation

On commence par préparer la configuration en créant le répertoire qui contiendra tous nos fichiers :

# mkdir /etc./vsftpd

On va devoir modifier la configuration de VSFTPD. Pour cela, on effectue une sauvegarde. Cela permettra de revenir en arrière en cas de souci :

# cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

V-C - La base de données

Il nous faut maintenant installer la base de données. On utilise pour cela la commande :

# aptitude install libdb3-util

Ce type de base de données est extrêmement simple, c'est pourquoi nous l'utilisons. Il se base sur un fichier de type texte contenant nos différentes informations, entrées une à une. En fait, il n'y a pas de tables ni de champs à configurer ! On va juste convertir un fichier contenant nos données sous cette forme :

login 1
password 1
login 2
password 2
...
login n
password n

On crée donc un fichier login.txt (le .txt n'est là que pour indiquer que ce sera nos données brutes ! Vous pouvez le nommer comme bon vous semble !). Puis on va le convertir en base de données. Actuellement, je n'ai pas encore trouvé le moyen de rajouter des données dans la base Berkeley directement. En conséquence, je garde le fichier login.txt, je lui donne des droits minimums (600), pour pouvoir régénérer la base par la suite.

# nano /etc/vsftpd/login.txt

user1
pass1
user2
pass2

# db3_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
# chmod 600 /etc/vsftpd/login.db
# chmod 600 /etc/vsftpd/login.txt

On va maintenant informer le module PAM d'utiliser notre base de données nouvellement créée. Pour cela :

nano /etc/vsftpd/vsftpd.pam

auth required /lib/security/pam_userdb.so db=/etc./vsftpd/login
account required /lib/security/pam_userdb.so db=/etc./vsftpd/login

# cp /etc/vsftpd/vsftpd.pam /etc/pam.d/vsftpd

Si le système nous informe que le fichier existe déjà, on l'écrase.

V-D - Modification de vsftpd.conf

On va maintenant modifier notre fichier vsftpd.conf. Pour cela, je vous en propose un, que vous pourrez modifier à votre convenance (les commentaires sont assez clairs, je pense) :

# nano /etc/vsftpd.conf

# Ceci configure VSFTPd en mode "standalone"
listen=YES

# On désactive les connexions anonymes
# et on active les non-anonymes (c'est le cas des utilisateurs virtuels) :
anonymous_enable=NO
local_enable=YES

# Pour des raisons de sécurité, on interdit toute action d'écriture :
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# 'guest_enable' est très important: cela active les utilisateurs virtuels !
# 'guest_username' fait correspondre tous les utilisateurs virtuels à
# l'utilisateur 'virtual' que nous avons défini plus haut, et au home
# correspondant : '~virtual/'.
guest_enable=YES
guest_username=www-data

# On définit les droits par défaut des fichiers uploadés
anon_umask=022

# On veut que les utilisateurs virtuels restent chez eux : '~virtual/'
# (attends, on leur a fait un toit, ce n'est pas pour rien !)
chroot_local_user=YES

# On définit le nombre maximum de sessions à 200 (les nouveaux clients recevront
# un message du genre: "erreur : serveur occupé").
# On définit le nombre maximum de sessions par IP à 4
max_clients=200
max_per_ip=10

####################################
# Debian customization             #
# (ou adoptons la Debian attitude) #
####################################
# Some of vsftpd's settings don't fit the Debian filesystem layout by
# default.  These settings are more Debian-friendly.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/vsftpd.pem

# Permet d'utiliser les configurations individuelles pour chaque utilisateur
user_config_dir=/etc/vsftpd/vsftpd_user_conf

V-E - Paramétrer les utilisateurs

On va maintenant chrooter nos utilisateurs dans leur répertoire respectif. Pour cela, on crée le répertoire qui sera utilisé pour contenir nos différents fichiers par utilisateur. Et on crée le fichier pour chaque utilisateur dans notre base de données.

# mkdir /etc/vsftpd/vsftpd_user_conf/

# nano /etc/vsftpd/vsftpd_user_conf/user1

anon_world_readable_only=NO
local_root=/home/user1
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

V-F - Redémarrage et test

On redémarre notre service FTP :

# /etc/init.d/vsftpd restart

Et il ne nous reste plus qu'à nous connecter à notre compte ftp en utilisant :

IP: ip du serveur ou nom de domaine
login: user1
password: password1

Et voilà. Un petit test, pour s'assurer que tout fonctionne, et c'est terminé ;). Dans le cas où vous ne pouvez pas uploader de fichiers, c'est que les droits ne sont pas corrects ou adaptés. Vérifiez bien que le répertoire /home/user1 a les droits www-data:www-data pour propriétaire et groupe (attention, récursif, donc valable pour tous les fichiers et répertoires contenus dans /home/user1) !

V-G - Ajouter des users ultérieurement

Une fois votre serveur FTP paramétré, vous voudrez sûrement rajouter des utilisateurs dans vos dossiers. Cela se fait de cette façon :

# echo "login" > /etc/vsftpd/login.txt
# echo "password" >> /etc/vsftpd/login.txt
# db3_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
# /etc/init.d/vsftpd restart

Il est parfaitement possible d'éditer le fichier login.txt et d'y rajouter les 2 lignes, plutôt que d'utiliser la commande echo !

VI - Configuration de Postfix

VI-A - Introduction

Que manque-t-il de crucial sur notre serveur web ? Un MTA. En effet, actuellement, nous pouvons accéder à notre site, le mettre à jour, et y exécuter des pages web. Il faut maintenant pouvoir envoyer et recevoir des mails.

C'est le rôle de Postfix. Un MTA (Mail Transfert Agent) très connu, très performant, et assez simple à mettre en œuvre. Une fois de plus, son choix a été décisif vis-à-vis de sa possibilité à gérer les utilisateurs virtuels. Chacun de nos sites sera désireux d'avoir un ou plusieurs mails. Ce système nous permettra de proposer un nombre infini de mails pour chaque site, sans risque de conflit entre utilisateurs.

VI-B - Création de l'utilisateur

On commence par rajouter l'utilisateur et le groupe qui gérera postfix.

Si vous désirez placer vos comptes mails dans le répertoire /home, pour des raisons de place notamment, pensez à modifier les fichiers en conséquence, de sorte qu'ils pointent vers /home/vmail par exemple (attention à le spécifier lors de la création du groupe !).

# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /var/spool/vmail/ -m

VI-C - Configuration de Mysql

Pour commencer, il faut autoriser mysql à se connecter en local (pour cela, rechercher et décommenter bind-adress) :

# nano /etc/mysql/my.cnf

bind-address            = 127.0.0.1
# skip-networking

On se connecte à mysql en root, afin de le configurer :

# mysql -p

On entre le mot de passe lorsque le shell nous le demande. On va maintenant ajouter nos paramètres Mysql :

> create database postfix;

> use postfix;

> CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (`domain`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Domaines Virtuels';

Si vous désirez utiliser le serveur smtp sécurisé, celui-ci est configuré en mode authentifié, pour éviter le spam. Cependant, je n'ai pas patché postfix, n'ayant pas eu la possibilité de le faire sur mes serveurs. Si l'un de vous l'a fait, qu'il n'hésite surtout pas à me faire parvenir la marche à suivre, et les différentes informations le concernant. En conséquence, si vous utilisez le smtp, il est nécessaire de rajouter un champ password_smtp dont le mot de passe sera enregistré en clair dans la base de données (vous pouvez le faire directement via phpmyadmin). L'enregistrement en clair est obligatoire, car le smtp de postfix non patché n'autorise que les mots de passe en clair. À vous de bien protéger vos données !

> CREATE TABLE `mailbox` (
`email` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`actif` tinyint(1) NOT NULL default '1',
`imap` tinyint(1) NOT NULL default '1',
`pop3` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (`email`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Boites Emails Virtuelles';

> CREATE TABLE `alias` (
`source` varchar(255) NOT NULL default '',
`destination` text NOT NULL,
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (`source`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Alias Virtuels';

On rajoute l'utilisateur mysql pour postfix (pensez à remplacer MONMOTDEPASSE par le mot de passe désiré).

> GRANT SELECT ON `postfix`.* TO 'postfix'@'%' IDENTIFIED BY 'MONMOTDEPASSE';

On applique les paramètres :

> FLUSH PRIVILEGES;

Et on termine notre session mysql.

> exit;

VI-D - Fichiers de configuration

On va éditer/créer nos fichiers de configuration. N'oubliez pas de mettre vos informations à jour, sous peine d'erreurs.

# nano /etc/postfix/main.cf

smtp_banner = $myhostname ESMTP (Debian / GNU)
biff = no
disable_vrfy_command = yes
smtpd_helo_required = yes

append_dot_mydomain = no

mydestination = nom_de_votre_serveur, localhost, localhost.localdomain

mydomain = nom_de_votre_serveur

myhostname = nom_de_votre_serveur

relayhost =

mynetworks = 127.0.0.0/8 ip_de_votre_serveur
inet_interfaces = all

# SASL
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key

# SASL 2nd version
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname,
reject_rbl_client opm.blitzed.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client sbl-xbl.spamhaus.org
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf, mysql:/etc/postfix/mysql-virtual_aliases_mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/vmail/
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "Desole, la boite email de l'utilisateur est pleine. Veuillez re-essayer plus tard !"
virtual_overquota_bounce = yes

# nano /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = quota
table = mailbox
where_field = email

# nano /etc/postfix/mysql-virtual_aliases_mailbox.cf

hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif='1'

# nano /etc/postfix/mysql-virtual_aliases.cf

hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif='1'

# nano /etc/postfix/mysql-virtual_mailboxes.cf

hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif='1'

# nano /etc/postfix/mysql-virtual_domains.cf

hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif='1'

On modifie les droits de ces fichiers de configuration :

# chgrp postfix /etc/postfix/mysql-virtual_*.cf
# chmod u=rw,g=r,o= /etc/postfix/mysql-virtual_*.cf

Un redémarrage de Postfix, et un test de la configuration :

# /etc/init.d/postfix restart
# postfix check

VI-E - Configurer le SMTP

# aptitude install libsasl2 libsasl2-modules libsasl2-modules-sql openssl

On se place dans le répertoire de Postfix, afin de créer les certificats autosignés

# cd /etc./postfix

On génère les certificats (il suffit de répondre aux questions! en mettant dans « common name » le nom du serveur)

# openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365  -x509

On sécurise les fichiers du certificat

# chmod 600 smtpd.cert smtpd.key

Et créer le fichier /etc/postfix/sasl/smtpd.conf pour la connexion sql

# nano /etc/postfix/sasl/smtpd.conf

auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: pass
sql_database: postfix
sql_select: select password_smtp from mailbox where email='%u@%r'

VI-F - Configuration du courrier

# aptitude install courier-base courier-authdaemon courier-libauth-mysql courier-imap courier-pop

À la question posée, on répond par oui.

On va maintenant signaler à postfix que l'on utilise mysql pour l'identification :

# nano /etc./courier/authdaemonrc

/etc./courier/authdaemonrc

Et on modifie la ligne qui commence par authmodulelist.

authmodulelist="authmysql"

Je remplace le contenu du fichier /etc./courier/authmysqlrc par ce qui suit :

# >/etc./courier/authmysqlrc
# nano /etc./courier/authmysqlrc

MYSQL_SERVER            localhost

MYSQL_USERNAME          postfix

MYSQL_PASSWORD          MOTDEPASSE

MYSQL_PORT              0

MYSQL_OPT               0

MYSQL_DATABASE          postfix

MYSQL_USER_TABLE        mailbox

MYSQL_CRYPT_PWFIELD     password

MYSQL_UID_FIELD         5000

MYSQL_GID_FIELD         5000

MYSQL_LOGIN_FIELD       email

MYSQL_HOME_FIELD        "/var/spool/vmail/"

MYSQL_MAILDIR_FIELD     CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')

MYSQL_QUOTA_FIELD       quota

On pense à redémarrer les différents daemons que l'on a paramétrés :

# /etc/init.d/courier-authdaemon restart
# /etc/init.d/courier-imap restart
# /etc/init.d/courier-pop restart

L'accès POP ou IMAP échouera si la boîte mail n'existe pas ! En conséquence, je vous conseille d'envoyer un email de bienvenue lors de la création de vos comptes. Cela vous permettra de créer le répertoire ! De plus, il est nécessaire de recréer les alias de bases de données. Pour cela, placez vous dans le répertoire /etc. et tapez la commande

newaliases

VI-G - Test du serveur

On commence par installer les outils :

# aptitude install mailutils

On teste que notre domaine est bien configuré dans bind pour accepter notre serveur mail :

# host -t MX nom_domaine

Il doit répondre nom_domaine mail is handled by 10 mail.nom_domaine.tld. Dans le cas contraire, il est nécessaire d'aller configurer BIND !

On va ajouter notre compte dans notre base de données. N'oubliez pas de remplacer les valeurs par les vôtres.

# mysql -u root -p
==> On entre le mot de passe
> use postfix;
> INSERT INTO domain (domain, actif) VALUES ('nom_domaine.com', '1');
> INSERT INTO mailbox (email,password,quota,actif,imap,pop3) VALUES ('user@nom_domaine.com',ENCRYPT('MONMOTDEPASSEDUCOMPTEMAIL'),0,1,1,1);
> exit;

Et maintenant, on va envoyer un mail à notre propre utilisateur, et à une adresse externe (j'ai testé avec Gmail sans que ce soit reconnu comme spam) :

mail -s sujet
To : user@nom_domaine.com
Cc : user@domaine_externe.com
texte du mail
.

- mail -s ==> pour envoyer le sujet. Remplacez le mot sujet par un sujet ;

- To : l'adresse du compte créé ci-dessus ;

- Cc : je mets une autre adresse pour tester la réception vers une adresse externe ;

- il faut terminer par une ligne contenant un . pour envoyer le mail.

Si vous vérifiez votre logiciel mail, vous devriez obtenir le mail envoyé en Cc. Pour tester le mail envoyé à votre utilisateur, il vous suffit de rentrer les bons paramètres dans votre logiciel de mail préféré (Thunderbird).

pop: mail.nom_domaine.com
smtp: votre FAI
login: user@nom_domaine.com
pass: *****

VI-H - Conclusion

Voilà, votre MTA (Mail Transfert Agent) est normalement configuré. Si vous ne recevez rien, vérifiez bien tous les paramètres. Il est important d'avoir autorisé la connexion en local lors de l'installation de mysql, par exemple. En cas de doute, ou de souci, allez voir les logs :

# nano /var/log/mail.log

(1)

VII - Script

De manière générale, si vous pensez qu'un script serait « top cool », n'hésitez pas à me MP pour me le demander. Peut-être qu'il est en cours de réalisation, ou qu'il traine sur mon ordinateur ;)

VII-A - Installation d'un nouvel hébergement

Ce script permet de créer les paramètres nécessaires pour créer un nouveau site. Il configure :

- Apache (virtualhost) ;

- Bind ;

- Vsftpd ;

- Postfix (création du compte mail webmaster) ;

- Copie des fichiers de base dans le répertoire home.

Ce script a besoin, pour être exécuté, de deux paramètres. Il génère un mot de passe aléatoire, ainsi que tout ce qu'il faut pour l'hébergement (base de données, ftp, compte mail). Vous pouvez lancer le script sans aucun paramètre, le système vous les demandera de façon interactive :

- le domain ;

- le tld.

Avant d'utiliser le script pour la première fois, il faut commencer par créer l'arborescence de base qui devra exister dans le nouvel hébergement créé. Dans le même répertoire que votre script, créer l'arborescence suivante :

fic_originaux/
fic_originaux/logs/
fic_originaux/public_html/
fic_originaux/public_html/index.html
fic_originaux/subdomain/

Vous pouvez évidemment mettre ce que vous voulez dans le dossier fic_originaux/public_html/. Pour ma part, je mets un fichier index.html contenant un message de bienvenue, et un fichier info.php qui contient la commande phpinfo(). Cela permet de vérifier que le php est activé et fonctionne correctement.

Ce script est livré en l'état, sans aucune assurance. Il peut être adapté, mais en aucun cas redistribué, sous quelque forme que ce soit. Il n'est certainement pas optimisé, mais il fonctionne avec le reste du tutoriel !

Pour exécuter le script, il faut lui donner les droits d'exécution (X), et le lancer sous cette forme :

./new_site.sh user mdp domaine

new_site.sh

# ------------------------------------------------------------------------------------------------------------------------
#                                               Script de création d'hébergement
#
#       Auteur:         Lange Olivier
#       Date:           2006/2007
#       Description:
#                       Script permettant d'ajouter un nouvel hebergement dans le serveur. Il crée tous les fichiers
#                       Nécessaire, et effectue les configurations de base.
#       Paramètre:      1° Nom du l'user Shell
#                       2° Nom de domaine
#
#        Remarque:        Ce script est configuré pour l'utilisation via ipfailover, et pour la séparation mysql / apache2
#                        sur 2 serveurs différents. Si les services sont disponibles sur le même serveur, il vous faut
#                        utiliser la même ip pour mon_ip et ip_mysql et éventuellement modifier le script pour bloquer
#                        le user mysql à localhost
#-------------------------------------------------------------------------------------------------------------------------
#!/bin/sh

#################################### Début des paramètres à configurer ########################################
# Mot de passe du compte root pour mysql
pass_root=mon_password

# Récupère l'IP du serveur
#mon_ip=`grep $HOSTNAME /etc./hosts |cut -f1`
mon_ip="87.98.129.88"
ip_mysql="91.121.63.55"
hostname="ns3532775.ovh.net"

# Définit l'email qui recevra les paramètres générés (admin's mail)
mail_envoi_param=mailbox@domaine.tld

# Définit les DNS utilisés:
ns1=ns1.domain.tld
ns2=ns2.domain.tld

################################## Fin des paramètres à modifier ###############################################

###############################################################################################################
#                        NE PAS TOUCHER PLUS BAS SI VOUS NE SAVEZ PAS CE QUE VOUS FAITES
###############################################################################################################

# Récupère le nom d'user créer

if $1; then
clear
echo "veuillez entrer le nom de domaine SANS le tld (ex: imavox)"
read new_user
echo "veuillez entrer le tld (ex: ch)"
read tld
else
new_user=$1
tld=$2
fi

# Récupère le nom de domaine
nom_domaine=$new_user.$tld

nom_base_sql=$new_user$tld

# Génère le mot de passe de 6 caractères
M="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
while [ "${n:=1}" -le "20" ]
do  pass="$pass${M:$(($RANDOM%${#M})):1}"
let n+=1
done

aleatoire=${pass:6:3}

password=${pass:0:6}

sql=${new_user:0:10}
new_user=$sql$tld$aleatoire

# Récupère la date de création pour générer le fichier Bind
date_creation=`date +%Y%m%d`01

# Défini le répertoire de base du user
rep=/home/$new_user

# Test si le répertoire existe, et donc le user
if [ -d $rep ]; then
echo "l'utilisateur est déjà géré par ce serveur"
else
if [ -e /etc/apache2/sites-enabled/$nom_domaine ]; then
echo "Le nom de domaine est déjà géré par ce serveur"
else

# Génère les fichiers de base du nouveau site
/usr/sbin/useradd -p $password $new_user
cp -R fic_originaux $rep
chown -R www-data:www-data $rep
chmod -R 755 $rep

# ------------------------------------------------------------------------------------------------------------------------
#                                               Configuration d'apache
#-------------------------------------------------------------------------------------------------------------------------

# Crée le fichier de configuration du répertoire virtuel
echo "
<VirtualHost *>
ServerAdmin postmaster@$nom_domaine
ServerName webmail.$nom_domaine
DocumentRoot /var/www/webmail/
<Directory /var/www/webmail/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
</Directory>
ErrorLog /home/$new_user/logs/error.log
LogLevel warn
CustomLog /home/$new_user/logs/access.log combined
ServerSignature Off
</VirtualHost>

<VirtualHost *>
ServerAdmin postmaster@$nom_domaine
ServerName mysql.$nom_domaine
DocumentRoot /var/www/phpmyadmin/
<Directory /var/www/phpmyadmin/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
</Directory>
ErrorLog /home/$new_user/logs/error.log
LogLevel warn
CustomLog /home/$new_user/logs/access.log combined
ServerSignature Off
</VirtualHost>

<VirtualHost *>
ServerAdmin postmaster@$nom_domaine
ServerName stats.$nom_domaine
DocumentRoot /home/$new_user/subdomain/stats/
<Directory /home/$new_user/subdomain/stats/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
AuthType Basic
AuthName \"$new_user $password\"
AuthUserFile /home/www/.htpasswd
Require valid-user
</Directory>
ErrorLog /home/$new_user/logs/error.log
LogLevel warn
CustomLog /home/$new_user/logs/access.log combined
ServerSignature Off
</VirtualHost>
<VirtualHost *>
ServerAdmin postmaster@$nom_domaine
ServerName www.$nom_domaine
ServerAlias $nom_domaine
DocumentRoot /home/$new_user/public_html/
<Directory /home/$new_user/public_html/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
</Directory>
ErrorLog /home/$new_user/logs/error.log
LogLevel warn
CustomLog /home/$new_user/logs/access.log combined
ServerSignature Off
</VirtualHost>

" >> /etc/apache2/sites-available/$nom_domaine
ln -s /etc/apache2/sites-available/$nom_domaine /etc/apache2/sites-enabled/$nom_domaine

# ------------------------------------------------------------------------------------------------------------------------
#                                               Configuration de BIND
#-------------------------------------------------------------------------------------------------------------------------

# Crée le fichier de déclaration de zone BIND
echo "
\$ttl 86400
$nom_domaine.   IN      SOA     $hostname. webmaster.$nom_domaine. (
$date_creation
21600
3600
604800
86400 )
IN      NS      $ns2.
IN      NS      $ns2.
IN      MX      10 mail.$nom_domaine.
IN      A       $mon_ip
www             IN      A       $mon_ip
mail            IN      A       $mon_ip
smtp            IN      A       $mon_ip
pop             IN      A       $mon_ip
pop3            IN      A       $mon_ip
imap            IN      A       $mon_ip
mysql           IN      A       $ip_mysql
webmail         IN      A       $mon_ip
stats           IN      A       $mon_ip
" > /etc./bind/db.$nom_domaine

# Crée la zone BIND
echo "zone \"$nom_domaine\" {
type master;
file \"/etc./bind/db.$nom_domaine\";
};
" >> /etc/bind/zones.conf

# ------------------------------------------------------------------------------------------------------------------------
#                                               Configuration du ftp principal
#-------------------------------------------------------------------------------------------------------------------------

# on ajout l'utilisateur et son mdp
rm -Rf /etc/vsftpd/login.db
echo "$new_user
$password" >> /etc/vsftpd/login.txt

# On met à jour la base berkeley
db3_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

# On ajoute les paramètre pour notre nouveau site
echo "anon_world_readable_only=NO
local_root=$rep
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES" > /etc/vsftpd/vsftpd_user_conf/$new_user

# ------------------------------------------------------------------------------------------------------------------------
#                                              Installation du compte mail par défaut
#-------------------------------------------------------------------------------------------------------------------------

mysql -u root -e "INSERT INTO domain (domain, actif) VALUES ('$nom_domaine', '1');" -p$pass_root postfix
mysql -u root -e "INSERT INTO mailbox (email,password,password_smtp,quota,actif,imap,pop3) VALUES ('postmaster@$nom_domaine',ENCRYPT('$password'),'$password'$
mysql -u root -e "CREATE DATABASE $new_user" -p$pass_root
mysql -u root -e "GRANT SELECT ON $new_user.* TO '$new_user'@'%' IDENTIFIED BY '$password';" -p$pass_root
echo "Votre compte à bien été paramétré" | mail -s "status OK" postmaster@$nom_domaine

# ------------------------------------------------------------------------------------------------------------------------
#                                               Redémarre les services
#-------------------------------------------------------------------------------------------------------------------------
/etc/init.d/bind9 restart
/etc/init.d/apache2 restart
/etc/init.d/vsftpd restart

echo "L'utilisateur $new_user bien été enregistrée sur le serveur"
echo "Le serveur a été redémarré"
echo "Le login ftp est: $new_user"
echo "Le mot de passe généré est: $password "
echo "les paramètres d'accès ont été envoyés à l'adresse mail $mail_envoi_param"

echo "voici les paramètres d'accès pour l'hébergement $nom_domaine :

login: $new_user
password: $password
nom domaine: $nom_domaine
ip: $mon_ip
ip mysql: $ip_mysql

pop: mail.$nom_domaine
imap: mail.$nom_domaine
smtp: mail.$nom_domaine

dns:
$ns1 (primaire)
$ns2 (secondaire)" | mail -s "Création compte: $nom_domaine" $mail_envoi_param

fi
fi

VII-B - création d'un sous-domaine

Ce script permet de créer un sous-domaine dans le répertoire /home/user/subdomain et de paramétrer les entrées DNS correspondantes, ainsi qu'un FTP chrooté (optionnel).

Pour générer le sous-domaine, vous devez entrer les informations suivantes :

- nom du sous-domaine à créer ;

- nom de domaine principal ;

- domain ID (nom du répertoire) ;

- 1 si ftp à créer, vide sinon.

Il vous faut soit entrer les paramètres lors de l'exécution du script, soit laisser vide, auquel cas le script vous les demandera de manière interactive.

Ce script est livré en l'état, sans aucune assurance. Il peut être adapté, mais en aucun cas redistribué, sous quelque forme que ce soit. Il n'est certainement pas optimisé, mais il fonctionne avec le reste du tutoriel !

new_subdomain.sh

# ------------------------------------------------------------------------------------------------------------------------
#                                               Script de création de sous-domaine
#
#       Auteur:         Lange Olivier
#       Date:           2007
#       Description:
#                       Script permettant d'ajouter un sous-domaine à un hébergement existant
#       Paramètre:      1° Nom du sous-domaine à créer
#                       2° Nom de domaine principal
#                        3° Domaine ID (nom du répertoire dans /home
#                        4° création d'un FTP? (mettre à 1 si oui, laisser vide si non)
#-------------------------------------------------------------------------------------------------------------------------

#!/bin/sh

######################################## Paramètres à modifier ##############################
mon_ip=

######################################## FIN Paramètres à modifier ##############################

if $1; then
clear
echo "veuillez entrer le nom du sous-domaine (ex: demo)"
read subdomain
echo "veuillez entrer le domaine principal (ex: imavo.ch)"
read domain
echo "Veuillez spécifier l'id du domain (nom du répertoire)"
read domainId
echo "Définit si il faut créer un ftp ou pas (laisser vide si pas de ftp)"
read isFtp
else
subdomain=$1
domain=$2
domainId=$3
isFtp=$4
fi

mkdir /home/$domainId/subdomain/$subdomain

cat /etc/apache2/sites-available/$domain > /root/temp
echo "<VirtualHost *>
ServerAdmin webmaster@$domain
ServerName $subdomain.$domain
DocumentRoot /home/$domainId/subdomain/$subdomain/
<Directory /home/$domainId/subdomain/$subdomain/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
</Directory>
ErrorLog /home/$domainId/logs/error.log
LogLevel warn
CustomLog /home/$domainId/logs/access.log combined
ServerSignature Off
</VirtualHost>" > /etc/apache2/sites-available/$domain
cat /root/temp >> /etc/apache2/sites-available/$domain

echo "$subdomain                IN      A       $mon_ip" >> /etc./bind/db.$domain

if [ $isFtp ]; then

# Génère le mot de passe de 6 caractères
M="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
while [ "${n:=1}" -le "20" ]
do  pass="$pass${M:$(($RANDOM%${#M})):1}"
let n+=1
done

password=${pass:0:6}

echo "$subdomain@$domain" >> /etc/vsftpd/login.txt
echo "$password" >> /etc/vsftpd/login.txt
rm -f /etc/vsftp/login.db
db3_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
/etc/init.d/vsftpd restart

echo "anon_world_readable_only=NO
local_root=/home/$domainId/subdomain/$subdomain
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES" > /etc/vsftpd/vsftpd_user_conf/$subdomain.$domain

fi

/etc/init.d/apache2 restart
/etc/init.d/bind9 restart

(1)Je tiens tout particulièrement à remercier Fred036 pour son aide, et la mise à disposition de son tutoriel, qui m'a bien aidé, et dont je me suis largement inspiré pour ce tutoriel sur Postfix. Je tiens également à remercier tout particulièrement Julien de fbtech.com pour son aide dans la mise en place du smtp, qui m'a posé de relatifs problèmes !