EDIT : J'ai pas trop le temps pour le moment mais j'ai mis la version écrite quelques messages plus bas. Je vais faire mon possible pour améliorer/corriger un peu, et pourquoi pas de faire une video par tuto (2 dans ce cas). Bref, hésitez pas à donner vos avis :)
EDIT 2 : Je les ai validé, du coup ils devraient toujours se retrouver au début :)
J'ai fait, il y a pas longtemps un tuto écrit pour un ami sur la mise en place d'un serveur web (Debian) securisé comprenant :
J'avais aussi fait un serveur mail, mais j'ai eu quelque soucis car les mails arrivent constamment dans les spams, du coup je pense pas l'expliquer ici.
Je parle aussi de la mise en place d'un https, de l'utilisation des vhost pour plusieurs sites sur le même serveurs.
Du coup je voulais savoir si ça intéresserais certains que j'en fasse un tuto vidéo ?
Si vous êtes intéressé, je vous fais ça pendant les vacances de noël.
Et si vous avez des questions particulière, relative au sujet, dont vous voudriez que je parle, dites le moi, et si c'est possible, j'en parlerais.
Dans ce tutoriel nous allons voir comment mettre un place un serveur LAMP (Linux Apache Mysql Php). J'ai choisis pour ce tutoriel d'utiliser Debian 8 (dit Jessie), la dernière version d'Apache (la 2.4 pour le moment) et php5-fpm. Dans un second tutoriel nous verrons comment sécuriser notre serveur pour le rendre moins vulnérable.
Vous pouvez vous en doutez, la première chose à faire est de se connecter en ssh à notre serveur. Suivant votre OS (Système d'Exploitation) la méthode sera différente :
ssh NomDUtilisateur@IpOuHostName
Exemple :
ssh root@42.42.42.42
Vous voilà connectez sur votre serveur, nous allons maintenant créer un nouvel utilisateur pour installer et gerer notre LAMP. Je fais ça tout simplement pour utiliser root le moins possible sur le serveur de production.
J'ai choisis de nommer l'utilisateur amp tout simplement.
# adduser amp
Des questions vous seront posées, libre à vous d'y répondre ou non. Dans mon cas j'ai laissé vide (ENTER pour laisser vide)
Nous allons ensuite devoir installer sudo afin de pouvoir installer nos différents services.
# apt-get install sudo -y
Le -y est là pour dit oui à notre place lorsqu'une validation d'installation nous sera demander. Vous n'êtes pas obligez de le mettre, mais dans ce cas, il faudra répondre Oui lorsqu'on vous le demandera.
Nous allons ensuite ajouter notre utilisateur amp au groupe sudo et redemarrer le serveur pour valider le changement.
# adduser amp sudo
# reboot
Lorsque le serveur aura redémmarer, reconnectez-vous en ssh, mais en tant que amp cette fois-ci. Nous n'utiliseront plus root pour le moment.
Apache + MySql + php (+phpmyadmin)Nous allons commencer par installer Apache et php. Comme dit plus haut, nous allons utiliser php-fpm, nous allons donc avoir besoin du module fastcgi d'apache. pour pouvoir l'installer il va falloir modifié notre fichier sources.list. Ce fichier spécifie à Debian où aller chercher les paquets d'installation.
$ sudo nano /etc/apt/sources.list
AJoutez contrib non-free à la fin des 4 premières lignes non commentée. Voici à quoi ces les lignes devraient ressemblée une fois modifiées :
deb http://ftp.us.debian.org/debian/ jessie main contrib non-free
deb-src http://ftp.us.debian.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
Maintenant nous allons activer nos modifications via un
$ sudo apt-get update
Nous pouvons maintenant installer apache, php5-fpm et le modules fastcgi
$ sudo apt-get install apache2 libapache2-mod-fastcgi php5-fpm -y
Pour permettre à Apache d'interpreter les fichier .php on va créer un fichier de configuration
$ sudo nano /etc/apache2/conf-available/php5-fpm.conf
Dans ce fichier on va expliquer à Apache ce qu'il doit faire dans le cas où il doit interpreter un page .php quand le module fastcgi est utilisé
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Pour terminer il ne nous reste plus qu'a activer les différents modules nécessaire, activer notre configuration php5-fpm et recharger la configuration d'apache
$ sudo a2enmod actions fastcgi alias
$ sudo a2enconf php5-fpm
$ sudo service apache2 reload
Nous allons maintement nous occuper la partie partie Mysql de notre serveur. Cette partie est très courte puisqu'il suffit de faire
$ sudo apt-get install mysql-client mysql-server -y
On vous demandera de choisir uniquement un mot de passe root pour mysql.
Maintenant que Mysql est installer, on va pouvoir installer phpmyadmin. Vous pouvez passer cette étape si vous préférez utiliser un programme (heidiSQL ou MySQLWorkBench par exemple) ou Adminer.
$ sudo apt-get install phpmyadmin -y
Attention, lors de l'installation de phpmyadmin plusieurs questions seront posées.
Vous pouvez maintenant vous connectez à phpmyadmin via l'url IpDeMonServeur/phpmyadmin ou MonHostName.xx/phpmyadmin
ftpNous avons fini d'installer notre serveur LAMP, ce qui vut dire que l'on peut héberger un site web sur notre serveur. Mais il va nous falloir un ftp afin de pouvoir y envoyer nos fichiers sources.
On va donc installer proftpd
$ sudo apt-get install proftpd -y
Une fois l'installation finie, vous pouvez (via FileZilla par exemple) vous connecter à votre serveur en ftp. Le site par défaut d'Apache doit se trouver dans le dossier /var/www/html.
C'est donc dans ce dossier que votre site web devra se trouver.
Nous allons maintenant voir comment ajouter une petite sécurité sur le serveur.
Ce qu'on va faire ici ne suffit pas ! Il ne s'agit que d'une sécurité très très très basique.
En effet, nous allons simplement désactiver la connexion au ssh à l'utilisateur root et faire de même pour mysql.
Pour ssh il faut modifié le fichier de configuration
$ sudo nano /etc/ssh/sshd_config
Et y ajouter (ou décommenter) la ligne
PermitRootLogin no
Pour MySql c'est plus simple puisqu'un script est déjà prévu
$ sudo mysql_secure_installation
Plusieurs questions seront posées :
Change the root password? [Y/n] y (pour changer le mdp root, n sinon)
Remove anonymous users? [Y/n] y (pour désactiver l'acces anonyme)
Disallow root login remotely? [Y/n] y (pour désactiver la connexion en root depuis l'extérieur)
Remove test database and access to it? [Y/n] y (pour supprimer les bdd test et les access)
Reload privilege tables now? [Y/n] y (Pour recharger les privilèges)
Et voilà, vous disposez maintenant d'un serveur LAMP et un serveur ftp afin d'y envoyer votre site web.
Nous allons maintenant voir comment sécurisé notre serveur web afin qu'il soit moins vulnérable aux attaques.
Dans ce tutoriel nous allons voir comment sécurisé
Nous allons tout d'abord créer un groupe ssh_allowed_user qui contiendra tout les utilisateur ayant accès au serveur via ssh.
$ sudo addgroup ssh_allowed_users
On va maintenant y ajouter l'utilisateur amp (utilisateur créer pour installer et gerer notre serveur dans le tutoriel précédent)
$ sudo adduser amp ssh_allowed_users
Et on va modifier la configuration de ssh
$ sudo nano /etc/ssh/sshd_config
Nous allons en profiter pour modifier le port par défaut de ssh. Il faudra modifier (ou ajouter suivant les cas) les lignes suivant
Port 5896 (Ou n'importe quel autre port situé en 1024 et 49151)
AllowGroups ssh_allowed_users
Pour valider nos modification il va falloir redémarrer le ssh.
$ sudo service ssh restart
Dés que vous allez redemmarer le ssh vous allez être déconnecté. Et si vous n'avez pas ajouter l'utilisateur amp dans le groupe ssh_allowed_users vous ne pourrez plus vous connecter à votre machine. il va donc falloir demander une reinstallation (si vou sn'avez pas accès physiquement au serveur) ou aller se connecter physiquement à la machine pour régler le soucis.
Lorsque vous allez vous reconnecter n'oublier de spécifié le numéro de port. Sur Mac et Linux il faudra ajouter -p NumDePort et sur windows il faudra le spécifié dans le programme que vous utilisé (ex: Putty)
ftpComment pour le ssh nous allons restreindre la liste des utilisateurs qui peuvent se connecter en ftp à notre serveur.
$ sudo addgroup ftp_allowed_users
$ sudo adduser amp ftp_allowed_users
On va maintenant aller dans le fichier de configuration pour limiter l'accès au groupe que l'on vient de créer et pour y activer le cryptage.
Il est posible que l'activation du tls ralentisse TRES FORTEMENT les vitesses de transfert du ftp. J'ai le soucis en utilisant FileZila sous windows, je n'ai pas encore tester avec d'autre OS/programme.
$ sudo nano /etc/proftpd/proftpd.conf
Décommenter la ligne (en retirant le # devant):
Include /etc/proftpd/tls.conf
Et ajouter le bloc :
<Limit LOGIN>
DenyGroup !ftp_allowed_users
</Limit>
On va modifier la configuration tls de proftpd, mais tout d'abord on va créer une sauvegarde du fichier original, puis vider le fichier et enfin écrire notre configuration
$ sudo cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf.original
$ sudo -i
# cat /dev/null > /etc/proftpd/tls.conf
# exit
Quelques explications :
Modifier le fichier
$ sudo nano /etc/proftpd/tls.conf
Et ajoutez-y les lignes suivantes.
<IfModule mod_tls.c>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol SSLv23
TLSOptions NoCertRequest
TLSRSACertificateFile /etc/proftpd/ssl/proftpd.cert.pem
TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd.key.pem
TLSVerifyClient off
TLSRequired on
</IfModule>
On y spécifie le fichier de log, le type de protocole à utilisé, où se trouve les clés RSA, ... (plus d'info dans /etc/proftpd/tls.conf.original).
On va maintenant créer le dossier ssl et y ajouter nos clés RSA
$ sudo mkdir /etc/proftpd/ssl
$ sudo openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/ssl/proftpd.cert.pem -keyout /etc/proftpd/ssl/proftpd.key.pem
Suite à cette commande une série de questions vont apparaitres, libre à vous d'y répondre ou non.
On va restreindre l'accès de la clef à amp et on redemmare le ftp pour que les modifications prennent effets
$ sudo chmod 660 /etc/proftpd/ssl/proftpd.key.pem
$ sudo service proftpd restart
apache2
Vous vous demandez peut-être en quoi créer un utilisateur par site va sécurisé notre seveur ?
C'est fort simple, via le module userdir chaque utilisateur pourra héberger un site web en créant un dossier public_hmtl dans son dossier /home. Ce qui veut dire que si quelqu'un hack notre site, il se trouvera dans le dossier home d'un utilisateur n'ayant aucun droit, et ne pourra donc rien casser sur le serveur (autre que le site web).
On va donc activer userdir et créer un utilisateur pour notre site.
Je vais utiliser mon site web comme exemple pour avoir un cas concret
Afin que l'utilisateur gerant mon site puisse se connecter en ftp et en ssh au serveur on va devoir l'ajouter aux groupes ssh et ftp_allowed_users
$ sudo a2enmod userdir
$ sudo adduser elhebert
$ sudo adduser elhebert ftp_allowed_users
$ sudo adduser elhebert ssh_allowed_users
On va maintenant se connecter en tant qu'Elhebert pour créer les dossiers (public_hmtl et logs) et fichiers nécessaires (error.log et access.log)
$ sudo su elhebert
$ mkdir ~/public_html
$ mkdir ~/logs
$ touch ~/logs/error.log
$ touch ~/logs/access.log
Et ensuite on retourne sur amp pour continuer notre configuration via un
$ exit
On va maintenant créer un nouveau site dans apache.
$ sudo nano /etc/apache2/sites-available/elhebert.conf
Je vous ai mis ici la configuration de base que j'utilise, libre à vous de la copier ou de la modifier. Je vous invite à lire la doc d'apache pour plus d'infos
<VirtualHost *:80>
ServerAdmin contact@elhebert.be
ServerName www.elhebert.be
ServerAlias elhebert.be
DocumentRoot /home/elhebert/public_html
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/elhebert/public_html>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /home/elhebert/logs/error.log
CustomLog /home/elhebert/logs/access.log combined
</VirtualHost>
Afin de rendre le site disponible il faudra l'activer et recharger la configuration d'apache via :
$ sudo a2ensite elhebert
$ sudo service apache2 reload
On va maintenant restreindre l'accès ftp des utilisateurs. Lorsqu'ils se connecterons en ftp, ils seront confiné dans leurs répertoire /home (/home/Elhebert dans le cas de mon utilisateur)
$ sudo nano /etc/proftpd/proftpd.conf
et on décommente la ligne
DefaultRoot ~
IpTable
Maintenant que les différents services sont sécurisés on va sécurisé l'accès au serveur en général grâce aux IpTables.
Les IpTables sont le système de firewall de Linux. Grâce à elles ont va donc pouvoir filtrer le trafic entrant et sortant de notre serveur.
Je vous donne ici encore une fois ma configuration, mais je vous invite à lire ce tutoriel afin de mieux comprendre ce qui se passe.
On va commencer par créer un nouveau script contenant nos iptables
$ sudo nano /etc/init.d/iptable.sh
Et on va y mettre l'ensemble des règles suivantes :
#!/bin/sh
### BEGIN INIT INFO
# Provides: my iptable
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# X-Interactive: false
# Short-Description: my iptable
### END INIT INFO
iptables -t filter -F
iptables -t filter -X
echo "Reset"
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
echo "On interdit tout"
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo "Loopback autorisé"
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo "Ping Autorisé"
iptables -t filter -A INPUT -p tcp --dport 5896 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 5896 -j ACCEPT
echo "Connexion en ssh sur le port 5896 autorisée"
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo "Trafic entrant et sortant du dns sur le port 53 en tcp et udp autorisé"
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo "Connexion à un serveur temps (ntp) sur le port 123 autorisé"
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
echo "Trafic entrant et sortant http sur les ports 80,443 et 8443 autorisé"
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "Trafic entrant et sortant du ftp sur les ports 20 et 21 autorisé"
#Les règles qui suivent sont utile UNIQUEMENT pour serveur mail
#Ne les ajouter pas dans le cas contraire !
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
echo "Trafic smtp sur le port 25 autorisé"
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
echo "trafic POP3 sur le port 110 autorisé"
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
echo "trafic IMAP sur le port 143 autorisé"
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
echo "trafic POP3S sur le port 995 autorisé "
On rend le script exécutable et on l'ajoute au démarrage de la machine afin qu'a chaque reboot il soit exécuté.
$ sudo chmod +x /etc/init.d/iptable.sh
$ sudo update-rc.d iptable.sh defaults
On va maintenant installer un système pour se prémunir des attaques de type brute force : Fail2ban. Ce système va empêcher un utilisateur d’accéder aux serveur après un certain nombre de tentative échouée.
$ sudo apt-get install fail2ban
Une fois installé on va se rendre dans le fichier de configuration pour y activer certaines règles. Dans ce même fichier vous pouvez aussi bien entendu y modifier la configuration du système fail2ban en changeant le nombre d'essais autorisé, le temps de ban et le port
$ sudo nano /etc/fail2ban/jail.conf
Pour activer une règle il faudra changer le
enabled = false
en
enabled = true
Personnellement j'utilise les règles suivantes : ssh, ssh-dos, apache, apache-multiport, apache-noscript, apache-overflows et proftpd.
Vous pouvez en activer d'autre et même ajouter vos propres règles.
Le tutoriel est maintenant fini, si vous avez suivit jusqu'ici vous disposez maintenant d'un serveur web sécurisé.
Bien entendu il est toujours possible d'augmenter la sécurité de votre serveur, mais je pense que dans le cas d'un site à faible et moyen trafic, la configuration présentée dans ce tutoriel est suffisante. Mais n'hésitez pas à réagir en commentaire.
+1 !
Très bonne idée, je sur pour à 100% ! Le serveur est la base de travail du Web et je trouve qu'il n'y a pas assez de tutos bien complets dessus alors que l'on en trouve des brouettes pour expliquer comment créer un site.
Très bonne idée, sinon selon moi un des sujet les plus compliqué et qui manque d'explication sont les "DNS".
Notre registar nous permet de faire pointer notre domaine vers un addresse ip mais apres sa, comment mettre en place des ns1.monsite.com et ns2.monsite.com pour ne pas toujours devoir mettre l'ip serveur et gerer le tout sur notre propre serveur.
Effectivement :)
Pourquoi ne pas en faire un sur les VPS (ou simplement différencier le tout dans un gros tuto) qui sont très à la mode en ce moment ?
@zkiller : Je ne compte pas parler du dns, car c'est assez compliqué à comprendre, mais surtout, parce que dans la plupart des cas, le dns utilisé par nos serveur est celui de l'hebergeur (ovh par exemple).
Par contre, pour la mise en place de sous domaine, il n'y as pas de soucis, c'est faisable.
@SquallX : Qu'entend-tu par faire un tuto sur les VPS ?
@zkiller : Ton regsitrar devrait te premettre de déclarer tes sous-domaines aussi (en tous cas gandi), sans avoir a faire ton propre serveur dns pour eux. De ton coté tu n'as plus qu'a faire tes virtual hosts avec les noms et alias qui correspondent ...
Pour info il y a une série de tutos plutot pas mal fait par Alexis Madrzejewski qui reprend tout ceci en y ajoutant des outils de protection et de monitoring. Je trouve l'idée bonne mais il faudrait alors se démarquer de ce qu'il propose déja.
@Vallyan : Je vais regarder ça, voir un peu le niveau qu'il propose :)
Car je pense que sur Grafikart tout le monde à pas un niveau très bon en Linux, et par conséquent certaines notions peuvents être dure à assimilée.
Et puis, même si le tuto reste dans la même idée, en avoir un de plus dispo sur le site de grafikart ne fera pas de mal :D
@Vallyan J'ai donc regardé la série de tutoriel, et elle est vraiment bien faite, j'ai même découvert des outils bien pratique (suEXEC et suPHP) que je connaissait pas. Je vais mettre à jour mon pdf du coup ^^
Après, le niveau varie beaucoup dans les tutoriels, mais il explique très bien. J'ai remarqué quelques petits détails qui me gènent (genre l'utilisation permanente de root plutôt que d'utilisé le sudo) mais ce sont que des détails :)
Du coup je vais surement m'inspirer de cette série de tutoriel pour faire mon/mes tuto sur le sujet, et je tenterai d'avoir une autre approche.
Ouais ce serais une bonne idée, impatient de voir ça. :)
@mafzst : Pas de tuto la dessus ? Sinon, il y a les documentation officiels de chaque distribution qui permette de bien comprendre et de bien sécurisé le tout ;)
@elhebert : être tout le temps en root n'est pas une mauvaise pratique (ni une bonne), je suis toujours en root quand je bosse et tant que je gère mes commandes et mes actions, ben rien ne m'arrive, mais il m'est déjà arrivé de planter un serveur à cause d'un foutu raccourci et hop... je lance la commande en root et mon patron me flingue ^^
@eloyasGithub J'ai commencé l'enregistrement, mais pour le moment la qualité du son est vraiment pas top (le micro de mon casque est pas exeptionnel) du coup, je vais surement le refaire.
Je me demandais si le faire sur un VM ne serait pas plus simple, parce que pour le moment j'ai reinstaller 4x mon VPS en moins de deux semaine xD
Par ailleurs j'ai décidé de faire deux tutos sur le sujet :
J'pense que ça devrait le faire. Par contre je sais pas quand ce sera dispo, si j'ai du temps, ce sera fait d'ici fin janvier.
Bon je déterre un peu mon sujet :D
J'ai pas fais les vidéos pour finir mais j'ai enfin eu le temps de ré écrire mon tutoriel sur la mise en place d'un LAMP et sur la sécurisation du serveur. (Bah oui passage à Debian 8, php-fpm ça fait des changement)
Je sais que j'aurais du le faire plus tôt, mais avec mes cours j'ai pas eu le temps :D
j'ai donc écrit deux tutoriel :