+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.
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 :
- apache, php, mysql
- ftp
- ssh
- firewall
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.
14 réponses
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 :
- Un basique : un seul utilisateur, un seul site et pas d'autres services. Du coup sécurité restreinte (iptables, restrcition ssh, changement de port)
- Un plus poussé : multi-site, multi-user, plusieurs services (genre voice juste parce que je vais devoir en installer un pour moi). Niveau sécurité : fail2ban, rkHunter, iptables, ...
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 :
- Le premier est sur la mise en place d'un serveur LAMP : debian 8, apache 2.4, mysql et php5-fpm. Avec bien entendu installation d'un ftp et de phpmyadmin.
- Le second est sur la sécurisation du ssh et d'apache et cryptage du ftp. Ajout d'IpTables pour filtrer le trafic et de Fail2ban pour éviter les brute force.
Et tes tuto sont consultable ou ?
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.
Avant de commencer
- Même si vous pouvez le suivre sans connaissance, je vous recommande d'avoir quelques bases en Linux afin d'avoir plus simple à comprendre les différentes étapes.
- Dans ce tutoriel on supposera que l'on utilise un serveur qui vient d'être installer.
- un # devant une commande signifie que l'on est connecté en tant que root
- un $ devant une commande signifie que l'on est pas connecté en tant que root
- ni le $ ou # ne font partie des commandes, inutile des les copier/coller.
Connexion au serveur
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 :
- Pour Linux et MacOs : Ouvrer le terminal et entrez
ssh NomDUtilisateur@IpOuHostName Exemple :
ssh root@42.42.42.42 - Pour windows malheureusement l'invite de commande ne supporte pas ssh, il faudra donc passer par un logiciel tiers (ex: putty).
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.
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.
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.
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)
Apache, php5-fpm et fastcgi
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.
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 :
Maintenant nous allons activer nos modifications via un
Nous pouvons maintenant installer apache, php5-fpm et le modules fastcgi
Pour permettre à Apache d'interpreter les fichier .php on va créer un fichier de configuration
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é
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
MySql et PhpMyAdmin
Nous allons maintement nous occuper la partie partie Mysql de notre serveur. Cette partie est très courte puisqu'il suffit de faire
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.
Attention, lors de l'installation de phpmyadmin plusieurs questions seront posées.
- Pour la première il faut choisir Apache, pour ce faire, via les flèches de votre clavier séléctionner Apache et utilise ESPACE pour le séléctionner, et seulement lorsqu'Apache est cocher, vous pouvez valider en appuyant sur ENTER
- Dites Oui lorsqu'on vous demande d'utiliser dbconfig-common
- Entrez votre mot de passe root Mysql
- Et choississez le mot de passe root pout phpmyadmin
Vous pouvez maintenant vous connectez à phpmyadmin via l'url IpDeMonServeur/phpmyadmin ou MonHostName.xx/phpmyadmin
ftp
Nous 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
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.
Sécu basique
Nous allons maintenant voir comment ajouter une petite sécurité sur le serveur.
Attention
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
Et y ajouter (ou décommenter) la ligne
Pour MySql c'est plus simple puisqu'un script est déjà prévu
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é
- Le ssh : En changeant le port par défaut et en ne permettant qu'à certains utilisateur de s'y connecter.
- le ftp : En cryptant la connexion et en ne permettant qu'à certains utilisateur de s'y connecter.
- Apache : En créant un utilisateur différent par site (via le module userdir) et en bloquant l'accès ftp à tout autre dossier que le /home des utilisateur.
- le serveur en générale en utilisant des IpTables pour bloquer tout les ports du serveur sauf ceux que l'on va avoir besoin.
ssh
Nous allons tout d'abord créer un groupe ssh_allowed_user qui contiendra tout les utilisateur ayant accès au serveur via ssh.
On va maintenant y ajouter l'utilisateur amp (utilisateur créer pour installer et gerer notre serveur dans le tutoriel précédent)
Et on va modifier la configuration de ssh
Nous allons en profiter pour modifier le port par défaut de ssh. Il faudra modifier (ou ajouter suivant les cas) les lignes suivant
Pour valider nos modification il va falloir redémarrer le ssh.
ATTENTION
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)
ftp
Comment pour le ssh nous allons restreindre la liste des utilisateurs qui peuvent se connecter en ftp à notre serveur.
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.
ATTENTION
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.
Décommenter la ligne (en retirant le # devant):
Et ajouter le bloc :
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
Quelques explications :
- sudo -i : On se reconnecte en root pour vider le contenu du fichier (ne marche pas avec sudo)
- cat /dev/null > /etc/proftpd/tls.conf : On remplace le contenu du fichier de configuration par celui de /dev/null (qui est vide)
- exit : on quitte root
Modifier le fichier
Et ajoutez-y les lignes suivantes.
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
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
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
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)
Et ensuite on retourne sur amp pour continuer notre configuration via un
On va maintenant créer un nouveau site dans apache.
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
Afin de rendre le site disponible il faudra l'activer et recharger la configuration d'apache via :
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)
et on décommente la ligne
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
Et on va y mettre l'ensemble des règles suivantes :
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é.
Fail2ban
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.
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
Pour activer une règle il faudra changer le
en
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 mot de la fin
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.