Centos 7 - Partie 1

AUTO-HEBERGEMENT - PARTIE1/4

REALISATION D'UN SERVEUR WEB sous CENTOS7
(APACHE, MARIADB, PHP7.1 ou PHP7.2, COMPOSER, PHPMYADMIN, WEBFTP, SSH/SFTP, FTP).
FEVRIER 2018.

Préambule

Dans cette première partie, le tutoriel ci-dessous rassemble en un seul document les différentes étapes qui permettent de monter un serveur CENTOS 7 opérationnel sur lequel s'appuient, dans les versions les plus récentes, les modules APACHE, MARIADB , PHP7, COMPOSER, PHPMYADMIN, NET2FTP, FTP, SFTP. Le contexte de sécurité prescrit par SELINUX n'est ni modifié ni même inhibé.

Une deuxième partie est plus particulièrement dédiée à la sécurisation du serveur à minima. Elle comprend l'installation de FAIL2BAN, WATCHLOG, HAVEGED,

Une troisième partie est consacrée à la mise en oeuvre de quatre CMS, Drupal en version 7x et 8.x, Joomla en version 3.x, Wordpress et Typo-3. Elle est en cours de rédaction.

Une quatrième partie encore en travaux permettra de disposer au final d'une solution complète d'hébergement web.

Conventions

# indique une commande
-> indique le résultat de la commande
=> indique une modification à effectuer dans un fichier de configuration
=>> indique une action effectuée à partir d'un autre ordinateur du réseau.

 

CENTOS 7 - SOMMAIRE

Les différentes étapes nécessaires pour disposer d'un serveur Web utilisant un CMS Drupal 8 et une CentOS v7.

a) Installer CentOS 7.4 (Core 1708)

b) Installer Apache à partir du repo standard

c) Installer un certificat SSL

d) Installer MariaDb version 5.5 ou 10.X

e) Installer PHP version 7.x ou inférieure

f) Installer COMPOSER v1.3

g) Installer phpMyAdmin

h) Installer un serveur WebFTP (Net2FTP)

i) Installer un serveur FTP

j) Installer un serveur SFTP

k) Installer un serveur web avec php et mariadb (minimum de commandes)

 

CENTOS V7 - Installation et Mise à jour

CentOS sera installée en version 7 - V7.4.(Core 1708) 64bits version minimale sortie en version stable le 13 septembre 2017.

Pas de difficulté particulière sur cette étape. Voir la procédure d'installation.
Assurez vous d'installer la version minimale et de configurer le réseau avec une adresse IP statique.

 

CENTOS V7 - Paramètrage

Pre-requis : Centos7 core 1611 ou 1708, installé en version minimale, réseau actif.

1°) Informations sur le système installé

# cat  /etc/centos-release
-> CentOS Linux release 7.4.1708 (Core)

ou de façon plus complète

# hostnamectl
-> Static hostname: test2.home
         Icon name: computer-vm
           Chassis: vm
        Machine ID: f3bd1694...
           Boot ID: b3d8e620...
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-693.17.1.el7.x86_64
      Architecture: x86-64

 

2°) Activer la carte réseau au démarrage de la machine (si non effectuée lors de l'installation)

# vi /etc/sysconfig/network-scripts/ifcfg-enp2s0 ou ifcfg-eth0
=> Modifiez le paramètre ONBOOT="no" en ONBOOT="yes"

Mémo : Le nom des interfaces réseau sont préfixées par "en" pour les réseaux ethernet, "wl" pour les réseaux Wifi local et "ww" pour les réseau WWAN. Ils remplacent les anciennes appelations : eth0, wlan0 et wwan0 qui restent toujours actives notamment sur les machines virtuelles.

Démarrer le réseau

# systemctl start network

Vérifier la configuration réseau

# ip addr show (ou #ip a pour les moins courageux)
-> 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
         valid_lft forever preferred_lft forever
      inet6 ::1/128 scope host
         valid_lft forever preferred_lft forever
  2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
     link/ether 08:00:27:60:4e:82 brd ff:ff:ff:ff:ff:ff
     inet 192.168.56.2/24 brd 192.168.56.255 scope global dynamic eth0
        valid_lft ...
     inet6 2a01:cb00:817a:5600:28ed:ed54:eded:dede/64 scope global ...
        valid_lft ...
     inet6 fe80::4cf2:...

Quelques commentaires sur les informations affichées :
1: et 2: représentent les deux interfaces "réseau" actives.
lo: correspond à l'interface de loopback (boucle) dont l'adresse IPV4 est 127.0.0.1 et l'adresse IPV6 est ::1. Cette interface est obligatoirement présente sur toutes les machines où le protocole TCP/IP est installé. Elle sert à tester le bon fonctionnement du protocole avec les commandes : ping localhost, ping 127.0.0.1 ou encore en IPV6 ping -6 localhost.
eth0 ou enp2s0: correspond au nom de la première interface réseau utilisée pour communiquer entre une ou plusieurs machines. On trouve encore parfois l'ancienne appellation eth0: comme présentement.
link/ether : correspond à l'adresse MAC encore appelée adresse ethernet. Cette adresse est dans la théorie unique au monde. Elle permet d'identifier de façon unitaire une interface en fonction des différents contructeurs de cartes réseaux.
inet : c'est l'adresse IPV4 sur 32bits.
brd : c'est l'adresse de broadcast.
inet6 : c'est l'adresse IPV6 globale sur 128 bits (peut sortir du réseau local pour communiquer sur Internet)
inet6 fe80:: c'est l'adresse IPV6 locale (ne sort pas du réseau local)

Tester le protocole TCP/IP du serveur (ping du serveur)

# ping -6 localhost
-> PING localhost(localhost (::1) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.100ms
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.110ms
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.110ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.100/0.105/0.110/0.004 ms
# ping 192.168.56.2
-> PING 192.168.56.2 (192.168.56.2) 56(84) bytes of data.
64 bytes from 192.168.56.2: icmp_seq=1 ttl=64 time=0.711 ms
64 bytes from 192.168.56.2: icmp_seq=2 ttl=64 time=0.753 ms
64 bytes from 192.168.56.2: icmp_seq=3 ttl=64 time=0.629 ms
^C
--- 192.168.56.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.629/0.697/0.753/0.059 ms

Taper Ctrl-C pour arrêter les "pings".

Tester la connectivité IP (ping du routeur ou de la box)

# ping 192.168.56.1
-> PING 192.168.56.1 (192.168.56.1) 56(84) bytes of data.
64 bytes from 192.168.56.1: icmp_seq=1 ttl=64 time=0.711 ms
64 bytes from 192.168.56.1: icmp_seq=2 ttl=64 time=0.753 ms
^C
--- 192.168.56.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.711/0.730/0.753/0.059 ms...

Ctrl-C pour arrêter le ping et afficher les statistiques.
0% packet loss, signifie que le routeur a bien reçu chaque ping et qu'il y a correctement répondu. Tout est Ok.

Si en réponse du Ping, vous avez autre chose du genre :

-> PING 192.168.56.1 (192.168.56.1) 56(84) bytes of data.
PING 192.168.56.1 icmp_seq=1 Destination Host Unreachable
PING 192.168.56.1 icmp_seq=1 Destination Host Unreachable
...

C'est qu'il y a un soucis. Il faut alors s'assurer que le serveur et le routeur sont bien connectés, qu'ils sont paramètrés sur le même réseau, et revoir la configuration réseau du serveur avant d'aller plus loin.

 

3°) Vérifier la mise à jour du système Centos-7

Mise à jour du système

# yum update

A noter que lorsqu'un nouveau noyau (kernel en anglais) est installé comme représenté ci-dessous, il faudra redémarrer le serveur pour qu'il soit pris en compte.

=========================================================================
 Package             Architecture     Version             Dépôt    Taille
=========================================================================
Installation :       x86_64           3.10.0-693.2.2.el7  updates    43 M
 kernel
...

 

4°) Installer quelques outils : vim et/ou nano, net-tools, wget (commandes non activées dans Centos 7 (à partir du core 1511) version minimale)

Les indispensables

# yum install nano wget yum-utils

- nano est un éditeur de texte un peu plus convivial que "vi" (1,5 Mo). Il a l'avantage d'être trés léger par rapport à "vim" (30 Mo).

- wget permet de télécharger un fichier en mode ligne de commande, (exemple : télécharger drupal-8.4.0)

# wget https://ftp.drupal.org/files/projects/drupal-8.4.0.tar.gz

- yum-utils permettra de supprimer les anciens noyaux après plusieurs mises à jour via le commande suivante :

# package-cleanup --oldkernels --count=2  // conserve les deux derniers noyaux et supprime tous les autres
# df  // permet d'afficher le taux d'occupation des partitions. La partition /boot est d'environ 512 Mo par défaut. Un noyau a une taille moyenne de 130 Mo. Il faut penser de temps en temps à faire le ménage.

Les optionnels

# yum install vim NetworkManager-tui yum-plugin-priorities net-tools

- vim permet de disposer d'un éditeur vi amélioré (30 Mo, c'est un peu lourd surtout si vous êtes limité en espace disque).
- NetworkManager-tui permet de configurer l'interface réseau en mode graphique, (commande : # nmtui)
- yum-plugin-priorities permet de gérer les priorités des dépôts utilisés en positionnant une priorité adaptée à chaques dépôts. Installation à éviter au début tant que la gestion des dépôts n'est pas acquise.
- net-tools permet de disposer de quelques outils réseau et notamment de la commande "ifconfig" qui est maintenant une commande désuette et qui peut être remplacée avantageusement par la commande "ip addr" ou "ip a".

 

Pour mémoire : Modification temporaire du status de Selinux,

Ces commandes sont à garder sous le coude. Elles peuvent identifier rapidement si SElinux est à l'origine d'un comportement anormal.

# sestatus -> pour afficher le statut de selinux
# setenforce = 0 -> permissif, 1 -> enforcing, 2 -> disable
# getenforce -> donne l'état courant de SElinux

Dans ce tutoriel, et dans la limite du possible, SElinux restera activé en mode "enforcing". Il est préférable de comprendre le fonctionnement de cet outil de sécurité plutôt que de le condamner au premier faux pas même si j'en conviens, c'est parfois franchement énervant surtout au début. Cependant, avec l'expérience, lorsque ça ne fonctionne pas alors que ça devrait, il faut penser avant tout à SElinux ou au firewall.

 

5°) Installer les repository epel-release, webtatic, ius

Lister les repos installés

# yum repolist
-> 
Id du dépôt                  Nom du dépôt            statut
!base/7/x86_64               Centos-7 - Base         9 591
!extras/7/x86_64             Centos-7 - Extras         197
!updates/7/x86_64            Centos-7 - Updates        679
repolist: 10 467

Installer le repo EPEL-RELEASE (permet de dispose de packages plus récents (même si ce n'est pas encore la panacée).

# yum install epel-release
-> Installé :
epel-release.noarch 0:7-9
# yum update
-> Mis à jour :
   epel-release.noarch 0:7-11

Installer le repo WEBTATIC (pour php7 - note ; epel-release doit être installé avant webtatic)

# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

Pour mémoire : Installer le repo IUS (optionnel, Attention : pose problème pour certains modules php7)

# rpm -Uvh https://centos7.iuscommunity.org/ius-release.rpm
# yum install ius
-> Installé
ius-release-1.0-14.ius.centos7.noarch

 

Note : Pour mettre à jour un repo ou un package spécifique

# yum update <package> --disablerepo=/* --enablerepo=epel-release

 

6°) Quelques astuces sur la ligne de commande

La ligne de commande, c'est la ligne où, dans un terminal, on saisit les commandes avec leurs options et leurs paramètres. La commande history permet d'afficher l'historique des commandes qui ont été exécutées.

# history
->
  1  exit
  2  yum update
  3  startx
  4  package-cleanup --oldkernel --count=2
  5  shutdown -r now
  6  history

Les touches "flèche haut" et "flèche bas" permettent de naviguer dans l'historique. La touche "Enter" positionnée sur une commande de l'historique permet de réexécuter la commande.

7°) Quelques raccourcis clavier de la ligne de commande

- placer le curseur :
    au début de la ligne : CTRL + a
    à la fin de la ligne : CTRL + e

- couper/coller :
    copie de la position du curseur à la fin de la ligne : CTRL + k
    copie de la position du curseur au début de la ligne : CTRL + u
    colle la chaine coupée : CTRL + y

- autocomplétion
    la touche TAB permet de compléter un nom de fichier existant
    ex : pour simplifier la saisie de la commande "ls mon_nom_de_fichier_a_rallonge" on peut saisir "ls mon_" + <TAB>

 

CENTOS 7 - APACHE

Le fichier de configuration du Serveur HTTP Apache est : /etc/httpd/conf/httpd.conf.
Les fichiers de log sont : /var/log/httpd/error_log, access_log, request_log, ...

Installer apache

# yum install httpd -y
# httpd -v
-> Server version: Apache/2.4.6 (CentOS)
   Server built: Oct 19 2017 20:39:16

1°) Démarrer Apache et activer le démarrage permanent

# systemctl start httpd 
# systemctl enable httpd
-> Created symlink from /etc/sysyemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service

2°) Ouvrir le parefeu sur les protocoles HTTP (port 80) et HTTPS (port 443)

# firewall-cmd --permanent --add-service=http
-> success
# firewall-cmd --permanent --add-service=https
-> success
# systemctl restart firewalld (ou firewall-cmd --reload)
-> success

Erreur fréquente : Ne pas omettre de relancer le service firewalld à chaque modification.

3°) Tester Apache dans un navigateur
=>> sur un poste client : http://<adresse_IP_du_serveur>/
On obtient la page de test ci-dessous.

Notes :
Au démarrage httpd s'exécute sous privilège "root" puis créé plusieurs processus enfants qui s'exécutent sous privilèges restreints. -> Module multi-Processus (MPM)

4°) Gestion du serveur Apache

a) Lister les modules chargés

# httpd -M | more
-> Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 ...

b) Localiser et se positionner dans l'espace de publication par défaut.

# cd /var/www/html/

c) Créer ma première page HTML

# echo "<html><body><br /><center>Bonjour</center></body></html>" > index.html

d) Test de la page nouvellement créée dans un navigateur

=>> sur un poste client : http://<adresse_IP_du_serveur>/

 

5°) Fixer le contexte SElinux pour httpd

a) Afficher tous les paramètres SElinux pour httpd

# getsebool -a | grep httpd
-> httpd_anon_write --> off
httpd_builtin_scripting --> on
...
httpd_verify_dns --> off

b) Autoriser httpd à envoyer des mails

# setsebool -P httpd_can_sendmail=1
ou
# setsebool -P httpd_can_sendmail on

Note : le paramètre -P correspond à une modification permanente. Si omis, la modification sera effective jusqu'au prochain redémarrage de la machine.

c) Autoriser httpd à se connecter par le réseau

# setsebool -P httpd_can_network_connect=1

d) Autotiser httpd à se connecter aux bases de données

# setsebool -P httpd_can_network_connect_db=1

 

Apache - Consulter les fichiers journaux (log)

Localisation du fichier d'erreur -> /var/log/httpd/error_log

Visualisation en continue du journal d'erreurs :

# tail -f /var/log/httpd/error_log

Localisation du fichier d'activités et affichage des 25 dernières lignes -> /var/log/httpd/access_log

# tail -f -n25 /var/log/httpd/access_log

A noter que l'option "-n" permet d'afficher le nombre de lignes spécifiées.

 

Installation du module SSL

# yum install mod_ssl

Le fichier de configuration se trouve à l'emplacement /etc/httpd/conf.d/ssl.conf

Les fichiers de logs sont dans "/var/log/httpd/". On trouvera les journaux SSL (ssl_error_log, ssl_access_log, ssl_request_log).

 

Apache - Comment organiser mes sites ?

En fonction du projet, il y a plusieurs réponses.

- Hébergement d'un seul site sur un seul serveur
Les fichiers du site sont déposés directement à la racine WEB (/var/www/html/). L'URL d'accès au site étant http://@IP_du_serveur_web/

- Hébergement de plusieurs sites - mode classic (ex : drupal7 et drupal8) - sur un seul serveur
Les fichiers de chaques sites seront déposés dans les répertoires respectifs (/var/www/html/drupal7 ou /var/www/html/drupal8).
Le code suivant met en place deux sites web, l'un sur drupal7 et l'autre sur drupal8. Pour la procédure d'installation complète voir la section appropriée sur les CMS.

# cd /var/www/html/     // postionnement dans le répertoire par défaut
# wget https://ftp.drupal.org/files/projects/drupal-8.4.0.tar.gz  // téléchargement drupal8
# wget https://ftp.drupal.org/files/projects/drupal-7.56.tar.gz   // téléchargement drupal7
# taz xzf drupal-8.4.0.tar.gz   // décompression drupal8
# taz xzf drupal-7.56.tar.gz    // décompression drupal7
# mv drupal-8.4.0 drupal8      // changement de nom du répertoire
# mv drupal-7.56 drupal7      // changement de nom du répertoire
# rm -f drupal-*   // suppression des fichiers téléchargés

Pour accéder à drupal8, dans la barre d'adresse du navigateur, =>> saisir : @IPduServeur/drupal8/ . On accède alors à la page d'installation de drupal8. Dans cette configuration, les sites drupal7 et drupal8 sont accessibles à tous les utilisateurs.
A noter qu'il est plus simple d'effectuer le téléchargement et la décompression des fichiers "drupal-X.XXX.tar.gz" directement dans le répertoire /var/www/html/drupalX pour bénéficier automatiquement du contexte SElinux. Si par exemple le téléchargement et la décompression sont effectuées dans le répertoire /tmp en déplaçant par la suite le répertoire drupal7 dans le répertoire par défaut du serveur WEB (/var/www/html/drupalX), le contexte SElinux des fichiers déplacés sera incompatible avec le processus httpd et le site ne fonctionnera pas correctement tant que le contexte SElinux affecté à httpd n'aura pas été restauré.

- Hébergement de plusieurs sites - mode VirtualHost - sur un seul serveur
Ce mode reprend point par point l'exemple précédent avec une configuration particulière d'Apache pour créer les virtualhosts. Du point de vue de l'internaute, chaque site sera vu comme étant installé sur un serveur unique. L'accès au site web s'effectue de façon diffférente par rapport à l'exemple précédent. Dans la barre d'adresse d'un navigateur, il faudra =>> saisir drupal8.<nom_du_domaine.tld>. Exemple =>> : drupal8.pbr18.xyz où pbr18 est le nom de domaine et .xyz le TLD. C'est l'objet du paragraphe suivant.

- Hébergement de plusieurs sites sur plusieurs serveurs
Dans ce mode on privilégiera l'utilisation d'un "Reverse Proxy". Le "Reverse Proxy", c'est un serveur Web (FrontEnd) qui est configuré pour recevoir essentiellement les flux http/https/ftp en provenance d'Internet afin de les redistribuer sur les serveurs Web adéquats (BackEnd).
La configuration d'un "reverse proxy" sous Apache est décrite dans la partie 1.2.

 

Apache - VirtualHost

Préambule

Le répertoire du site web par défaut est localisé sur /var/www/html/. Si il n'y a qu'un seul site web à héberger, c'est à cet emplacement qu'il faudra placer les fichiers du site, arborescence incluse. En revanche si l'idée d'installer plusieurs sites commence déjà à faire son chemin, il sera préférable d'ores et déjà de mettre en place des hôtes virtuels. Les hôtes vituels (virtualhost) sont des sites web qui seront installés sur le même serveur. Exemple : un site sous Drupal-7 pour la stabilité et un autre sous Drupal-8 pour l'expérimentation. A noter que Drupal-7, tout comme Drupal-8 sont capables de gérer le multisites sur leur version respective mais ce n'est pas le propos ici. De façon générale un site = 1 virtualhost.

A noter encore que les virtualhosts doivent être déclarés dans les serveurs DNS (Directory Name Service) pour être accessibles. Cette partie est donc un peu plus compliquée car il faudra monter et gérer ses propres serveurs DNS. Une section particulière sera consacrée à ce sujet.

 

Apache : Espace web privé (userdir)

Il s'agit ici de créer un serveur web dans la home directory de l'utilisateur. Ce dernier disposera alors de son propre site en gestion directe. A noter que le répertoire utilisateur peut-être mis en place lors de la création d'un compte utilisateur avec la commande :

# useradd -m <Nom_du_Compte_Utilisateur>

Exemple :

# useradd -m toto
# ll /home
-> total 0
drwx------. 2 toto toto 62 06 juin 06:38 toto

Configuration Apache pour l'utilisation des "userdir"

# vi /etc/httpd/conf.d/userdir.conf
<IfModule mod_userdir.c>
UserDir enabled <Compte_utilisateur1> <compte_utilisateur2>
UserDir public_html
</IfModule>

<Directory "/home/*/public_html">
  Options Indexes Includes FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

Commentaires :
UserDir enabled -> autorise les comptes spécifiés à disposer d'un site web dans leur "home directory". Si les utilisateurs ne sont pas précisés, tous les comptes disposeront de cette possibilité.
UserDir public_html -> c'est le répertoire par défaut qui hébergera le site web de l'utilisateur. Il faut décommenter la directive pour l'activer.
Exemple : /home/toto/public_html/

Si les droits sont positionnés de façon inappropriée, le navigateur affichera le message "403 Forbidden".

Mise en place d'un répertoire utilisateur (1ère approche)

# useradd -m user1
# mkdir /home/user1/public_html
# chmod 711 /home/user1             // (-rwx--x--x)
# chmod 755 /home/user1/public_html // (-rwxr-xr-x)

Cette approche fonctionnera tout en restant assez légère sur le plan de la sécurité.

Mise en place d'un répertoire utilisateur (2ème approche)

# useradd -m user1
# gpasswd -a apache user1
# mkdir -p /home/user1/public_html
# chown -R user1:user1 /home/user1/public_html
# chmod 710 /home/user1             // (-rwx--x---)
# chmod 750 /home/user1/public_html // (-rwxr-x---)

Dans cette seconde approche, apache est intégré dans le groupe de l'utilisateur. Le propriétaire (user1) a tous les droits, le groupe user1 dont apache fait partie peut avoir des droits plus restreint : Sur le répertoire utilisateur, apache à juste besoin de pouvoir le traverser. Sur le répertoire public_html, apache doit pouvoir le traverser et lire les fichiers. Si apache doit écrire dans le répertoire public_html, il faudra ajouter le droit écrire sur ce répertoire (chmod 770 /home/user1/public_html).

Paramètrage de SELinux pour le serveur Web

# setsebool -P httpd_enable_homedirs true
# setsebool -P httpd_read_user_content true

httpd_enable_homedirs : autorise httpd à utiliser les répertoires des utilisateurs.
httpd_read_user_content : autorise httpd à lire un contenu dans le répertoire utilisateur.

Configuration SELinux (application du contexte SELinux lié aux fichiers gérés par httpd)

# chcon -R -t httpd_sys_content_t /home/user1/public_html

La commande chcon fixe le contexte de sécurité du répertorie public_html pour httpd.
A noter que le contexte de sécurité mis en place par chcon est appliqué de façon non permanente. En effet, si le contexte de sécurité général du serveur doit être relancé, les contextes de sécurité mis en place par chcon seront tous inhibés. Pour éviter ce désagrément, la solution consiste à utiliser la commande semanage (voir SElinux).

Création d'un fichier html pour l'exemple

# vi /home/user1/public_html/index.html
<html>
  <body>
    <div style="width: 100%; font-size: 50px; text-align: center;">
    Répertoire de l'utilisateur <Compte_utilisateur>. 
    <h1>Page de test.
    </div>
  </body>
</html>
# chmod 644 /home/user1/public_html/index.html
# chown -R user1:user1 /home/<user1>/

# systemctl restart httpd

Test du site Web de l'utilisateur "user1" dans un navigateur

http://ip/~user1

 

CENTOS 7 - MARIADB

MariaDB se décline en deux versions distinctes : la version 5.5 installable via le repo CentOS (solution très simple) ou la version 10.1 via le repo MariaDB. Je préconise l'installation de la série 10. Néanmoins, la procédure d'installation de MariaDB 5.5 est donnée ci après.

A) MariaDB 5.5

1°) Installation du serveur mariadb et du client

Fichier de configuration : /etc/mysql/my.cnf

# yum install mariadb-server mariadb -y

# systemctl start mariadb
# systemctl enable mariadb
-> Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

2°) Positionner les sécurités (mots de passe, ...)

# mysql_secure_installation
->Mot de passe courant : <return>
-> Modifier le password root ? [Y/n] : Y
-> Nouveau Mot de passe ? ********
-> Supprimer les utilisateurs anonymes ? [Y/n] : Y
-> Bloquer les connections root distantes ? [Y/n] : Y
-> Supprimer la base de tests et les droits d'accès ? [Y/n] : Y
->Recharger les privilèges des tables ? [Y/n] : Y
Thank for using MariaDB!

MARIADB est installée.

3°) Test de l'installation

# mysql -u root -p
-> Enter password: ***
Welcome to the MariaDB monitor.
Server version: 5.5.52-MariaDB MariaDB Server
...
MariaDB {(none)]> quit;
Bye

4°) Les principales commandes SQL

Pour utiliser les bases de données relationnelles, il est parfois judicieux de connaître quelques commandes. C'est l'objectif du lien ci-après : Voir les commandes SQL de base.

B) MariaDB 10.1

Voir la procédure d'installation.

 

CENTOS 7 - PHP

Préambule

Plusieurs choix possibles : Installation de PHP v5.4 standard, installation de PHP 5.6 via le dépôt EPEL, installation de PHP v7.0.2 via le dépôt WEBTATIC, compilation PHP v7.0.10 (version 18/08/2016) via le site php.net. La section "Compilation" est mise de côté pour l'instant. On s'attachera donc soit à déployer la version native (5.4.16), soit à mettre en place la dernière version majeure de PHP. A noter que le choix de l'une ou l'autre des solutions dépend notamment des pre-requis applicatifs. Sachant que PHP v5.4 n'est plus soutenu, il semble plus judicieux de déployer à minima le version 5.6.x.

A ce stade, on se trouve confronté à un dilemne : Installer la version désuette de PHP et renoncer par exemple à installer DRUPAL-8 ou installer une des dernières versions et se retrouver confronté à des conflits d'installation sur des applications telles que phpMyAdmin, ... Il y a là une stratégie de mise à jour des paquets qui m'échappe.

 

A°) Installation de PHP5 (standard)

# yum install php
# php -v
-> PHP 5.4.16 (CLI) (Built: jun 23 2015)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies 

Test du fonctionnement de PHP

# vi /var/www/html/testphp.php
-> <?php
-> phpinfo();
->?>

Enregistrer et tester l'accès à ce fichier dans le navigateur.

http://@IP_du_server_web/testphp.php

 

B) Installation de PHP5.6

Sur le repos ius (pose problème)

# yum install php56u php56u-opcache php56u-gd php56u-mbstring php56u-pdo php56u-mysql php56u-pecl-xdebug php56u-mcrypt

# php -v
-> PHP 5.6.24 (CLI) (Built: Aug 16 2016 10:22:08)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
   with Zend OPcache v7.0.6-dev, Copyright (c) 1998-2016 Zend Technologies
   with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans

php56 est maintenant opérationnel.

 

C°) Installation de PHP7

a') Sur le repo webtatic.com (repo préféré)

1°) Installer ou mettre à jour le repository webtatic

# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

2°) Installer PHP7.1 ou PHP7.2

Pour PHP 7.1

# yum install php71w php71w-opcache php71w-gd php71w-mbstring php71w-pdo php71w-mysql php71w-cli php71w-mcrypt php71w-xml
# php -v
-> PHP 7.1.10 (cli) (built: ...) (NTS)
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
     With Zend Opcache v7.1.10, ...

 

Pour PHP 7.2

# yum install php72w php72w-opcache php72w-gd php72w-mbstring php72w-pdo php72w-mysql php72w-cli php72w-mcrypt php72w-xml
# php -v
-> PHP 7.2.2 (cli) (built: ...) (NTS)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
     With Zend Opcache v7.2.2, ...

 PHP7 est maintenant opérationnel.

 

3°) Installation PHP7 en remplacement d'une version antérieure existante

# yum install yum-plugin-replace
# yum replace php-common --replace-with=php71w-common ...

ou en mode yum shell

# yum shell
  remove php-common
  install php71w-common
  run
# systemctl restart httpd

 

CENTOS 7 - COMPOSER

COMPOSER est l'une des solutions permettant de contourner les conflits d'installation des repositorys.

1°) Installation de Composer

# cd /tmp
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php -r "if (hash_file('SHA384', 'composer-setup.php') === '55d6ead61b29c7bdee5cccfb50076874187bd9f21f65d8991d46ec5cc90518f447387fb9f76ebae1fbbacf329e583e30') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
# php composer-setup.php
# mv composer.phar /usr/local/bin/composer

# composer --version
-> Composer version 1.3.1 2017-01-07 18:08:51

 

CENTOS 7 - PHPMYADMIN

Pour l'installation de phpMyAdmin, il existe plusieurs méthodes. Je retiendrai ici la méthode manuelle, une méthode qui utilise composer et la méthode la plus simple qui utilise les repos Centos. Le repo Epel-Release fourni une version phpMyAdmin relativement ancienne qui reste aujourdhui encore incompatible avec PHP 7. La version manuelle reste encore celle qui offre le plus de souplesse.

1°) Installation manuelle

a) Télécharger phpMyAdmin

# wget https://files.phpmyadmin.net/phpMyAdmin/4.8.0.1/phpMyAdmin-4.8.0.1-all-languages.zip

b) Décompresser le fichier

# tar xzf phpMyAdmin-4.8.0.1-all-languages.tar.gz

c) Créer le fichier config.inc.php

# cp /home/user/public_html/config.sample.inc.php /home/user/public_html/config.inc.php

e) Modification des paramètres

# vi /home/user/public_html/config.inc.php
->...
$cfg['Servers'][$i]['auth_type'] = 'http';
$cfg['Servers'][$i]['host'] = '<@ip_du_serveur_de_base_de_données>';
$cfg['MaxRows'] = 100;
$cfg['DefaultLang'] = 'fr';
$cfg['VersionCheck'] = false;

f) Pour permettre à phpMyAdmin d'utiliser le répertoire ./tmp, il faut activer httpd_unified sinon le message d'information ci-dessous apparaît :

<$cfg['TempDir'] (./tmp/) n'est pas accessible. phpMyAdmin est incapable de mettre en cache les modèles et de ce fait sera lent.>
# mkdir -p /var/www/html/phpmyadmin/tmp
# chmod u=rwx,go= /var/www/html/phpmyadmin/tmp
# chown -R apache:apache /var/www/html/phpmyadmin/tmp
# setsebool -P httpd_unified 1

g) Mise en placedu VirtualHost

# touch /etc/httpd/conf.d/phpmyadin.conf
# vi phpmyadmin.conf
->
<VirtualHost <@ip_du_serveur_web>:80>
        ServerName phpmyadmin.vhost.fr
        ServerAlias phpMyAdmin.vhost.fr phpMyadmin.vhost.fr phpmyAdmin.vhost.fr

        DocumentRoot /var/www/html/phpmyadmin/
        <Directory /var/www/html/phpmyadmin/>
                AddDefaultCharset UTF-8
                Options FollowSymLinks MultiViews
                AllowOverride All
                Require all granted
        </Directory>

        <Directory /var/www/html/phpmyadmin/setup/>
#               <IfModule mod_authz_core.c>
                <RequireAny>
                        Require ip 127.0.0.1
                        Require ip ::1
                </RequireAny>
#               Require all granted
#               </IfModule>
        </Directory>
# These directories do not require access over HTTP - taken from the original
# phpMyAdmin upstream tarball
#
        <Directory /var/www/html/phpmyadmin/libraries/>
                Order Deny,Allow
                Deny from All
                Allow from None
        </Directory>
        <Directory /var/www/html/phpmyadmin/setup/lib/>
                Order Deny,Allow
                Deny from All
                Allow from None
        </Directory>
        <Directory /var/www/html/phpmyadmin/setup/frames/>
                Order Deny,Allow
                Deny from All
                Allow from None
        </Directory>
# This configuration prevents mod_security at phpMyAdmin directories from
# filtering SQL etc.  This may break your mod_security implementation.
#<IfModule mod_security.c>
#    <Directory /usr/share/phpmyadmin/>
#        SecRuleInheritance Off
#    </Directory>
#</IfModule>
        Errorlog /var/log/httpd/a00100.log
        LogLevel warn
</VirtualHost>

 

2°) Installation de phpMyAdmin 4.6.5.2 via Composer

Composer a besoin du module PHP xml pour établir les dépendances. En cas d'oublie on aura le message suivant Problem 1

# yum install php71w-xml

# cd /usr/share/

# composer create-project phpMyAdmin/phpMyAdmin --repository-url=https://www.phpmyadmin.net/packages.json --no-dev
->
- Installing phpmyadmin/phpmyadmin (4.6.5.2)
- Installing phpmyadmin/phpmyadmin (4.6.5.2) Loading from cache
Created project in /usr/share/phpmyadmin
Loading composer repositories with package information
Updating dependencies
Writing lock file
Generating autoload files

Mise en place du fichier de configuration

# cd phpmyadmin
# cp config.sample.inc.php config.inc.php
ln -s /usr/share/phpmyadmin/config.inc.php /etc/phpMyAdmin/config.inc.php
# vi /etc/phpMyAdmin/config.inc.php
[...]
$cfg['Servers'}[$i]['auth_type'] = 'http';   // Remplacer 'cookie' par 'http'
$cfg['Servers'][$i]['host'] = '192.168.1.135';
$cfg['MaxRows'] = 100;
$cfg['DefaultLang'] = 'fr';
[...]

Création du fichier phpMyAdmin.conf pour httpd

# touch /etc/httpd/conf.d/phpmyadmin.conf

# vi /etc/httpd/conf.d/phpmyadmin.conf
->
...

 

# systemctl restart httpd

Autoriser les connexions httpd à la base de données de façon permanente

# setsebool -P httpd_can_network_connect_db on

 

Ouvrir le port mysql (3306) sur le serveur qui héberge la base de données (si le serveur est distant)

# firewall-cmd --permanent --zone=internal,public --add-port=3306/tcp
-> succes
# systemctl restart firewalld

 

Test dans un navigateur

 

3°) Installation de PhpMyAdmin v4.4.15 via le repo EPEL (incompatible avec php 7)

# yum install phpmyadmin

 

4°) Configuration

Edition du fichier phpMyAdmin.conf

# vi /etc/httpd/conf.d/phpMyAdmin.conf

Modifier le fichier de conf comme suit :
...
<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       #Require ip 127.0.0.1
       #Require ip ::1
       Require all granted
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>
...

Appliquer les modifications

# systemctl restart httpd

4°) Test phpMyAdmin

Dans un navigateur saisir dans la barre d'adresse : http://<adresse_IP_Serveur_Web>/phpmyadmin

5°) Sécuriser phpMyAdmin

# yum install mod_ssl

# vi /etc/phpMyAdmin/config.inc.php
[...]
$cfg['Servers'}[$i]['auth_type'] = 'http';   // Remplacer 'cookie' par 'http'
[...]

# systemctl restart httpd

6°) Test de la connexion https

Dans un navigateur, saississez dans la barre d'adresse : https://<adresse_IP_Serveur_Web>/phpmyadmin
Accepter l'exception de sécurité

7°) Forcer la connection en HTTPS

Dans le fichier /etc/phpMyAdmin/config.inc.php, placer la directive :
$cfg['ForceSSL'] = TRUE;
A noter : cette option a été supprimée dans la version 4.6 de phpMyAdmin.

8°) Test de la connection en mode HTTPS
Dans un navigateur, saississez dans la barre d'adresse : http://<adresse_IP_Serveur_Web>/phpmyadmin
Vérifier que l'accès HTTP a bien été transposé en HTTPS dans la barre d'adresse du navigateur.

 

CENTOS 7 - SERVEUR WEBFTP

Plutôt destiné aux clients, le serveur WebFTP permet d'effectuer plusieurs opérations sur le système de fichiers tels que la modification des droits (chmod), l'installation d'application Web, le téléchargement de fichiers, ...

L'outil utilisé pour cette fonction sera net2ftp version 1.1 disponible sur la page de téléchargement de l'éditeur sur l'URL http://www.net2ftp.com/homepage/download.html.

1°) Téléchargement de l'application

# cd /var/www/html/
# wget http://www.net2ftp.com/download/net2ftp_v1.1.zip

2°) Décompression et renommage du répertoire d'hébergement

# yum install unzip -y
-> Installé
    unzip.x86_64 0:6.0-16.el7
# unzip net2ftp_v1.1.zip
# mv net2ftp_v1.1/files_to_upload ./net2ftp

3°) Paramètrage

# cd net2ftp
# chmod 777 ./temp
# vi settings.inc.php
=>
$net2ftp_settings["email_feedback"]="Votre adresse email";
$net2ftp_settings["default_language"]="fr";
$net2ftp_settings["encryption_string"]="462E16...";

4°) Test en local de l'installation

Dans un navigateur
=>> http://<serveur_web>/net2ftp

5°) Sécurisation de l'outil

(à finaliser)

 

CENTOS 7 - SERVEUR FTP

1°) Préambule

Le protocole FTP n'est pas sécurisé dans le sens où à la demande de connexion, l'identifiant de connexion et le mot de passe associé sont transmis en clair (non chiffré) sur le réseau. Il en est de même des données. Sur un réseau de confiance, ce n'est pas très génant. En revanche, sur le réseau Internet, c'est exposer inévitablement son serveur à l'usurpation d'identité.
Le protocol FTP n'est pas indispensable. Il est préférable d'installer et de ne conserver que SFTP qui permet d'établir une connexion sécurisée entre le client et le serveur.

2°) Mettre à jour le repository et installer vsftpd

# yum check-update
# yum install vsftpd
# vsftpd -v
-> vsftpd: version 3.0.2

3°) Sauvegarde du fichier de configuration initial

# cp /etc/vsftpd/vsftpd.conf  /etc/vsftpd/vsftpd.conf.ori

4°) Créer le fichier pour les utilisateurs non chrootés
Ce fichier contient les comptes ftp des utilisateurs qui ne doivent pas être emprisonnés dans le répertoire utilisateur. Les comptes qui figurent dans ce fichier pourront explorer les répertoires de la machines au delà du répertoire /home/user. Les autres comptes seront cantonnés dans leur répertoire personnel (home directory). Pour notre cas, le fichier restera vide.

# touch /etc/vsftpd/chroot_list

5°) Modification du fichier de configuration

# vi /etc/vsftpd/vsftpd.conf
# Modifie
anonymous_enable=NO -> supprime les connexions anonymes
ascii_upload_enable=NO   -> dépôt en binaire uniquement
ascii_download_enable=NO -> Téléchargement en binaire uniquement
chroot_local_user=YES  -> cantonne le compte ftp dans le home directory
chroot_list_enable=YES  -> autorise une liste d'exclusion au cantonnement
chroot_list=/etc/vsftpd/chroo_list  -> liste les comptes autorisés à sortir du home directory
ls_recurse_enable=YES -> permet la récursivité dans le système de fichier
# Ajoute à la fin du fichier
use_localtime=YES
chroot_local_user=YES -> positionne le root local sur /home/~user/
allow_writeable_chroot=YES -> Autoriser l'écriture sur le root local
pasv_enable=Yes
pasv_min_port=40000  -> Port de données sera dans la plage [40000-40010]
pasv_max_port=40010 -> Port de données

6°) Relancer et automatiser l'exécution du service

# systemctl restart vsftpd.service
# systemctl enable vsftpd.service
-> Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

7°) Ouvrir le parefeu

# firewall-cmd --permanent --add-service=ftp
# firewall-cmd --reload

8°) Pour SeLinux

#setsebool -P ftpd_full_access on

9°) Création d'un utilisateur

# useradd -m test -s /sbin/nologin
# passwd test

10°) Connexion avec un client winscp

Ouverture d'une session FTP

Après transfert d'un fichier sur le répertoire FTP de l'utilisateur 'test' (/home/test)

 

CENTOS 7 - SFTP

 

1°) Installer le serveur openSSH (le moteur SSH est installé par defaut)

# yum install openssh-server

2°) Créer un groupe et un utilisateur à part pour les acces SFTP

# groupadd sftpaccess
# useradd toto -g sftaccess -s /bin/false
# passwd toto

droit sur rep

# mkdir /home/toto/datadir
# chown root /home/toto
# chmod 755 /home/toto
# chown john /home/toto/datadir
# chmod 755 /home/toto/datadir

3°) Configuer le serveur SSH

# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.sav
# vi /etc/ssh/sshd_config
Modifier la directive :
PermitRootLogin (yes->no)
Remplacer la ligne
Subsystem sftp /usr/libexec/openssh/sftp-server
par
Subsystem sftp internal-sftp
puis ajouter les lignes suivantes :
Match group sftpaccess
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
AllowUsers toto1 toto2

4°) Relancer le serveur SSH

# systemctl restart sshd

5°) SElinux

# setsebool -P ssh_chroot_rw_homedirs on

6°) Vérification du fonctionnement de SFTP avec un client WinSCP

Ouverture d'une connection en mode console

# sftp toto1@<nom_server_sftp ou IP_server_sftp>

7°) Ouverture d'une connection SFTP en mode graphique (Winscp)

 

Installer un serveur web en une commande

Voici quelques commandes qui permettrons d'installer rapidement un serveur apache avec php et quelques autres outils tels que wget, yum-utils, nano, mariadb selon l'installation qui convient le mieux. Il est préférable d'exécuter cette commande sur un système CentOS-7  fraîchement installé en version minimale.

Installation (testée) incluant epel-release, apache, php7, wget, yum-utils, nano. Le serveur apache est opérationnel.

# yum update -y && yum install epel-release -y && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && yum install wget yum-utils nano httpd php71w php71w-opcache php71w-gd php71w-mbstring php71w-pdo php71w-mysql php71w-cli php71w-mcrypt php71w-xml -y && systemctl start httpd && systemctl enable httpd && firewall-cmd --permanent --add-service=http && firewall-cmd --permanent --add-service=https && systemctl restart firewalld

 

Installation (testée) incluant en plus mariadb 5.5.

# yum update -y && yum install epel-release -y && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && yum install wget yum-utils nano httpd mariadb-server mariadb php71w php71w-opcache php71w-gd php71w-mbstring php71w-pdo php71w-mysql php71w-cli php71w-mcrypt php71w-xml -y && systemctl start httpd && systemctl enable httpd && systemctl start mariadb && systemctl enable mariadb && firewall-cmd --permanent --add-service=http && firewall-cmd --permanent --add-service=https && systemctl restart firewalld && mysql_secure_installation

A la fin de la commande, il vous sera demandé de sécuriser le gestionnaire de bases de données. Veuillez alors remplir les champs comme suit :

->Mot de passe courant : <return>
-> Modifier le password root ? [Y/n] : Y
-> Nouveau Mot de passe ? ********
-> Supprimer les utilisateurs anonymes ? [Y/n] : Y
-> Bloquer les connections root distantes ? [Y/n] : Y
-> Supprimer la base de tests et les droits d'accès ? [Y/n] : Y
->Recharger les privilèges des tables ? [Y/n] : Y
Thank for using MariaDB!

 

Installation cette fois-ci avec mariadb 10.1.20. (à tester).

# yum update -y && yum install wget yum-utils vim epel-release -y && yum install httpd -y && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && yum install php71w php71w-opcache php71w-gd php71w-mbstring php71w-pdo php71w-mysql php71w-cli php71w-mcrypt -y && systemctl start httpd && systemctl enable httpd && firewall-cmd --permanent --add-service=http && firewall-cmd --permanent --add-service=https && systemctl restart firewalld && touch /etc/yum.repos.d/MariaDB.repo && vi /etc/yum.repos.d/MariaDB.repo && yum install mariadb-server mariadb-client && cp /etc/my.cnf /etc/my.cnf.0 && cp /usr/share/mysql/my-medium.cnf /etc/my.cnf && systemctl start mariadb && systemctl enable mariadb && mysql_secure_installation

Notez que la dernière commande n'est pas 100% automatique : vous devrez remplir le fichier qui s'ouvrira comme suit :

->
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

A la fin de la commande, on vous demandera de sécuriser votre installation. Veuillez remplir comme suit :

->Mot de passe courant : <return>
-> Modifier le password root ? [Y/n] : Y
-> Nouveau Mot de passe ? ********
-> Supprimer les utilisateurs anonymes ? [Y/n] : Y
-> Bloquer les connections root distantes ? [Y/n] : Y
-> Supprimer la base de tests et les droits d'accès ? [Y/n] : Y
->Recharger les privilèges des tables ? [Y/n] : Y
Thank for using MariaDB!

 

Conclusion

Avec cette première partie, la plateforme d'hébergement comprend maintenant un serveur CENTOS-7 équipé d'un serveur web APACHE, un serveur de base de données MARIADB, un interprèteur de code source PHP, un gestionnaire de base de données PHPMYADMIN, un protocol de transfert FTP et/ou SFTP. La seconde partie est consacrée à la sécurisation de la plateforme d'hébergement. Enfin, la troisième partie comprendra l'installation de quelques CMS parmi lesquels on trouvera DRUPAL, JOOMLA, TYPO3, WORDPRESS.

 


 

FIN DE LA PREMIERE PARTIE