Objectifs
Développeur d’applications web, je suis responsable de la gestion de plusieurs serveurs d’hébergement web. Ces serveurs tournent aujourd’hui majoritairement sous centos avec un Plesk. Hors, ces derniers moi, je me suis fait piratés plusieurs de ces serveurs de façon irréversible (formatage obligatoire) et à chaque fois à cause de failles créés par Plesk. Lassé de ces piratages, j’ai pris la décision de partir maintenant de serveurs nus (avec CentOS 6 uniquement, plus de Plesk ni d’autres fioritures) et de faire une configuration la plus sécurisée possible (Fonctions d’administrations accessibles uniquement depuis certaines adresses IP, plus de webmail ou autres portes d’entrés créant des failles dans le système. Cet article a donc pour ambition d’être un guide de configuration rapide pour monter un serveur Web efficace et sécurisé avec un système CentOS 6. Attention toute fois, je ne détaillerais pas ici le processus d’installation d’un système CentOS 6, la majorités des hébergeurs fournissant généralement ce système pré-installé gratuitement. (c’est le cas chez des géants comme 1&1 ou OVH).
Prérequis
Pour réaliser ce tuto, vous devez disposer des éléments suivants et respecter certaines règles indispensable au bon déroulement de l’opération :
- Disposer d’un serveur fonctionnant avec un système CentOS 6 vide ( pas de plesk ou autre logiciels installés)
- Disposer des accès root à ce serveur
- Disposer des connaissances de base en commandes console linux
Attention
Il est fortement recommandé de ne suivre ce tuto que sur un serveur vide, ne servant pas déjà de serveur de production ou contenant déjà des données importantes. Si vous choisissez de suivre malgrès tout ce tuto avec un serveur existant, pensez bien a faire des sauvegardes !
1 – Vérifier que le système est une version stable
Cette étape est indispensable ! Si vous n’utilisez pas une version stable du noyau linux, vous risquez de laisser accessible des failles de sécurité et tout le travail qui va suivre n’aura servi à rien.
uname -r
Cette commande doit vous retourner la version de votre noyau linux. Vérifiez bien que cette version comporte la mention « stable »
2. Personnalisation du .bashrc (facultatif)
Cette étape sert juste à personnaliser un peut la console de notre serveur, quelques couleurs c’est tout de même plus agréable pour travailler !
Editer le fichier .bashrc de votre profil avec votre éditeur favoris. Vous pouvez par exemple ouvrir ce fichier avec la commande suivante :
cd; vi .bashrc
Dans ce fichier, insérez la ligne suivante:
PS1='${debian_chroot:+($debian_chroot)}\[\e[1;33m\]\u\[\e[1;37m\]@\[\e[1;33m\]\h\[\e[1;37m\]:\[\e[1;31m\]\w \[\e[1;36m\]\$ \[\033[00m\]'
Petit bonus pour les utilisateurs de Symfony 2 :
Pour les utilisateurs de symfony 2, je vous offre deux petits alias à rajouter dans votre bashrc qui vous permetrons respectivement de vider les caches en productions et les caches en développement de façon plus rapide qu’avec la comande cache:clear de cet excélent framework. Ces alias s’exécute depuis la racine du projet symfony2 duquel on souhaite vider les caches
alias ccp='cd ./app/cache/; rm -rf prod/; chmod -R 777 .; cd ../../' alias ccd='cd ./app/cache/; rm -rf dev/; chmod -R 777 .; cd ../../'
3. Installer Apache (httpd)
Maintenant attaquons les choses sérieuses : L’installation de notre serveur web Apache :
yum install -y httpd
Une fois le programme installé, nous allons éditer le fichier /etc/httpd/conf/httpd.conf. Dans ce fichier recherchez la section commençant par
<Directory "/var/www/html">
et remplacez la directive « AllowOverride none » par « AllowOverride All« .
A la fin de ce fichier httpd.conf, ajoutez la ligne suivante :
Include vhosts/*.conf
Sauvegardez le fichier et quittez votre éditeur.
Nous allons maintenant créer un répertoire « vhosts » dans notre configuration apache dans lequel nous ajouterons un fichier de configuration pour chacun des site qui devra être gérer sur notre serveur
mkdir /etc/httpd/vhosts/
Et créez maintenant un fichier /etc/httpd/vhosts/[site].conf pour chacun de vos sites. Chacun de ces fichiers contiendra ceci :
NameVirtualHost *:80 <VirtualHost *:80> ServerAdmin [[email protected]] DocumentRoot /var/www/html/[votresite] ServerName [votredomaine.com] #Nom de domaine principal de votre site ServerAlias [www.votredomaine.com] #Dupliquer cette ligne pour chaque domaine supplémentaire qui pointe sur votre site web ErrorLog logs/[votresite]_error_log CustomLog logs/[votresite]_access_log common UseCanonicalName Off HostnameLookups Off </VirtualHost>
Pour en finir avec apache : exécutez la commande ci-dessous pour que le service httpd démare automatiquement avec votre serveur (en cas de redémarrage)
chkconfig httpd on
4 installer la dernière version de PHP
Nous allons ici installer PHP, généralement indispensable pour le fonctionnement d’un site web. Pour ce faire, nous allons ajouter le dépot atomic pour disposer de la toute dernière version de PHP, souvent indispensable lorsque vous travaillez avec des frameworks php comme Symfony2 ou Zend
wget -q -O - https://www.atomicorp.com/installers/atomic | sh yum clean all && yum check-update
Une fois le dépôt Atomic installé, on installe PHP et certaines de ses extensions indispensables :
yum install -y php && yum -y install php-xml
Créez enfin le fichier /etc/php.d/dom.ini pour y insérer la ligne suivante :
extension=dom.so
5. Installer mySQL
5.1 Pour CentOS 6
Souvent aussi indispensable que PHP : un serveur de bases de données mySQL que nous allons installer en exécutant les quelques lignes suivantes:
yum install -y mysql mysql-server chkconfig --level 2345 mysqld on; service mysqld start
Redémarrez maintenant les services web de votre serveur afin de prendre en compte les dernières configurations
service httpd restart
5.2 Pour CentOS 7
Sur CentOS 7, le serveur Mysql s’appelle maintenant MariaDB. Nous alons donc installer MariaDB de la façon suivante
yum -y install mariadb-server mariadb
Nous configurons ensuite le serveur pour que MariaDB démarre automatiquement avec le serveur
systemctl start mariadb.service systemctl enable mariadb.service
et on suit finalement l’assistant d’installation de mysql que l’on lance avec la commande suivante
mysql_secure_installation
Redémarrez maintenant les services web de votre serveur afin de prendre en compte les dernières configurations
service httpd restart
6. Installer le serveur FTP
Ici aussi, une fonctionnalité très utilisée pour transférer les fichiers de vos sites web:
yum install -y vsftpd chkconfig vsftpd on
Nous alons réaliser une copie de sauvegarde du fichier de configuration initial avant d’en créer un nouveau
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.back
créons maintenant un nouveau fichier de configuration /etc/vsftpd/vsftpd.conf qui contiendra ceci :
listen_port=21 # Port d’écoute ftpd_banner=Bienvenue ! # Bannière de bienvenue pam_service_name=vsftpd # Fichier de configuration de PAM listen=YES # Mode “standalone” anonymous_enable=NO # Pas de connexion anonyme local_enable=YES # Les utilisateurs système sont autorisés userlist_file=/etc/vsftpd/user_list # Fichier des utilisateurs userlist_enable=YES # Chargement de la liste userlist_file userlist_deny=YES # Il est indiqué ici que cette liste est celle des identifiants refusés, pas ceux autorisés anon_world_readable_only=NO # Un utilisateur virtuel pourra télécharger un fichier même s’il n’est pas lisible par tous write_enable=YES # Autorisation des commandes influant sur le système de fichier (STOR,DELE, RNFR, RNTO, MKD, RMD, APPE and SITE) anon_upload_enable=NO # Refus des droits d’écriture pour les anonymes (et donc utilisateurs virtuels) par défaut anon_mkdir_write_enable=NO anon_other_write_enable=NO chroot_local_user=YES # chroot des utilisateurs max_clients=50 # Nombre maximum de connexions simultanées max_per_ip=4 # Nombre maximum de connexions venant de la même IP
Attention
Les commentaires présents dans le fichier de configuration ci-dessus (commençants par ‘#’) ne doivent pas être laissés dans le fichier de configuration. Si vous rencontrez une erreur en redémarrant votre serveur FTP, pensez à vérifier qu’il ne reste pas de commentaire dans votre fichier de configuration.
Maintenant nous allons pouvoir créer différents utilisateurs et leur donner accès à des répertoires précis sur notre serveur :
useradd <nom_utilisateur> -d /var/www -g ftp passwd <nom_utilisateur> chown -R <nom_utilisateur>:ftp /var/www/html chmod -R 755 /var/www/html
L’exemple ci-dessus créer un utilisateur qui a pour répertoire par défaut /var/www (c’est dans ce répertoire qu’arrivera notre utilisateur lorsqu’il se connectera via un client FTP) et on le nome propriétaire du répertoire /var/www/html/. Cet utilisateur aura donc les pleins pouvoirs sur le dossier HTML mais ne pour à faire aucune modification au dossier www
Redémarrez enfin votre service FTP affin que les dernières configurations soient prises en compte
service vsftpd restart
7. Installer phpMyAdmin
phpMyAdmin est surement aujourd’hui l’outil incontournable pour la gestion visuelle de vos bases de données. Pour l’installer, nous allons avoir besoin du dépôt EPEL :
rpm -Uvh https://mirrors.kernel.org/fedora-epel/6/i386/epel-release-6-8.noarch.rpm
yum install -y phpmyadmin
yum install mod_ssl -y
Editez le fichier /etc/httpd/conf.d/phpMyAdmin.conf et recherchez les deux section « <Directory /usr/share/phpMyAdmin/> » et « <Directory /usr/share/phpMyAdmin/setup/>« .
Dans chacune de ses section, ajouter dans la condition « <IfModule !mod_authz_core.c> » la ligne suivante:
Allow from [ip_de_votre_bureau]
Ajoutez autan de fois cette ligne qu’il le sera nécessaire afin que toutes vos adresses IP aient accès à phpMyAdmin.
Exécutez enfin cette commande afin que phpMyAdmin puisse accéder au serveur mySQL
/usr/bin/mysqladmin
-u root password
'[password]'
Et redémarrez enfin vos services web pour pouvoir finalement accéder à phpMyAdmin depuis votre l’adresse https://mondomaine.com/phpmyadmin.
service httpd restart
Un message d’avertissement apparaîtra peut-être vous informant que le site auquel vous tentez d’accéder n’est pas sécurisé : C’est normal vus que vous ne disposez pas de certificat SSL, vous pouvez cliquer sur « continuer » pour accéder à phpMyAdmin
Vous voila maintenant en possession d’un superbe serveur web sécurisé !
Si vous utilisez le framework php Symfony 2, La configuration que nous venons de faire ne suffira pas à faire fonctionner une application Symfony 2. Vous pouvez lire mon article Préparer un serveur CentOS6 & Plesk à accueillir un projet Symfony2 qui vous guidera dans l’installations des quelques extensions manquantes pour votre projet Symfony2. (Ne tenez évidement pas compte des étapes spécifiques à Plesk de ce tutorial)
Publié dans : Configuration de serveurs linux
Merci pour le tuto!!!
Bonjour,
Que fais-tu de selinux ?
Quel est l’intérêt d’ultrasécuriser un serveur web si tu y accèdes en FTP là où ton mot de passe circule en clair sur le réseau ?
C’est bien gentil tout ça, mais ULTRA SECURISE, je vois pas où ?!
Rien pour sécuriser ROOT, SSH, FW…
Bref, j’ai un grand doute sur cette sécurisation 🙂
Effectivement l’aspect sécurité peux être perfectionné. A l’époque de la rédaction de cet article la sécurité été surtout de n’avoir un serveur ne contenant que le nécessaires et éviter d’utiliser des surcouches comme Plesk qui (dus moins à l’époque) était une vraie passoire.
Il y aurait effectivement de nombreuses pistes d’amélioration à apporté comme fail2ban, les certificats SSL que l’on peut par exemple récupérer gratuitement sur letsencrypt.org et la désactivation de l’accès root en ssh.
Pour le Root :
Changer vos ports en des ports mini de 4 chiffres Ex: 4029
Pour le FTP :
Désactiver les connections root / jail utilisateurs dans leurs dossier et changer port comme précédemment.
Si possible ajouter le TLS ou carrément le SFTP pour les plus parano.
Installation :
Fail2Ban référencer vos ports customs.
Vous avez désormais quelque chose de pas mal j’esquive le scan port car à moins de chauffer le hacker vous ne risquerez que de perdre de la ram à « empêcher » les scans de port.
J’oublier et vu qui à pas d’édit je poste une réponse.
SSH :
Pensez à interdire la connexion en root vous vous loguerez avec un utilisateur qui possède le sudo et go sudo su plus safe.
Pour finir pensez à changer bien évidemment le port et le référencer dans Fail2Ban.
Voilou