Vous êtes sur la page 1sur 21

Rapport de Projet

Thème : Etude des serveurs HTTPS et Apache


et PHP et Squid et MySQL sous Linux

Réalisé par : Yahya Naïme &- alyas Derkaoui Encadré par :Pr.Mohammed CHAHI

Page 1
Année : 2019/2020
Sommaire :

Objectif De Projet........................................................................................ 03
Le protocole HTTP ...................................................................................... 04
A-Pré requis ................................................................................................. 04
B-Configurer http et SSL…................................................................05
C- Améliorer la sécurité de notre hébergement ...................................... 06
SQUID ........................................................................................................... 08
D-Pré requis.................................................................................................. 08
E-Installation…................................................................................. 08
F-Configuration… ..............................................................................09
G-Utilisation… .................................................................................. 10
H-Configuration manuelle de Firefox.......................................................10
I-Vérifier le fonctionnement ....................................................................... 10
J-Configurer Squid comme proxy transparent ....................................... 10
K-Téléchargements .................................................................................... 11
APACHE...................................................................................................... 12
L-Remarques spécifiques à IPv6 .............................................................12
M-Comment tout ceci fonctionne-t-il avec les hôtes virtuels ............. 13
PHP .............................................................................................................. 14
MYSQL ......................................................................................................... 17
N-Installation et configuration ................................................................... 17
O-Sécuriser le serveur MySQL/MariaDB ................................................17
P-Exemple de base de données ...................................................... 20
Q- Sauvegarde ............................................................................................20
R- Restauration ........................................................................................... 21
S- Sauvegardes automatiques .................................................................21

Page 2
OBJECTIF DE PROJET :

Ce document concernant l’étude et configuration avancée des serveurs


web sous centons 8 « Http, Squid, Apache, PHP, MySQL »
Ce projet divisé par deux parties, partie théorique qui concerne les
définitions des serveurs demandé, partie pratique qui concerne la
configuration de chaque serveur.

Page 3
Le protocole HTTP (Hypertext Transfer Protocol)
Transmet les données entre le serveur et le navigateur « en clair ». Les données
personnelles, mots de passe et autres numéros de Carte Bleue sont donc interceptables.
Pour résoudre ce problème, on utilisera le protocole HTTPS, qui ajoute une couche de
chiffrement SSL (Secure Sockets Layer) au protocole HTTP.

Le transfert chiffré des données ne constitue qu’un aspect dans l’établissement d’une
connexion sécurisée. L’autre aspect tout aussi important, c’est que l’utilisateur doit
être sûr de communiquer avec la bonne personne. Autrement dit, votre numéro de
Carte Bleue a beau être transmis de façon sécurisée, encore faut-il que la plateforme
de paiement ne soit pas située sur un serveur géré par la mafia albanaise.

Pour savoir si l’on a bien affaire au bon interlocuteur, on utilisera un certificat. Cette
véritable carte d’identité électronique contient non seulement la clé publique du
serveur pour chiffrer les transmissions, mais également des renseignements sur le site
ainsi que la signature de l’autorité de certification.

La génération d’un certificat électronique est décrite en détail dans cet article. Pour
nos essais, nous utiliserons un certificat SSL/TLS fourni par le client Certbot.

 Pré requis
 Installation
 Configurer Apache et SSL
 Améliorer la sécurité de notre hébergement

A. Pré requis

Le protocole HTTPS utilise le port 443. Il faut donc songer avant toute chose à ouvrir
ce port dans le pare-feu.

$ sudo firewall-cmd --permanent --add-service=https


$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dns http https ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Pour nos tests, nous allons partir d’une installation par défaut d’Apache avec un seul
site statique rangé dans /var/www/html. Si l’on dispose déjà d’une installation
d’Apache avec une série d’hôtes virtuels, voici ce qu’il faut faire pour remettre les
compteurs à zéro.

Page 4
$ sudo yum remove httpd
$ sudo rm -rf /var/www/*
$ sudo rm -rf /etc/httpd/
$ sudo yum install httpd
$ cd /etc/httpd/conf
$ sudo mv httpd.conf httpd.conf.orig
$ egrep -v '^#|^$|^ #|^ #' httpd.conf.orig | sudo tee
httpd.conf.lite
$ sudo cp httpd.conf.lite httpd.conf
$ sudo cp -R /usr/share/httpd/noindex/* /var/www/html/

Renseigner quelques directives de base dans httpd.conf.

ServerAdmin ofppt@ista.ma
...
CustomLog "logs/access_log" common
...
AddDefaultCharset off

Le chiffrement SSL/TLS pour Apache est fourni par le paquet mod_ssl.


$ sudo yum install mod_ssl

On notera l’apparition d’un fichier de configuration ssl.conf dans


/etc/httpd/conf.d.

B. Configurer http et SSL

Avant de continuer, effectuer une copie de sauvegarde du fichier de configuration par


défaut.

$ cd /etc/httpd/conf.d
$ sudo cp ssl.conf ssl.conf.orig

Si l’on part d’un répertoire /var/www/html vide, on peut récupérer un peu de contenu
statique pour avoir quelque chose à nous mettre sous la dent.

$ cd /var/www/html/
$ sudo cp -R /usr/share/httpd/noindex/* .

Régler les permissions de l’arborescence de fichiers téléchargés.


$ sudo chown -R ista:ista *

Éditer /var/www/html/index.html et remplacer le titre générique Testing 123... de la


page par quelque chose de plus parlant. Ensuite, éditer /etc/httpd/conf.d/ssl.conf en
renseignant les directives DocumentRoot et ServerName ainsi que l’emplacement du
certificat SSL et de la clé privée.

##
## SSL Virtual Host Context
##
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName www.ista.ma:443

Page 5
...
SSLCertificateFile /etc/letsencrypt/live/ista.ma/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ista.ma/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ista.ma/fullchain.pem
...
</VirtualHost>

Redémarrer http.
$ sudo systemctl restart httpd

C. Améliorer la sécurité de notre hébergement

Rendons-nous sur la page SSL Server Test du portail Qualys SSL Labs pour effectuer
un audit de la sécurité de notre hébergement.

Pour l’heure, le résultat n’est pas parfait et nous indique que nous pouvons faire
mieux.

Dans un premier temps, je vais éditer /etc/httpd/conf.d/ssl.conf pour


peaufiner les options globales.

# /etc/httpd/conf.d/ssl.conf
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
# Désactiver TLS 1.0 & TLS 1.1
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
# Préférences de chiffrement
SSLHonorCipherOrder on
# HSTS
Header always set Strict-Transport-Security \
"max-age=63072000; includeSubDomains"
# Bloquer le clickjacking
Header always set X-Frame-Options DENY
# Bloquer le changement de type MIME
Header always set X-Content-Type-Options nosniff

Ensuite, je vais créer un fichier 10-www.ista.ma-ssl.conf dans lequel je vais


ranger la configuration de mon hôte virtuel. Notez la redirection du site non sécurisé
vers le site sécurisé.

# /etc/httpd/conf.d/10-www.ista.ma-ssl.conf

# http://www.ista.ma -> https://www.ista.ma


<VirtualHost *:80>
ServerName www.ista.ma
ServerAlias ista.ma
Redirect / https://www.ista.ma
</VirtualHost>

Page 6
# https://www.ista.ma
<VirtualHost _default_:443>
ServerAdmin ofppt@ista.ma
DocumentRoot "/var/www/html"
ServerName www.ista.ma:443
ServerAlias ista.ma
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/ista.ma/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ista.ma/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ista.ma/fullchain.pem
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
ErrorLog logs/www.slackbox.fr-error_log
CustomLog logs/www.slackbox.fr-access_log common
</VirtualHost>

Je teste la configuration.
$ sudo apachectl configtest
Syntax OK

Une fois que tout est correct, je relance http.


$ sudo systemctl restart httpd

Je relance l’audit de sécurité sur le site de Qualys Labs en cliquant sur Clear Cache.
Cette fois-ci, notre hébergement est proche de la perfection, et même un peu au-delà.

Page 7
Squid
est un serveur mandataire (proxy en anglais). Dans les réseaux locaux, il est utilisé
pour des fonctions de filtrage d’URL ou en tant que cache. Les pages web sont
stockées sur le serveur local, ce qui évite d’aller les recharger plusieurs fois et permet
d’économiser de la bande passante Internet. Cet article décrit l’installation et la
configuration de Squid sur un serveur de réseau local CentOS.

La configuration présentée ici concerne les seules connexions HTTP. Le traitement


des connexions HTTPS fait l’objet d’un article à part. Cette façon de procéder est
motivée avant tout par un souci pédagogique, étant donné que la gestion des
connexions sécurisées par Squid est passablement complexe.

 Prérequis
 Installation
 Configuration
 Utilisation
 Configuration manuelle de Firefox
 Vérifier le fonctionnement
 Configurer Squid comme proxy transparent
 Téléchargement

D. Pré requis

Dans la configuration par défaut, Squid utilise le port 3128 en TCP et en UDP. Il faut
donc songer à l’ouvrir dans le pare-feu.

# Commandes
IPT=/usr/sbin/iptables
...
# Réseau local
IFACE_LAN=enp7s4
...
# Squid
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 3128 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 3128 -j ACCEPT

E. Installation

Squid est officiellement supporté par Red Hat Enterprise Linux et CentOS. On peut
donc l’installer depuis les dépôts officiels.
$ sudo yum install squid

Page 8
F. Configuration

Squid se configure par le biais du fichier /etc/squid/squid.conf, qui est


quasiment prêt à l’emploi, à quelques directives près. Notons que le répertoire offre
déjà un fichier identique squid.conf.default, ce qui nous évite d’effectuer une
copie de sauvegarde.

J’édite ce fichier par défaut en regroupant les directives existantes et en adaptant la


configuration à mon réseau. Voici à quoi cela ressemble.

# /etc/squid/squid.conf

# Définitions
acl localnet src 192.168.3.0/24
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

# Règles d'accès
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all

# Port du proxy
http_port 3128

# Taille du cache dans la RAM


cache_mem 256 MB

# Emplacement et taille du cache sur le disque


# cache_dir ufs /var/spool/squid 100 16 256

# Vidage système
coredump_dir /var/spool/squid

# Durée de vie des fichiers sans date d'expiration


refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

Page 9
Cette configuration mérite quelques remarques.

 Squid peut être utilisé par toutes les machines du réseau local
192.168.3.0/24. La directive acl localnet définit une variable
localnet qui indique l’étendue du réseau local.
 Cette directive fonctionne de pair avec http_access localnet, qui
autorise toutes les machines du réseau local à utiliser le cache. Le nom
localnet est une convention, et on est libre d’en utiliser un autre.
 Dans l’exemple ci-dessus, le cache est uniquement écrit dans la RAM du
serveur. La directive cache_mem permt de définir la taille du cache. Si l’on
ne souhaite pas utiliser le disque dur pour le cache, il faut s’assurer de n’utiliser
aucune directive cache_dir.

G. Utilisation

J’active et je démarre le service.


$ sudo systemctl enable squid
$ sudo systemctl start squid

Je vérifie l’état de fonctionnement.


$ systemctl status squid

H. Configuration manuelle de Firefox

Lorsque Squid n’est pas utilisé comme proxy transparent, il faut procéder à une
configuration individuelle des navigateurs web sur les postes clients. Pour Firefox,
ouvrir Préférences > Proxy réseau > Paramètres et indiquer le nom d’hôte ou
l’adresse IP ainsi que le port du proxy.

I. Vérifier le fonctionnement

Pour voir si les postes clients utilisent effectivement le proxy, on peut afficher en
direct le contenu du journal /var/log/squid/access.log.
$ sudo tail -f /var/log/squid/access.log
1519986674.236 166 192.168.2.2 TCP_MISS/200 4330
GET http://www.slackware.com/ - HIER_DIRECT/95.100.252.163 ...
1519986674.607 45 192.168.2.2 TCP_MISS/200 676
GET http://www.slackware.com/favicon.ico - ...

J. Configurer Squid comme proxy transparent

Jusqu’ici, l’utilisation du proxy cache s’effectue de manière volontaire, c’est-à-dire


que Squid est utilisé si les postes clients ont configuré leurs navigateurs Web en
conséquence, comme nous venons de le voir. Si cette configuration n’est pas
effectuée, les utilisateurs vont simplement contourner le cache.

Page 10
Pour éviter cela, on va tout simplement rediriger toutes les requêtes HTTP (port 80)
vers le port 3128 pour obtenir un proxy transparent. Ce qui signifie que le cache est
utilisé automatiquement, sans la moindre configuration de la part de l’utilisateur.
Évidemment, cela suppose que Squid tourne sur la machine qui fait office de
passerelle dans le réseau local.

Dans le fichier /etc/squid/squid.conf, il faudra modifier une seule ligne.

# Port du proxy
http_port 3128 transparent

On va partir du principe que le relais des paquets est déjà activé dans le pare-feu. Il ne
reste plus qu’à rediriger les paquets IP, en faisant une exception pour les requêtes
HTTP à destination du serveur lui-même. Voici à quoi cela peut ressembler.

# Commandes
IPT=/usr/sbin/iptables
...
# Réseau local
IFACE_LAN=enp7s4
...
# Serveur
SERVER_IP=192.168.3.1
...
# Squid
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 3128 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 3128 -j ACCEPT
$IPT -A PREROUTING -t nat -i $IFACE_LAN -p tcp ! -d $SERVER_IP \
--dport 80 -j REDIRECT --to-port 3128

Là aussi, il faut afficher les logs « à chaud » pour voir si le proxy transparent est
effectivement utilisé par les postes clients.
$ sudo tail -f /var/log/squid/access.log

K. Téléchargement

Un modèle de fichier de configuration squid.conf.simple est disponible dans


mon dépôt Github, dans le répertoire el7/config/squid.

Page 11
Apache
Au démarrage d'Apache, un port et une adresse lui sont associés sur l'hôte local et le
serveur se met en attente de l'arrivée d'une requête. Par défaut, le serveur écoute toutes
les adresses de l'hôte local. Cependant, on peut lui préciser des ports spécifiques à
écouter, ou lui dire de n'écouter que sur certaines adresses, ou une combinaison des
deux. Tout ceci est souvent associé avec la fonctionnalité des hôtes virtuels qui
détermine la manière dont Apache répond aux différents ports, noms d'hôtes et
adresses IP.

La directive Listen enjoint le serveur de n'accepter des requêtes que sur les ports
spécifiés ou une combinaison adresse/port. Si seul un numéro de port est spécifié dans
la directive Listen, le serveur écoute ce port sur toutes les interfaces réseau. Si une
adresse IP est spécifiée en plus du port, le serveur va écouter ce port sur l'interface
réseau correspondante. On peut utiliser de multiples directives Listen pour spécifier
plusieurs adresses et ports à écouter. Le serveur répondra alors aux requêtes sur ces
ports et adresses spécifiés.

Par exemple, pour faire en sorte que le serveur accepte des connexions sur les ports 80
et 8000 sur toutes ses interfaces, utilisez :

Listen 80
Listen 8000

Pour faire en sorte que le serveur accepte des connexions sur le port 80 sur une
interface, et sur le port 8000 sur une autre interface :

Listen 192.0.2.1:80
Listen 192.0.2.5:8000

Les adresses IPv6 doivent être entourêes de crochets, comme dans l'exemple suivant :

Listen [2001:db8::a00:20ff:fea7:ccea]:80

L. Remarques spécifiques à IPv6

Un nombre croissant de plateformes implémentent IPv6, et APR supporte IPv6 sur la


plupart d'entre elles, ce qui permet à Apache d'allouer des points de connexion
(sockets) IPv6 et de traiter des requêtes envoyées sur IPv6.

Les administrateurs d'Apache doivent se préoccuper de la possibilité pour un point de


connexion IPv6 de traiter à la fois des connexions IPv4 et des connexions IPv6. Le
traitement de connexions IPv4 avec un point de connexion IPv6 utilise des adresses
IPv6 traduites en IPv4, qui sont autorisées par défaut sur la plupart des plateformes,
mais sont interdites par défaut sous FreeBSD, NetBSD, et OpenBSD, afin de respecter
la politique de sécurité du système sur ces plateformes. Mais même sur les systèmes

Page 12
où ces adresses sont interdites par défaut, un paramètre spécial du script configure
permet de modifier ce comportement pour Apache.

En revanche, sur certaines plateformes comme Linux et Tru64, la seule manière de


gérer à la fois IPv6 et IPv4 passe par l'utilisation d'adresses traduites. Si vous voulez
qu'Apache gère des connexions IPv4 et IPv6 avec un minimum de points de
connexion, ce qui nécessite l'utilisation d'adresses IPv6 traduites en IPv4, utilisez
l'option --enable-v4-mapped du script configure.

L'option --enable-v4-mapped est utilisée par défaut sur toutes les plateformes
sauf FreeBSD, NetBSD, et OpenBSD; votre Apache a donc probablement été
construit avec cette option.

Si vous souhaitez qu'Apache ne gère que des connexions IPv4, sans se soucier de ce
que vos plateforme et APR supportent, spécifiez une adresse IPv4 dans toutes les
directives Listen, comme dans l'exemple suivant :

Listen 0.0.0.0:80
Listen 192.0.2.1:80

Si votre plateforme le supporte et si vous souhaitez qu'Apache gère des connexions


IPv4 et IPv6 sur des points de connexion séparés (c'est à dire désactiver la traduction
des adresses IPv6 au format IPv4), utilisez l'option --disable-v4-mapped du
script configure. --disable-v4-mapped est utilisé par défaut sur FreeBSD,
NetBSD, et OpenBSD.

M. Comment tout ceci fonctionne-t-il avec les hôtes virtuels

La directive Listen n'implémente pas les hôtes virtuels. Elle indique simplement au
serveur principal sur quels adresses et ports il doit écouter. Si aucune directive
<VirtualHost> n'est présente, le serveur se comportera de la même façon pour
toutes les requêtes acceptées. En revanche, la directive <VirtualHost> peut être
utilisée pour provoquer une réaction différente du serveur pour un ou plusieurs
adresses/ports. Pour implémenter un hôte virtuel, on doit d'abord indiquer au serveur
sur quels adresses et ports il doit écouter. Ensuite, une section <VirtualHost> doit
être créée pour chaque couple adresse+port spécifié afin de définir le comportement
de cet hôte virtuel. Notez que si la directive <VirtualHost> est définie pour une
adresse et un port sur lesquels le serveur n'est pas censé écouter, cet hôte virtuel ne
sera pas accessible.

Page 13
PHP (Hypertext Preprocessor)
plus connu sous son sigle PHP (sigle auto-référentiel), est un langage de
programmation libre, principalement utilisé pour produire des pages Web dynamiques
via un serveur HTTP, mais pouvant également fonctionner comme n'importe quel
langage interprété de façon locale. PHP est un langage impératif orienté objet.

PHP a permis de créer un grand nombre de sites web célèbres, comme Facebook et
Wikipédia Il est considéré comme une des bases de la création de sites web dits
dynamiques mais également des applications web.

Dans cet exemple, je vais installer PHP 7.3 qui est la dernière version en date de PHP.
Nous allons devoir récupérer cette version dans d'autres dépôts car ce n'est pas cette
version qui nativement proposée avec CentOS (PHP 5.6).

Nous allons utiliser la source de paquets additionnelle EPEL (Extra Package for
Entreprise Linux), que l'on ajoute de cette façon :

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*


yum -y install epel-release

Le dépôt Remi pour CentOS doit être ajouté également, puis nous installons yum-utils
car nous avons besoin de yum-config-manager pour activer le paquet correspondant à
PHP 7.3 et pouvoir l'installer.

Ajoutez le dépôt remi :


rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Installez yum-utils que l'on va utiliser via yum-config-manager.


yum -y install yum-utils

Une update de la base et on active PHP 7.3 via le dépôt remi :

yum update
yum-config-manager --enable remi-php73

Page 14
Enfin, on installe PHP 7.3 et le paquet php-opcache (facultatif) pour l'utilisation du
cache PHP :
yum -y install php php-opcache

On va redémarrer notre serveur web fraîchement installé :

systemctl restart httpd.service

Avant de passer à la partie base de données, nous allons installer quelques extensions
pour PHP, y compris l'extension pour MariaDB, ainsi que l'outil Curl :

yum -y install php-mysqlnd php-pdo php-gd php-odbc php-pear php-xml php-


xmlrpc php-mbstring php-soap curl curl-devel

Pour afficher les informations concernant PHP, notamment sa version ainsi que les
modules chargés. Nous allons créer une page PHP pour afficher le résultat de
phpinfo().

Créez une page à la racine du serveur web :


nano /var/www/html/version.php

Ajoutez le code suivant à cette page :


<?php phpinfo(); ?>

Sauvegardez et accédez à la page à l'aide de votre navigateur. Vous devez obtenir une
page semblable à celle-ci :

Page 15
Lorsque vous avez terminé d'utiliser cette page, pensez à la supprimer car elle fournie
des informations importantes sur votre configuration :
rm /var/www/html/version.php

Page 16
MySQL
est un système de gestion de bases de données relationnelles (SGBDR). Il est
distribué sous une double licence GPL et propriétaire. Il fait partie des logiciels de
gestion de base de données les plus utilisés au monde4, autant par le grand public
(applications web principalement) que par des professionnels, en concurrence avec
Oracle, PostgreSQL et Microsoft SQL Server.

On entend parfois dire que MySQL n’est pas un « vrai » système de bases de données
en comparaison à des systèmes comme Oracle ou DB/2. Contentons-nous de savoir
que MySQL est utilisé, entre autres, par Facebook, Google et Yahoo!

CentOS 8 a remplacé MySQL par le fork communautaire MariaDB, suite au rachat de


MySQL par Sun Microsystems et Oracle. La gouvernance du projet MariaDB est
assurée par la fondation MariaDB. Elle confère au logiciel l’assurance de rester libre.

 Installation et configuration
 Sécuriser le serveur MySQL/MariaDB
 Exemple de base de données
 Sauvegarde
 Restauration
 Sauvegardes automatiques

N. Installation et configuration

Installer MySQL/MariaDB.
$ sudo yum install mariadb-server mariadb

Le client mariadb est automatiquement installé par le paquet mariadb-server.

Activer et démarrer le service.

$ sudo systemctl enable mariadb --now

O. Sécuriser le serveur MySQL/MariaDB

MySQL/MariaDB dispose de l’utilitaire mysql_secure_installation pour


assurer la sécurité d’une installation fraîche sur une machine de production. Ce
programme permet d’effectuer quelques démarches de sécurisation essentielles.

1. Définir un mot de passe root MySQL (ne pas confondre avec le compte
root Linux).
2. Supprimer les comptes root MySQL accessibles de l’extérieur.
3. Supprimer les connexions anonymes.
4. Supprimer la base de données de test.

Page 17
Lancer la sécurisation.
$ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL


MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP
CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): [Entrée]


OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the
MariaDB root user without the proper authorisation.

Set root password? [Y/n] y


New password: **********
Re-enter new password: **********
Password updated successfully!
Reloading privilege tables..
... Success!

By default, a MariaDB installation has an anonymous user, allowing


anyone to log into MariaDB without having to have a user account
created for them. This is intended only for testing, and to make
the installation go a bit smoother. You should remove them before
moving into a production environment.

Remove anonymous users? [Y/n] y


... Success!

Normally, root should only be allowed to connect from 'localhost'.


This ensures that someone cannot guess at the root password from
the network.

Disallow root login remotely? [Y/n] y


... Success!

By default, MariaDB comes with a database named 'test' that anyone


can access. This is also intended only for testing, and should be
removed before moving into a production environment.

Remove test database and access to it? [Y/n] y


- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so
far will take effect immediately.

Reload privilege tables now? [Y/n] y


... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.

Page 18
Thanks for using MariaDB!

Dorénavant, il faut se connecter au moniteur MySQL/MariaDB avec le mot de passe


que l’on vient de définir un peu plus haut.
$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.
...
MariaDB [(none)]>

Afficher les bases de données.


MariaDB [(none)]> show databases;
+ +
| Database |
+ +
| information_schema |
| mysql |
| performance_schema |
+ +
3 rows in set (0.00 sec)

Utiliser la base de données mysql.


MariaDB [(none)]> use mysql;
Database changed

Afficher les utilisateurs.


MariaDB [mysql]> select user, host, password from user;
+ + + +
| user | host | password |
+ + + +
| root | localhost | *6883419C147A759B04D78A2D1E4E0C5BB0CDD1B4 |
| root | 127.0.0.1 | *6883419C147A759B04D78A2D1E4E0C5BB0CDD1B4 |
| root | ::1 | *6883419C147A759B04D78A2D1E4E0C5BB0CDD1B4 |
+ + + +
3 rows in set (0.00 sec)

On va garder la seule entrée pour root@localhost et supprimer les deux autres.


MariaDB [mysql]> delete from user where host!='localhost';
Query OK, 2 rows affected (0.00 sec)

Vérifier le résultat de l’opération.


MariaDB [mysql]> select user, host, password from user;
+ + + +
| user | host | password |
+ + + +
| root | localhost | *6883419C147A759B04D78A2D1E4E0C5BB0CDD1B4 |
+ + + +
1 row in set (0.00 sec)

Quitter la console.

Page 19
MariaDB [mysql]> quit;
Bye

P. Exemple de base de données

Se connecter au moniteur MySQL.


$ mysql -u root -p
mysql>

Créer une base de données webapp.


mysql> create database webapp;

Afficher les bases de données.


mysql> show databases;

Créer un utilisateur webappuser qui aura tous les droits sur webapp.

mysql> grant all on webapp.* to webappuser@localhost


- > identified by 'motdepasse';

Attention, le mot de passe apparaît en clair dans le moniteur MySQL.


mysql> quit;

Si l’on souhaite supprimer cette base de données.


mysql> drop database webapp;

Q. Sauvegarde

La commande mysqldump permet de sauvegarder une base de données MySQL sous


forme d’une série d’instructions SQL.

L’exemple suivant effectue une sauvegarde complète de la base de données cmsms.


$ mysqldump -u root -p cmsms > sauvegarde_cmsms.sql

L’option --all-databases permet de sauvegarder l’ensemble des bases de


données d’un serveur.
$ mysqldump -u root -p --all-databases > sauvegarde.sql

Les fichiers SQL résultants sont parfois très volumineux, étant donné qu’il s’agit d’un
format texte simple. Dans ce cas, on peut les compresser durant la sauvegarde même.
Voici ce que cela donne pour les deux exemples précédents.

$ mysqldump -u root -p cmsms | gzip -c > sauvegarde_cmsms.sql.gz


$ mysqldump -u root -p --all-databases | gzip -c > sauvegarde.sql.gz

Page 20
R. Restauration

Dans l’exemple suivant, on va restaurer la base de données cmsms depuis le fichier


de sauvegarde créé ci-dessus.

$ mysqladmin -u root -p create cmsms


$ mysql -u root -p cmsms < sauvegarde_cmsms.sql

Pour restaurer « à la louche » une sauvegarde globale, il suffit d’invoquer la


commande suivante qui gère également la création des bases de données.
$ mysql -u root -p < sauvegarde.sql

La restauration à partir d’une sauvegarde compressée peut s’effectuer comme ceci.

$ mysqladmin -u root -p create cmsms


$ gunzip -c sauvegarde_cmsms.sql.gz | mysql -u root -p cmsms

Et pour une sauvegarde globale.


$ gunzip -c sauvegarde.sql.gz | mysql -u root -p

Si l’on obtient des erreurs de connexion aux bases restaurées, il faudra se connecter au
moniteur MySQL, puis…
mysql> flush privileges;

S. Sauvegardes automatiques

Mon dépôt Gitlab fournit un script Bash sqldump.sh dans le répertoire


el7/sqldump. Ce script permet d’effectuer des sauvegardes automatiques de
l’ensemble des bases MySQL d’un serveur, individuellement et « à la louche ». Les
sauvegardes se présentent sous forme d’une série de fichiers compressés *.sql.gz
rangés dans le répertoire ~/sql. Par la suite, ces fichiers pourront être récupérés par
un serveur de sauvegardes.

$ cd
$ git clone https://gitlab.com/kikinovak/centos-8
$ cp centos-8/el7/sqldump/sqldump.sh ~/bin/
$ chmod 0700 ~/bin/sqldump.sh
$ vim ~/bin/sqldump.sh

Une fois qu’on a édité le script à sa convenance, on peut définir une tâche
automatique.
$ sudo crontab -e
# Sauvegarde quotidienne des bases MySQL à 0h30
30 00 * * * /home/ista/bin/sqldump.sh 1> /dev/null

Page 21

Vous aimerez peut-être aussi