Richard Dern

Installation d'un serveur HTTP/HTTPS

On continue notre nouvelle série d’articles. Après avoir créer un pare-feu de base que nous complèterons au fil des articles, après avoir mis en place une autorité de certification, puis un serveur DNS et un serveur mail, nous nous attaquons maintenant à l’installation du serveur apache.

Apache devra pouvoir desservir des pages aussi bien en HTTP qu’en HTTPS, permettre l’utilisation de langages comme PHP et les scripts CGI, tout en assurant une bonne réactivité et un degrés certain de sécurité.

Un serveur HTTP(S) nous permettra de mettre en place une grande variété de services : dans un premier temps, un outil pour gérer notre base de données et un client mail, puis par la suite, un blog, un wiki, un lecteur de flux RSS, etc.

Il nous permettra également de mettre en place un proxy pour simplifier l’accès à des applications offrant une interface web, partager et accéder aux fichiers, et bien d’autres choses encore. Rappelons que l’objectif est de s’affranchir de tout outil du Cloud, proposé par de grandes entreprises telles que Google. Apache en sera un moyen d’y accéder facilement.

Important : Top Level Domain

_mail.exemple.fr_

_exemple.fr_

_.fr_

Ce petit rappel effectué, on peut organiser les sites desservis par apache de la manière suivante :

/var/www			Racine
/var/www/exemple.fr		Racine du domaine
/var/www/exemple.fr/mail	Racine du sous-domaine mail
/var/www/exemple.fr/mail/www	Racine du site hébergé
/var/www/exemple.fr/mail/log	Journaux
/var/www/exemple.fr/www		Racine du domaine principal
/var/www/exemple.fr/www/www	Racine du site hébergé
/var/www/exemple.fr/www/log	Journaux

Une telle arborescence permet d’organiser correctement les différents sites qui pourront être desservis par Apache, tout en ayant rapidement à portée de la main les journaux pour chaque sous-domaine. Cela nous permettra également de confier ces journaux à une application telle que awstats pour une analyse plus efficace que si tous les journaux étaient regroupés dans le même fichier.

Avant toute chose, installons quelques paquets, stoppons apache, et supprimons les hôtes virtuels par défaut :

apt-get install apache2 libapache2-mod-php5 php5 php5-mysql php5-mcrypt php-mdb2 php-mdb2-driver-mysql
/etc/init.d/apache2 stop
a2dissite default && rm /etc/apache2/sites-available/default
a2dissite default-ssl && rm /etc/apache2/sites-available/default-ssl
cd /etc/apache2

On désactive ensuite totalement la journalisation dans apache :

rm conf.d/other-vhosts-access-log
nano apache2.conf

Commentez la ligne :

ErrorLog ${APACHE_LOG_DIR}/error.log

Comme on va également faire appel à SSL, on active le port 443 :

mv ports.conf ports.conf-orig
nano ports.conf
NameVirtualHost *:80
NameVirtualHost *:443
Listen 80
Listen 443

On va continuer en créant quatre arborescences différentes, pour quatre sites différents.

Le premier pourrait être simplement qualifié de bonne pratique : afin d’accélérer le chargement des pages, il convient de confier certains éléments à un sous-domaine particulier, desservi par un hôte virtuel ne journalisant pas ses accès, et contenant des éléments statiques, tels que des images ou des scripts. On économise ainsi plusieurs cycles d’écriture à chaque chargement de page.

Domaine static

Créons la première arborescence :

mkdir -p /var/www/exemple.fr/static/www

On créé ensuite notre premier hôte virtuel :

cd /etc/apache2/sites-available
nano static.exemple.fr
<VirtualHost *:80>
	ServerName static.exemple.fr
	ServerAdmin contact@exemple.fr

	DocumentRoot /var/www/exemple.fr/static/www
</VirtualHost>

Rien de bien sorcier : on déclare un nouvel hôte virtuel écoutant sur toutes les interfaces configurées dans apache (*) sur le port 80. On déclare également le nom de domaine affecté à cet hôte virtuel, en indiquant éventuellement (ce n’est pas une obligation) l’adresse email du responsable. Enfin, la dernière directive défini la racine du site, là où se trouveront les fichiers. Pour le moment, il n’y en a aucun, mais au moins, on a un hôte virtuel destiné à stocker les fichiers statiques, c’est déjà ça.

Domaine www

Le domaine (sous-domaine plus exactement) www est un peu particulier dans la mesure où il est plus utilisé par habitude que réel besoin : on se passe très bien de la partie www dans www.exemple.fr. Cela nous donne toutefois deux bonnes occasions : conserver notre arborescence de base saine, et voir comment créer un alias de domaine.

Notre objectif sera de faire en sorte que, peu importe si on accède à notre site principal via http://exemple.fr ou http://www.exemple.fr, on devra tomber sur la même page. On aura recours, pour cela, à la directive ServerAlias.

On créé donc notre second hôte virtuel avec son arborescence :

mkdir -p /var/www/exemple.fr/www/{www,log}
nano www.exemple.fr
<VirtualHost *:80>
	ServerName exemple.fr
        ServerAlias www.exemple.fr
	ServerAdmin contact@exemple.fr

	DocumentRoot /var/www/exemple.fr/www/www

        CustomLog /var/www/exemple.fr/www/log/access_log
        ErrorLog /var/www/exemple.fr/www/log/error_log
</VirtualHost>

Par la même occasion, on en a profité pour spécifier le chemin vers le journal des accès et le journal des erreurs. Il faudra procéder de même pour tout hôte virtuel créé à l’avenir.

Pour le moment, nous n’utiliserons pas ce domaine : c’est vous qui déciderez ce que vous voulez en faire : blog, portail privé, etc.

Domaine mysql

Le nom de ce sous-domaine importe peu. J’ai choisi mysql, comme j’aurai pu choisir pma, phpmyadmin, admin ou tout autre. Cependant, en consultant régulièrement mes logs, j’ai constaté que certains s’amusent à scanner certains sous-domaines-clés, pour éventuellement tomber sur un script d’administration non-sécurisé. J’ai vu passer toutes sortes de sous-domaines, mais assez étonnamment, peu tentent _mysql.exemple.fr_.

Ce domaine servira à accéder justement à phpMyAdmin, script php probablement le plus utilisé pour administrer graphiquement ses bases de données. Outre l’aspect pédagogique de sa présence dans cet article, puisque c’est un bon prétexte à l’introduction à SSL avec apache, ce sera également un outil très pratique pour la création de futures bases de données, mais aussi pour des tâches plus triviales comme la population de notre première base créée, MailServer.

Créons l’arborescence et l’hôte virtuel :

mkdir -p /var/www/exemple.fr/mysql/www
nano mysql.exemple.fr
<VirtualHost *:80>
	ServerName mysql.exemple.fr
	Redirect / https://mysql.exemple.fr/
</VirtualHost>

<VirtualHost *:443>
	ServerName mysql.exemple.fr

	DocumentRoot /var/www/exemple.fr/mysql/www

	SSLEngine On
	SSLCertificateFile /scripts/certificate_authority/apache/mysql.exemple.fr.crt
	SSLCertificateKeyFile /scripts/certificate_authority/apache/mysql.exemple.fr.key
</VirtualHost>

Ici, nous créons un hôte virtuel écoutant sur le port 80, dont l’unique objectif sera de forcer la redirection vers le même hôte virtuel, mais écoutant sur le port 443 (le port HTTPS). La connexion à _mysql.exemple.fr_ sera donc forcément chiffrée.

On va tout de suite créer le certificat et la clé qui vont bien :

/scripts/certificate_authority/make_request apache mysql.exemple.fr
/scripts/certificate_authority/sign_request apache mysql.exemple.fr
chown www-data:www-data /scripts/certificate_authority/apache/*

Warning : Common Name

On va ensuite télécharger et installer phpMyAdmin. À l’heure où j’écris ces lignes, la dernière version disponible est la 3.4.9.

cd /usr/src
wget http://freefr.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/3.4.9/phpMyAdmin-3.4.9-all-languages.tar.gz
tar zxf phpMyAdmin-3.4.9-all-languages.tar.gz
cp -Rv phpMyAdmin-3.4.9-all-languages/* /var/www/exemple.fr/mysql/www/
mkdir /var/www/exemple.fr/mysql/www/config/
chown -R www-data:www-data /var/www/exemple.fr/mysql/www

Après avoir décompressé l’archive, on a copié les fichiers extraits dans le répertoire racine du sous-domaine mysql, puis on a créé le répertoire config qui va nous servir à paramétrer phpMyAdmin. Enfin, on a attribué les bons droits à l’ensemble de l’arborescence.

Notice : ```text chown -R www-data:www-data <fichier ou répertoire>


Pour le moment, notre serveur n'est pas accessible depuis l'extérieur, nous nous occuperons donc de la configuration de phpMyAdmin plus tard.
En attendant, créons notre dernier hôte virtuel.

## Domaine mail

Revenons dans le répertoire de configuration des hôtes virtuels :

```bash
cd /etc/apache2/sites-available

Et créons la nouvelle arborescence :

mkdir -p /var/www/exemple.fr/mail/{www,log}

Nous allons combiner tout ce que nous avons vu jusqu’à présent pour créer le fichier de configuration de cet hôte virtuel :

nano mail.exemple.fr
<VirtualHost *:80>
	ServerName mail.exemple.fr
	Redirect / https://mail.exemple.fr/
</VirtualHost>

<VirtualHost *:443>
	ServerName mail.exemple.fr

	DocumentRoot /var/www/exemple.fr/mail/www

	SSLEngine On
	SSLCertificateFile /scripts/certificate_authority/apache/mail.exemple.fr.crt
	SSLCertificateKeyFile /scripts/certificate_authority/apache/mail.exemple.fr.key

        CustomLog /var/www/exemple.fr/mail/log/access_log
        ErrorLog /var/www/exemple.fr/mail/log/error_log
</VirtualHost>

On créé notre couple clé/certificat :

/scripts/certificate_authority/make_request apache mail.exemple.fr
/scripts/certificate_authority/sign_request apache mail.exemple.fr
chown www-data:www-data /scripts/certificate_authority/apache/*

Warning : Common Name

Pour la consultation des mails, on va faire appel à l’excellent RoundCube, actuellement en version 0.7.1.

cd /usr/src
wget http://freefr.dl.sourceforge.net/project/roundcubemail/roundcubemail/0.7.1/roundcubemail-0.7.1.tar.gz
tar zxf roundcubemail-0.7.1.tar.gz
cp -Rv roundcubemail-0.7.1/* /var/www/exemple.fr/mail/www/
cp roundcubemail-0.7.1/.htaccess /var/www/exemple.fr/mail/www/
chown -R www-data:www-data /var/www/exemple.fr/mail/www/

La configuration de RoundCube peut se faire depuis Internet, mais encore une fois, notre serveur n’est pas encore accessible depuis l’extérieur. On va donc patienter encore un peu.

On active maintenant nos hôtes virtuels fraîchement créés :

ln -s /etc/apache2/sites-available/www.exemple.fr /etc/apache2/sites-available/default
a2ensite default
a2ensite www.exemple.fr
a2ensite static.exemple.fr
a2ensite mysql.exemple.fr
a2ensite mail.exemple.fr
/etc/init.d/apache2 start

Important : default

www.exemple.fr

www.exemple.fr

Consultez les journaux des différents hôtes (en particulier les journaux d’erreurs) pour vous assurer que tout fonctionne bien du côté d’apache.

DNS

On édite le fichier de configuration de notre domaine :

nano /etc/bind/db.exemple.fr

A la fin du fichier, rajoutez les lignes suivantes :

www		IN	CNAME		ns
*		IN	CNAME		ns

Ces deux lignes définissent un alias (CNAME) du domaine www et de tout autre sous-domaine vers l’adresse IP attribuée au sous-domaine ns. Dans notre cas, tous ces sous-domaines pointent vers l’adresse principale de notre serveur (1.1.1.1, pour réutiliser l’exemple de départ).

On redémarre bind :

/etc/init.d/bind9 restart

Firewall

nano /scripts/firewall

Entre les lignes :

##### Configuration personnalisée #####

Et :

##### Fin : Configuration personnalisée #####

Rajoutez les lignes suivantes :

${IPT} -A SERVICES -p tcp --dport 80 -j ACCEPT
${IPT} -A SERVICES -p tcp --dport 443 -j ACCEPT

Configuration de phpMyAdmin

Rendez-vous à l’adresse http://mysql.exemple.fr/setup/ et laissez-vous guider. Une fois que vous avez modifié votre configuration, déplacez le fichier à la racine :

mv /var/www/exemple.fr/mysql/www/config/config.inc.php /var/www/exemple.fr/mysql/www/
chown www-data:www-data /var/www/exemple.fr/mysql/www/config.inc.php

Je vous recommande la lecture de cette page qui va vous permettre de paramétrer phpMyAdmin beaucoup plus finement que ce que permet l’interface web.

Une fois terminé, supprimez le répertoire config :

rm -r /var/www/exemple.fr/mysql/www/config/

Configuration de RoundCube

Maintenant que phpMyAdmin est installé, il vous sera plus simple de créer l’utilisateur et la base de données pour RoundCube. Ouvrez donc phpMyAdmin (http://mysql.exemple.fr), et cliquez sur l’onglet " Utilisateurs “, puis sur le lien " Ajouter un utilisateur " en bas de page.

Donnez-lui le nom de RoundCube, pour le client localhost, et générez un mot de passe. Cochez également la case " Créer une base de données portant son nom et donner à cet utilisateur tous les privilèges sur cette base “.

Rendez-vous ensuite à l’adresse https://mail.exemple.fr/installer/. Sur la première page, vous verrez la liste des dépendances de RoundCube. S’il en manque l’une ou l’autre, installez-la (via apt-get install ou pear install si la première méthode ne donne rien) et redémarrez apache. Une fois que tout est bon, cliquez en bas sur Next.

Petit exercice : remplissez les différents champs en prenant en considération que :

Touches finales

Une fois RoundCube correctement configuré, créez-vous votre propre adresse email via phpMyAdmin, dans la base de données MailServer, et dans la table users. Pensez à sélectionner le type MD5 lorsque vous saisirez votre mot de passe.

Par la même occasion, allez dans la table aliases, et créez deux enregistrements, dont le champ source sera respectivement root et postmaster, et destination l’adresse email que vous venez de vous créer. Cela vous permettra de recevoir les mails administratifs envoyés automatiquement par les différents services de votre serveur.

Nous avions précédemment configuré une liste blanche d’expéditeurs, toujours autorisés à vous envoyer des mails. Cette liste correspond à la table access_sender de la base de données MailServer. Nous allons nous servir de RoundCube pour peupler automatiquement cette table, dès que vous enverrez un message.

Éditez la configuration de RoundCube :

nano /var/www/exemple.fr/mail/www/config/main.inc.php

Cherchez le terme " plugins " (via la combinaison de touches Ctrl+w).

Complétez la liste présente, en rajoutant :

"automatic_addressbook"

Modifiez ensuite le plugin en question :

nano /var/www/exemple.fr/mail/www/plugins/automatic_addressbook/automatic_addressbook.php

Aux alentours de la ligne 110, cherchez le code suivant :

foreach($all_recipients as $recipient) {
    // Bcc and Cc can be empty
    if ($recipient['mailto'] != '') {
        $contact = array(
            'email' => $recipient['mailto'],
            'name' => $recipient['name']
        );

Rajoutez après :

$con = mysql_connect("localhost", "MailServer", "MotDePasse");
mysql_select_db("MailServer");

mysql_query("insert into access_sender (`source`,`access`) values ('" . $contact["email"] . "','OK')");
mysql_close($con);

Pensez à modifier le mot de passe (il s’agit de celui de l’utilisateur MailServer).

Enregistrez et fermez. Désormais, dès que vous écrirez à quelqu’un, son adresse sera automatiquement ajoutée à la liste blanche.

Si vous le souhaitez, vous pouvez également éditer directement cette liste, en modifiant le contenu de la table access_sender.

source Adresse email à mettre en liste blanche (toujours autorisée à nous contacter, même si son client mail ne respecte pas les standards
access OK pour autoriser, NULL pour bloquer
active 1 pour activer, 0 pour désactiver

Vous avez maintenant à votre disposition les fondements les plus importants pour la mise en place de votre cloud. Votre serveur est sécurisé via un script iptables restrictif, vous disposez d’un serveur de noms de domaine, d’un serveur de base de données, d’un serveur mail, et d’un serveur HTTP(S). Enfin, vous disposez d’une interface pour gérer facilement votre base de données, et d’un client mail agréable à utiliser.

Dans les prochains articles, nous verrons (dans le désordre) :

Échanger autour de ce texte

Si vous souhaitez réagir publiquement, un fil dédié vous attend.

Ouvrir le fil de discussion

Taxonomies

Tags