Configurer un serveur CentOs 6/7 ultra sécurisé pour de l’hébergement Web

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é !

Remarque
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)
Tagués avec :
Publié dans : Configuration de serveurs linux
6 commentaires pour “Configurer un serveur CentOs 6/7 ultra sécurisé pour de l’hébergement Web
  1. Ghislain dit :

    Merci pour le tuto!!!

  2. Pbr18 dit :

    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 ?

  3. Serge dit :

    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 🙂

  4. Fabien LEGE dit :

    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.

  5. Sylar.T dit :

    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.

    • Sylar.T dit :

      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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*