ISPConfig 3, HTTP2, PHP 7, MariaDB et Let’s Encrypt – Debian 8

1/52/53/54/55/5 (7 votes, moyenne: 4,43 sur 5)
Loading...
I

Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.


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

A propos de l'auteur

Nicolas Simond

Ingénieur Systèmes et Réseaux et guitariste hard rock et metal à mes heures perdues.
Je suis le créateur et l'unique rédacteur d'Abyss Project, c'est ici que je note la plupart de mes procédures et quelques divagations.

Si vous l'article vous a aidé, pensez à me payer un café :)

Subscribe
Notify of
guest

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

50 Commentaires
Plus récents
Plus anciens Populaires
Inline Feedbacks
View all comments
Johan
Johan
7 années plus tôt

Update this tutorial! 🙂

Rodrigo
Rodrigo
7 années plus tôt

Bonjour, je l’ai installé PhpMyAdmin more’m pas en mesure d’ accéder au phpMyAdmin , donne cette erreur  » 502 Bad Gateway» quand j’ouvre la page d’accès .
Utilisez ce chemin http: // my- ip: 8081 / phpmyadmin /

Simon
7 années plus tôt

Bonjour, Tout d’abord, merci pour cet article, c’est exactement ce que je cherchais. Je l’ai bien suivi, sur un serveur dédié Kimsufi et tout se passe bien, ispconfig fonctionne avec le certificat letsencrypt. Mon problème est pour l’ajout de nouveau site, lorsque j’en ajoute un, il n’y a aucun fichier vhost qui se crée. Du coup, je pense que cela vient de ça, je reste bloqué en permanence sur « Welcome to nginx! ». J’ai regardé dans les fichiers de logs mais je n’ai pas eu d’erreur en particulier. Un complément d’information pour l’ajout d’un autre site please ? Merci bcp par… Voir plus »

Nomad
Nomad
Reply to  Simon
7 années plus tôt

Bonjour,
le certificate letsencrypt fonctionne-t-il sur le FQDN mais pas sur les sites ajoutés via ISPconfig ? Je crois que j’ai le meme problème.

Par contre si c’est bloqué sur « Welcome to nginx! » c’est peut-être le chemin qui est erroné:
root /usr/share/nginx/html
ou
/var/www/html

j’ai toujours pas compris lequel doit aller ou, mais je pense que l’emplacement ou se trouve le fichier « index.html » c’est là ou doit se situer le site… (je précise que je n’y connais pas grand chose:))

Nomad
Nomad
7 années plus tôt

Bonjour,
je suis débutant et à l’ouest, quelqu’un pourrait me confirmer si c’est correct ?

Rajoutez cette ligne à la fin du fichier :
extension = /usr/lib/php/20151012/mysql.so

; Local Variables:
; tab-width: 4
; End:
extension = /usr/lib/php/20151012/mysql.so

J’ai un gros doute :s
et j’ai foiré au moins 3 installation

merci d’avance 🙂

Nomad
Nomad
Reply to  Nicolas Simond
7 années plus tôt

Ok, merci.
finalement j’y suis arrivé mais ce qui me manquait c’est le HTTPS pour le site client sur ISPconfig, en HTTP le site s’affiche mais pas en HTTPS
je n’arrive pas à ajouter les certificats Letsencrypt sur ISPconfig, on dirait qu’il ne les prend pas en compte.

Je vais tout reprendre depuis le début et voir ce que ça donne.

J’aimerais installer Nginx 1.10 stable au lieu du 1.9.9, et aussi MySQL pour avoir l’interface graphique PHPmyadmin, c’est possible ?

franck
franck
7 années plus tôt

Merci cela fait plusieurs fois que j’utilise les procédures que tu propose, elles sont unique pas trouvé mieux pour un débutant. c’est un vrai plaisir…..

Vincent
Vincent
7 années plus tôt

Bonjour, vraiment sympa tes tutos. Par contre je vois qu’aucun service mail n’est installé. Il suffit juste d’installer Postfix pour gérer les mails avec ISPConfig? Merci

Vivien
Vivien
8 années plus tôt

Salut je suis bloqué à l’étape : ./letsencrypt-auto certonly –email email@mondomaine.com -d ispconfig.mondomaine.com –rsa-key-size 4096 -a webroot –webroot-path /usr/share/nginx/html/

Il me dis : Detail: Could not connect to http://ispconfig.mondomaine.com/.well-
known/acme-challenge/IbTtkuGFFbyDeLQ3amaf0BPlZloOf2Yrq_b8yBbG2xw

Mon sous-domaine ispconfig.mondomaine.com pointe vers ispconfig: 11.22.33.44:8080 est-ce bon ?
Merci

Vivien
Vivien
Reply to  Vivien
8 années plus tôt

Etant débutant, je souhaitais la meilleur configuration, mais cela semblais difficile a configurer pour moi. Du coup j’ai trouver un super script pour installer ISPconfig3, avec nginx, mariaDB php5 (a voir si on peu rajouter php7 a posteriori… ) je vous le partage car ca peux servir et pas qu’a moi : https://github.com/servisys/ispconfig_setup

axel
axel
8 années plus tôt

je crois savoir : nul part tu ne parles de passer de bash à dash. Ca doit foutre la merde ^^

dpkg-reconfigure dash
répondre non

Je teste et je te dis 🙂

axel
axel
Reply to  Nicolas Simond
8 années plus tôt

Nope, rien de tout ça… Sur un VPS tout frais, debian 8 FR
J’ai essayé en changeant dash bash (ce qui est recommandé par tout le monde, soit dit en passant…)
Mais je n’ai toujours ni répertoire créé dans /var/www/clientX/ ; les rep webXX ne sont pas présent, meme une heure après, même en lancant les cron à la main.
Et aucun vhost nul part dans /etc/nginx/site-available ou -enabled
J’ai refait plusieurs l’install, mais toujours le même souci… Je suis fort marri !

axel
axel
Reply to  Nicolas Simond
8 années plus tôt

Rien dans les logs. c’est pourtant pas mon premier ISPConfig (http://axel.piquet-gauthier.fr/2013/08/ispconfig-3-owncloud-et-roundcube-le-tout-avec-une-debian-7-et-un-dedie-kimsufi/ : mon heure de gloire, dingue ce qu ca drive comme trafic !) mais là, j’avoue, je sèche. Je vais re-essayer ce WE.

Dash Bash SH tout ca, ca venait à l’époque d’un dev d’ISPConfig, une histoire d’incompatibilité avec les scripts, je ne sais quoi. Et c’est bien Bash, pas Dash, je me suis fourvoyé, effectivement. Cela dit, cela ne semble être plus d’actualité

axel
axel
8 années plus tôt

Pour la partie PHP, je suis un peu con,on fait des liens symboliques entre les 2 versions, donc ca va 🙂
Pour mes vhost non crée, je creuse, mais je ne trouve rien 🙁

axel
axel
8 années plus tôt

Hello,
J’aime bien ton article, mais j’ai pleins de petites choses qui ne fonctionne pas.

1/ mon ispconfig ne veut pas créer de vhost pour nginx. Est ce que tu as une idée de pourquoi ?
2/ dans system / serveur config, quand tu déplie « PHP », j’ai des chemins vers PHP 5. Ne devrait on pas modifier cette config pour pointer vers PHP 7 ? Idem dans l’onglet fastcgi ou la référence est faite vers PHP5

Merci de ton aide 🙂