Bonjour à tous,

Premier gros article de l’année et surtout, je pense, le plus gros que j’ai jamais fais sur ce blog, on va voir comment faire un serveur web prêt pour 2016.

Au jour de l’écriture de cette procédure, on va installer Nginx 1.9.9 (mainline) avec le support de http 2, la nouvelle version du protocole http. Attention, ALPN ne sera pas supporté car Nginx n’a pas compilé la 1.9.9 avec la dernière version de OpenSSL *facewall* …

PHP 7.0, la dernière version de stable de PHP, beaucoup plus rapide que PHP 5.6.

MariaDB 10.1, la dernière version stable de MariaDB qui inclus les fonctionnalités propres à Mysql 5.6 et 5.7.

Et l’intégration du renouvellement automatique des certificats SSL sur le serveur avec Let’s Encrypt qui vous permettra de créer et renouveler des certificats SSL gratuits pour vos sites.

 

Bon, je vous préviens, c’est compliqué (par rapport aux autres procédures que j’ai fait sur ISPConfig.

On va faire de la compilation à la main, on va bouffer de la ligne de commande, on va tuner du fichier de configuration, piocher dans des dépôts externes, dans stretch … bref, heureusement que j’ai fait la majorité du boulot pour vous 🙂

 

Installation des sources

Pour commencer, nous allons installer des sources personnalisées car, on va prendre beaucoup de ressources en dehors des dépôts Debian officiel.

Commencez par créer une policy APT pour définir la distribution par défaut, cela évitera que votre système se mette à jour avec Stretch (la prochaine version de Debian).

Créez un fichier de configuration avec la commande suivante :

nano /etc/apt/apt.conf.d/99defaultrelease

 

Et remplissez-le avec ceci :

APT::Default-Release "jessie";

 

Maintenant, renseignez toutes les sources nécessaires dans votre sources.list :

rm /etc/apt/sources.list
nano /etc/apt/sources.list
#Stable
deb http://mirrors.kernel.org/debian/ jessie main contrib non-free
deb-src http://mirrors.kernel.org/debian/ jessie main contrib non-free
deb http://security.debian.org/ jessie/updates main contrib non-free
deb-src http://security.debian.org/ jessie/updates main contrib non-free
deb http://mirrors.kernel.org/debian/ jessie-updates main contrib non-free
deb-src http://mirrors.kernel.org/debian/ jessie-updates main contrib non-free
deb http://mirrors.kernel.org/debian/ jessie-backports main contrib non-free
deb-src http://mirrors.kernel.org/debian/ jessie-backports main contrib non-free

#Stretch - OpenSSL
deb http://mirrors.kernel.org/debian/ stretch main
deb-src http://mirrors.kernel.org/debian/ stretch main

#NGINX - Mainline
deb http://nginx.org/packages/mainline/debian/ jessie nginx
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx

#Dotdeb - php7.0 7
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

#MariaDB
deb [arch=amd64,i386] http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main
deb-src http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main

 

Maintenant, installez les packages nécessaires :

apt-get update && apt-get install software-properties-common python-software-properties -y

 

Téléchargez les clés nécessaires pour les dépôts et installez-les :

mkdir /tmp/keys/
cd /tmp/keys
wget http://nginx.org/keys/nginx_signing.key
wget https://www.dotdeb.org/dotdeb.gpg
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db #MariaDB
apt-key add nginx_signing.key && apt-key add dotdeb.gpg

 

Maintenant, mettez votre système à jour :

wget -O- https://raw.githubusercontent.com/stylersnico/debian-scripts/master/upgrade-and-clean-system.sh | sh

 

Installation d’ISPConfig et des composants nécessaires :

Installation des composants de base :

Installez tous les packages nécessaires :

apt-get install mariadb-server openssl rkhunter binutils clamav clamav-daemon zoo unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl nginx php7.0-fpm php7.0-curl php7.0-mysql php7.0-gd php7.0-intl php7.0-imap php7.0-pspell php7.0-recode php7.0-snmp php7.0-tidy php7.0-json php7.0-opcache fcgiwrap memcached pure-ftpd-common pure-ftpd-mysql bind9 dnsutils fail2ban build-essential autoconf automake libtool flex bison debhelper binutils -y
apt-get install -t stretch openssl

 

Installez la dernière version de Jailkit :

cd /tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz
tar xvfz jailkit-2.19.tar.gz
cd jailkit-2.19
./debian/rules binary
cd ..
dpkg -i jailkit_2.19-1_*.deb
rm -rf jailkit-2.19*

Si vous voulez un accès externe aux bases de données MariaDB, vous devez modifier le fichier de configuration de MariaDB :

nano /etc/mysql/my.cnf

 

Recherchez l’option bind-address à la ligne 47 et commentez la :

Avant :

bind-address            = 127.0.0.1

Après :

#bind-address            = 127.0.0.1

 

Sauvegardez en effectuant la combinaison de touches Ctrl+O et redémarrez MariaDB:

systemctl restart mysql

 

Maintenant, on va modifier la configuration de notre serveur FTP :

nano /etc/default/pure-ftpd-common

 

Vérifiez que le démarrage soit en STANDALONE et que virtualchroot soit sur TRUE

[...]
STANDALONE_OR_INETD=standalone
[...]
VIRTUALCHROOT=true
[...]

On va maintenant autoriser les sessions par TLS pour plus de sécurité

echo 1 > /etc/pure-ftpd/conf/TLS
mkdir -p /etc/ssl/private/

 

On va maintenant générer un certificat SSL dans le dossier que l’on vient de créer :

openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

 

Changez les permissions du certificat

chmod 600 /etc/ssl/private/pure-ftpd.pem

 

Redémarrez le serveur FTP :

/etc/init.d/pure-ftpd-mysql restart

 

Pour que Fail2Ban surveille notre serveur FTP nous allons devoir créer un fichier de configuration spécifique :

nano /etc/fail2ban/jail.local

 

Remplissez le avec ceci :

[pureftpd]
enabled = true
port = ftp
filter = pureftpd
logpath = /var/log/syslog
maxretry = 3

 

On va maintenant créer un filtre :

nano /etc/fail2ban/filter.d/pureftpd.conf

 

Et le remplir avec cela :

[Definition]
failregex = .*pure-ftpd: \(.*@\) \[WARNING\] Authentication failed for user.*
ignoreregex =

 

On va commencer par utiliser l’assistance de sécurisation de MariaDB avec la commande suivante :

mysql_secure_installation

 

Ensuite, vous pouvez regarder cet article pour sécuriser un peu plus votre accès SSH !

 

Installation d’ISPConfig (la partie chiante) :

Et comme je l’ai indiqué si délicatement dans le titre, la partie compliquée de ce tutoriel arrive.

L’installateur d’IspConfig demande des fonctions MySQL marquée en deprecated sur php 5.6 et supprimée sur 7.0.

On va donc compiler le bordel en extension pecl pour php-cli pour l’installation :

apt-get install git php7.0-dev
cd /tmp
git clone https://github.com/php/pecl-database-mysql     mysql   --recursive && cd mysql
phpize
./configure
make
make install

 

Une fois la compilation terminée, indiquez le chemin vers l’extension mysql.so dans le php.ini :

nano /etc/php/7.0/cli/php.ini

 

Rajoutez cette ligne à la fin du fichier :

extension = /usr/lib/php/20151012/mysql.so

 

Redémarrez php :

systemctl restart php7.0-fpm

 

Maintenant, installez ISPConfig avec les commandes suivantes :

cd /tmp
wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
tar xfz ISPConfig-3-stable.tar.gz
cd ispconfig3_install/install/
php -q install.php

 

Suivez les instructions de l’installateur, mais lorsqu’il vous laissera le choix entre l’installation standard et expert, choisissez expert

Select language (en,de) [en]:
Installation mode (standard,expert) [standard]: expert

 

Lorsqu’il vous demandera pour la configuration des mails, il faudra lui répondre non, car nous n’avons pas installé postfix.

Configure Mail (y,n) [Y]: n

 

Vous pouvez laisser tous les autres paramètres par défaut.

Maintenant, la fin de l’installation d’ISPConfig va foirer, c’est pas normal, don’t worry.

Le script va foirer la configuration de Nginx donc on va finir à la main.

Lancez les commandes suivantes pour copier les configurations nécessaires, générer les paramètres DH en 4096 et téléchargez le nginx.conf :

mkdir /etc/nginx/sites-enabled/
cp /etc/nginx/sites-available/apps.vhost  /etc/nginx/sites-enabled/000-apps.vhost
cp /etc/nginx/sites-available/ispconfig.vhost  /etc/nginx/sites-enabled/000-ispconfig.vhost
rm -rf /etc/php/7.0/fpm/pool.d/
ln -s /etc/php5/fpm/pool.d /etc/php/7.0/fpm/pool.d
cd /etc/ssl/certs && openssl dhparam -out dhparam.pem 4096
cd /etc/nginx/
rm nginx.conf
wget https://www.abyssproject.net/wp-content/uploads/2016/01/nginx.conf_.txt
mv nginx.conf_.txt nginx.conf
service php7.0-fpm restart && service nginx restart

 

Intégration de HTTP 2 et Let’s Encrypt à ISPConfig :

Bon, vous n’avez pas encore Let’s Encrypt, mais ce n’est pas grave, on va déjà indiquer le chemin des certificats dans la configuration d’ISPConfig.

Éditez le fichier suivant :

nano /usr/local/ispconfig/server/conf/nginx_vhost.conf.master

 

Remplacez :

listen <tmpl_var name=’ip_address’>:443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
<tmpl_if name=’ipv6_enabled’>
listen [<tmpl_var name=’ipv6_address’>]:443 ssl;
</tmpl_if>
ssl_certificate <tmpl_var name=’document_root’>/ssl/<tmpl_var name=’ssl_domain’>.crt;
ssl_certificate_key <tmpl_var name=’document_root’>/ssl/<tmpl_var name=’ssl_domain’>.key;
</tmpl_if>

 

Par :

<tmpl_if name=’ssl_enabled’>
listen <tmpl_var name=’ip_address’>:443 ssl http2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
<tmpl_if name=’ipv6_enabled’>
listen [<tmpl_var name=’ipv6_address’>]:443 ssl http2;
</tmpl_if>
ssl_certificate /etc/letsencrypt/live/<tmpl_var name=’domain’>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<tmpl_var name=’domain’>/privkey.pem;
</tmpl_if>

 

Création d’un certificat et intégration à ISPConfig :

Dans un premier temps, on va générer un domaine pour l’interface d’ISPConfig.

Le mieux, c’est de créer un sous domaine spécifique à l’interface (ispconfig.domaine.com)

Installez Let’s Encrypt avec les commandes suivantes :

cd /etc
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

 

Ensuite, générez un certificat pour votre domaine :

./letsencrypt-auto certonly --email email@domaine.com -d ispconfig.domaine.com --rsa-key-size 4096 -a webroot --webroot-path /usr/share/nginx/html/
cat /etc/letsencrypt/live/ispconfig.domaine.com/privkey.pem /etc/letsencrypt/live/ispconfig.domaine.com/cert.pem > /etc/ssl/private/pure-ftpd.pem
/etc/init.d/pure-ftpd-mysql restart

 

Maintenant, éditez le vhost de nginx pour appliquer le certificat :

nano /etc/nginx/sites-enabled/000-ispconfig.vhost
        ssl_certificate /etc/letsencrypt/live/ispconfig.domaine.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ispconfig.domaine.com/privkey.pem;

 

Et redémarrez Nginx :

service nginx restart

 

Vous pourrez ré-utiliser la commande suivante pour générer des certificats :

./letsencrypt-auto certonly --email email@domaine.com -d domaine.com -d www.domaine.com --rsa-key-size 4096 -a webroot --webroot-path /var/www/domaine.com/web/

 

Vous devrez les ajouter manuellement dans ISPConfig la première fois, le renouvellement sera ensuite automatisé.

Rendez-vous dans le dossier suivant :

cd /etc/letsencrypt/live/domaine.com

 

Vous aurez 4 fichiers présents dans ce dossier à savoir :

  • cert.pem -> Certificat principal
  • chain.pem -> Chaine de certificats supplémentaires
  • fullchain.pem -> Certificat principal + Chaine de certificats supplémentaires
  • privkey.pem -> Clé privé du certificat

 

Maintenant, il ne vous reste qu’à installer le certificat sur votre site web (onglet SSL) :

lets-encrypt-02

 

Renouvellement automatique des certificats :

Créez un fichier le.sh dans le dossier /root :

cd /root
nano le.sh

 

Remplissez le avec ceci (modifiez les domaines et le mail bien-sûr) :

#!/bin/bash

###Remplace les Deny All par Allow All
cd /etc/nginx/sites-enabled
sed -i 's/deny all/allow all/g'  *.vhost
service nginx reload

###Renouvelle les certificats
cd /etc/letsencrypt
./letsencrypt-auto certonly -a webroot --email mail@domaine.com -d domaine.com --rsa-key-size 4096 --webroot-path /var/www/domaine.com/web/ --renew-by-default --agree-tos
./letsencrypt-auto certonly -a webroot --email email@domaine.com -d domaine.com -d www.domaine.com --rsa-key-size 4096 --webroot-path /var/www/domaine.com/web/ --renew-by-default --agree-tos

###Remplace les Allow All par Deny All 
cd /etc/nginx/sites-enabled 
sed -i 's/allow all/deny all/g'  *.vhost 
service nginx reload

###Certificat du serveur pour PureFTPD
cat /etc/letsencrypt/live/ispconfig.domaine.com/privkey.pem /etc/letsencrypt/live/ispconfig.domaine.com/cert.pem > /etc/ssl/private/pure-ftpd.pem
/etc/init.d/pure-ftpd-mysql restart

 

Rendez le script exécutable :

chmod +x le.sh

 

Ouvrez le crontab :

crontab -e

 

Et créez un cron pour faire le boulot à votre place :

30 12 10 * * /root/le.sh > /var/log/le.log

 

A ceux qui croyaient qu’installer un serveur web c’était facile :

tumblr_nj3g1lEGts1u2jwbho1_400