Avertissement
Je rappel que les tutoriels présentés doivent permettre de créer une infrastructure web dans un environnement de test, le plus proche possible d’un serveur de production se rapprochant d’un serveur mutualisé chez un hébergeur comme 1&1.
Cette infrastructure présente les bases de la configuration et ne possède aucun moyen de défense contre d’éventuelles intrusions.
Par conséquent, vous êtes seul responsable si vous vous contentez de suivre ce tutoriel pour une mise en ligne d’un serveur web sur internet avec un accès public.
Vous voilà averti, passons aux choses sérieuses.
Introduction
Ce tuto fait parti d’un ensemble qui conduit à créer une infrastructure de serveurs web avec différents rôles en utilisant VirtualBox : “[Tuto – Infrastructure Web – Debian 8] – Présentation et objectifs”.
L’objectif est de mettre en place dans votre vlan un serveur virtuel avec MySQL (ou Percona).
Vous devez avoir suivi le « [Tuto – Infrastructure Web – Debian 8] – Le serveur proxy et reverse proxy » pour y intégrer cette VM.
Ce tutoriel a juste la prétention de pouvoir donner les bases pour installer MySQL ou Percona sur un serveur Debian 8 Jessie.
Tout ce qui est test de charge et tuning fera l’objet d’un autre tutoriel.
Cloner la machine gabarit
Dans ce tutoriel, je vais la nommer « jbnet-db » et lui attribuer une ip 192.168.2.20.
Lors de la création du proxy, nous avions utilisé l’ip 192.168.2.1 pour la carte eth1.
Cette ip sera utilisée comme passerelle (gateway) dans la configuration de la carte eth0 du serveur web.
Il vous faut tout d’abord cloner et configurer la machine gabarit préparée dans “[Tuto – Infrastructure Web – Debian 8] – La machine gabarit” puis dans “[Tuto – Infrastructure Web – Debian 8] – Cloner et préparer la machine gabarit“.
Pour mémo, voici le fichier /etc/network/interface.d/eth0.conf
1 2 3 4 5 6 7 8 9 |
auto eth0 allow-hotplug eth0 iface eth0 inet static address 192.168.2.20 netmask 255.255.255.0 network 192.168.2.0 broadcast 192.168.2.255 gateway 192.168.2.1 dns-nameservers 109.0.66.10 109.0.66.20 |
La ligne dns-nameservers est paramétrée avec les DNS de chez SFR, mon FAI.
Vous pouvez changer ces valeurs par les vôtres.
Configuration de la VM
Avant de démarrer la VM « jbnet-db », il faut faire quelques ajustements dans sa configuration.
Pour la mémoire, 1024 Mo suffisent largement pour commencer. SI vous pouvez aller jusqu’à 2048 Mo c’est encore mieux.
Si possible, modifiez le nombre de processeurs à 2.
Vous pourrez ajuster en fonction des besoins.
Dans « Réseau », vous devez avoir le mode d’accès réseau de la carte 1 positionnée sur « Réseau interne ».
Connexion SSH
Étant donné que la VM n’est pas sur le même réseau que vous, vous devrez d’abord vous connecter en SSH sur le proxy.
Puis, à partir du proxy, vous pourrez vous connecter à la VM « jbnet-web01 »
Commande pour se connecter en SSH à partir de la VM proxy :
1 |
command ssh jbnet-user@192.168.2.20 |
A la première connexion, vous devrez confirmer.
Il ne vous reste plus qu’à vous connecter avec root avec la commande « su -« .
Pour fermer la session, utilisez la combinaison de touche « Ctrl+D », plusieurs fois si nécessaire.
MySQL
Installation
1 |
command apt-get install mysql-server mysql-client |
Sécuriser (un peu) MySQL
Une fois l’installation terminée, il faut sécuriser un minimum votre serveur MySQL.
1 |
command mysql_secure_installation |
1 2 3 4 |
Change the root password? [Y/n] n Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] y Reload privilege tables now? [Y/n] y |
Percona Server
Présentation
Percona Server est un fork boosté de MySQL spécialement dédié pour la haute disponibilité.
Plus d’informations : « Percona Server– An enhanced, drop-in MySQL Replacement »
Installation
L’installation officielle est décrite sur le site de Percona.
Je l’ai un peu adapté.
Ajoutez la clé apt :
1 |
command apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A |
Il fût un temps sous Debian 7 Wheezy où la récupération de la clé ne fonctionnait pas.
Vous pouvez créer un fichier /root/percona.key :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.11 (GNU/Linux) mQGiBEsm3aERBACyB1E9ixebIMRGtmD45c6c/wi2IVIa6O3G1f6cyHH4ump6ejOi AX63hhEs4MUCGO7KnON1hpjuNN7MQZtGTJC0iX97X2Mk+IwB1KmBYN9sS/OqhA5C itj2RAkug4PFHR9dy21v0flj66KjBS3GpuOadpcrZ/k0g7Zi6t7kDWV0hwCgxCa2 f/ESC2MN3q3j9hfMTBhhDCsD/3+iOxtDAUlPMIH50MdK5yqagdj8V/sxaHJ5u/zw YQunRlhB9f9QUFfhfnjRn8wjeYasMARDctCde5nbx3Pc+nRIXoB4D1Z1ZxRzR/lb 7S4i8KRr9xhommFnDv/egkx+7X1aFp1f2wN2DQ4ecGF4EAAVHwFz8H4eQgsbLsa6 7DV3BACj1cBwCf8tckWsvFtQfCP4CiBB50Ku49MU2Nfwq7durfIiePF4IIYRDZgg kHKSfP3oUZBGJx00BujtTobERraaV7lIRIwETZao76MqGt9K1uIqw4NT/jAbi9ce rFaOmAkaujbcB11HYIyjtkAGq9mXxaVqCC3RPWGr+fqAx/akBLQ2UGVyY29uYSBN eVNRTCBEZXZlbG9wbWVudCBUZWFtIDxteXNxbC1kZXZAcGVyY29uYS5jb20+iGAE ExECACAFAksm3aECGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRAcTL3NzS79 Kpk/AKCQKSEgwX9r8jR+6tAnCVpzyUFOQwCfX+fw3OAoYeFZB3eu2oT8OBTiVYu5 Ag0ESybdoRAIAKKUV8rbqlB8qwZdWlmrwQqg3o7OpoAJ53/QOIySDmqy5TmNEPLm lHkwGqEqfbFYoTbOCEEJi2yFLg9UJCSBM/sfPaqb2jGP7fc0nZBgUBnFuA9USX72 O0PzVAF7rCnWaIz76iY+AMI6xKeRy91TxYo/yenF1nRSJ+rExwlPcHgI685GNuFG chAExMTgbnoPx1ka1Vqbe6iza+FnJq3f4p9luGbZdSParGdlKhGqvVUJ3FLeLTqt caOn5cN2ZsdakE07GzdSktVtdYPT5BNMKgOAxhXKy11IPLj2Z5C33iVYSXjpTelJ b2qHvcg9XDMhmYJyE3O4AWFh2no3Jf4ypIcABA0IAJO8ms9ov6bFqFTqA0UW2gWQ cKFN4Q6NPV6IW0rV61ONLUc0VFXvYDtwsRbUmUYkB/L/R9fHj4lRUDbGEQrLCoE+ /HyYvr2rxP94PT6Bkjk/aiCCPAKZRj5CFUKRpShfDIiow9qxtqv7yVd514Qqmjb4 eEihtcjltGAoS54+6C3lbjrHUQhLwPGqlAh8uZKzfSZq0C06kTxiEqsG6VDDYWy6 L7qaMwOqWdQtdekKiCk8w/FoovsMYED2qlWEt0i52G+0CjoRFx2zNsN3v4dWiIhk ZSL00Mx+g3NA7pQ1Yo5Vhok034mP8L2fBLhhWaK3LG63jYvd0HLkUFhNG+xjkpeI SQQYEQIACQUCSybdoQIbDAAKCRAcTL3NzS79KlacAJ9H6emL/8dsoquhE9PNnKCI eMTmmQCfXRLIoNjJa20VEwJDzR7YVdBEiQI= =AD5m -----END PGP PUBLIC KEY BLOCK----- |
Puis ajoutez cette clé :
1 |
command cat /root/percona.key | apt-key add - |
Créez le fichier /etc/apt/sources.list.d/percona.list :
1 2 |
echo "deb http://repo.percona.com/apt jessie main deb-src http://repo.percona.com/apt jessie main" > /etc/apt/sources.list.d/percona.list |
Mettez à jour les dépôts et installez Percona :
1 2 |
command apt-get update command apt-get install percona-server-5.6 |
Tout comme MySQL, il est nécessaire de définir un mot de passe root :
A la fin de l’installation, il est demandé d’exécuter 3 commandes.
1 2 3 4 5 |
* Run the following commands to create these functions: mysql -e "CREATE FUNCTION fnv1a_64 RETURNS INTEGER SONAME 'libfnv1a_udf.so'" mysql -e "CREATE FUNCTION fnv_64 RETURNS INTEGER SONAME 'libfnv_udf.so'" mysql -e "CREATE FUNCTION murmur_hash RETURNS INTEGER SONAME 'libmurmur_udf.so'" |
Puisque votre utilisateur root possède un mot de passe, il est nécessaire d’ajouter le paramètre « -p » à la fin et de saisir le mot de passe :
1 2 3 |
mysql -e "CREATE FUNCTION fnv1a_64 RETURNS INTEGER SONAME 'libfnv1a_udf.so'" -p mysql -e "CREATE FUNCTION fnv_64 RETURNS INTEGER SONAME 'libfnv_udf.so'" -p mysql -e "CREATE FUNCTION murmur_hash RETURNS INTEGER SONAME 'libmurmur_udf.so'" -p |
Sécuriser (un peu) Percona
Une fois l’installation terminée, il faut sécuriser un minimum votre serveur Percona (tout comme MySQL).
1 |
command mysql_secure_installation |
1 2 3 4 |
Change the root password? [Y/n] n Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] y Reload privilege tables now? [Y/n] y |
Bon à savoir
Percona met a disposition un générateur de fichier my.cnf : Percona Tools
Un questionnaire vous est proposé afin de déterminer la configuration recommandée par Percona.
Les points important sont le nombre de CPU, la taille de la mémoire, le nombre de tables estimé.
Pour un serveur de test, je conseille de décocher « Enable binary logging » qui risque de saturer votre disque dur.
Également pour les même raison, je n’ai rien coché sur la page « Configure Safety Options ».
Avant de remplacer le fichier d’origine, arrêter le service MySQL et faites une sauvegarde du fichier /etc/mysql/my.cnf :
1 2 |
command service mysql stop command cp /etc/mysql/my.cnf /etc/mysql/my.cnf.origine |
Voilà le résultat :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# Generated by Percona Configuration Wizard (http://tools.percona.com/) version REL5-20120208 # Configuration name jbnet-db-percona generated for jeromebaudin@jbnet.fr at 2015-08-09 19:20:04 [mysql] # CLIENT # port = 3306 socket = /var/lib/mysql/mysql.sock [mysqld] # GENERAL # user = mysql default-storage-engine = InnoDB socket = /var/lib/mysql/mysql.sock pid-file = /var/lib/mysql/mysql.pid # MyISAM # key-buffer-size = 32M myisam-recover = FORCE,BACKUP # SAFETY # max-allowed-packet = 16M max-connect-errors = 1000000 # DATA STORAGE # datadir = /var/lib/mysql/ # CACHES AND LIMITS # tmp-table-size = 32M max-heap-table-size = 32M query-cache-type = 0 query-cache-size = 0 max-connections = 500 thread-cache-size = 50 open-files-limit = 65535 table-definition-cache = 1024 table-open-cache = 2048 # INNODB # innodb-flush-method = O_DIRECT innodb-log-files-in-group = 2 innodb-log-file-size = 128M innodb-flush-log-at-trx-commit = 1 innodb-file-per-table = 1 innodb-buffer-pool-size = 1456M # LOGGING # log-error = /var/lib/mysql/mysql-error.log log-queries-not-using-indexes = 1 slow-query-log = 1 slow-query-log-file = /var/lib/mysql/mysql-slow.log |
Sur un serveur Debian, il faut cependant adapter les paramètres socket, pid-file, log-error et slow-query-log-file.
Ce qui donne au final pour un serveur avec 2 coeurs et 2 Go de mémoire vive :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# Generated by Percona Configuration Wizard (http://tools.percona.com/) version REL5-20120208 # Configuration name jbnet-db-percona generated for jeromebaudin@jbnet.fr at 2015-08-09 19:20:04 [mysql] # CLIENT # port = 3306 socket = /var/run/mysqld/mysqld.sock [mysqld] # GENERAL # user = mysql default-storage-engine = InnoDB socket = /var/run/mysqld/mysqld.sock pid-file = /var/run/mysqld/mysql.pid # MyISAM # key-buffer-size = 32M myisam-recover = FORCE,BACKUP # SAFETY # max-allowed-packet = 16M max-connect-errors = 1000000 # DATA STORAGE # datadir = /var/lib/mysql/ # CACHES AND LIMITS # tmp-table-size = 32M max-heap-table-size = 32M query-cache-type = 0 query-cache-size = 0 max-connections = 500 thread-cache-size = 50 open-files-limit = 65535 table-definition-cache = 1024 table-open-cache = 2048 # INNODB # innodb-flush-method = O_DIRECT innodb-log-files-in-group = 2 innodb-log-file-size = 128M innodb-flush-log-at-trx-commit = 1 innodb-file-per-table = 1 innodb-buffer-pool-size = 1456M # LOGGING # log-error = /var/log/mysql/mysql-error.log log-queries-not-using-indexes = 1 slow-query-log = 1 slow-query-log-file = /var/log/mysql/mysql-slow.log |
Relancer le serveur Percona :
1 |
command service mysql start |
Si le serveur ne lance pas correctement, c’est qu’il y a une erreur dans les chemins d’accès ou que la précédente instance de Perconna est toujours en mémoire et qu’il faut la killer.
Accès distant dans le vlan
Par défaut, MySQL ou Percona ne sont accessibles que par localhost (127.0.0.1).
C’est le paramètre bind-address qui gère cette restriction.
Afin de ne pas toucher au fichier /etc/mysql/my.cnf, nous allons le surcharger en créant un fichier /etc/mysql/conf.d/jbnet.cnf.
Cette technique permet de remplacer le fichier my.cnf par les nouvelles versions lors d’une mise à jour.
Et ainsi de profiter des nouveautés.
Sauf si vous avez remplacé le fichier my.cnf pour Percona comme vu plus haut.
Ajouter dans le fichier /etc/mysql/conf.d/jbnet.cnf les lignes :
1 2 |
[mysqld] bind-address = 0.0.0.0 |
Enregistrez le fichier et relancez le service MySQL (qui est le même pour Percona) :
1 |
service mysql restart |
Attention, cette configuration n’est pas sécurisée.
Elle ne doit en aucun cas être mise en place sur un serveur MySQL ou Percona dont l’accès peut se faire directement à partir d’internet.
Il est possible de sécuriser l’accès en utilisant des règles de firewall NetFileter (iptables).
Testez l’accès distant à partir de la VM jbnet-web01.
Vous devez au préalable installer les outils MySQL-Client :
1 |
command apt-get install mysql-client |
Si vous avez installé Percona, ajoutez les dépôts et installez ce paquet :
1 |
command apt-get install percona-server-client-5.6 |
Si vous aviez déjà installé les outils MySQL-Client, ils seront désinstallés et remplacés :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Lecture des listes de paquets... Fait Construction de l'arbre des dépendances Lecture des informations d'état... Fait Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires : libdbd-mysql-perl libterm-readkey-perl Veuillez utiliser « apt-get autoremove » pour les supprimer. Les paquets supplémentaires suivants seront installés : libperconaserverclient18.1 percona-server-common-5.6 Les paquets suivants seront ENLEVÉS : mysql-client mysql-client-5.5 Les NOUVEAUX paquets suivants seront installés : libperconaserverclient18.1 percona-server-client-5.6 percona-server-common-5.6 0 mis à jour, 3 nouvellement installés, 2 à enlever et 0 non mis à jour. Il est nécessaire de prendre 1 956 ko dans les archives. Après cette opération, 4 433 ko d'espace disque supplémentaires seront utilisés. Souhaitez-vous continuer ? [O/n] |
Ligne de commande pour se connecter à distance sur un serveur MySQL :
1 |
command mysql -h 192.168.2.20 -u root -p |
Puisque vous avez exécuté « mysql_secure_installation » et refusé l’accès distant à root, vous devriez avoir un refus :
1 |
ERROR 1130 (HY000): Host '192.168.2.10' is not allowed to connect to this MySQL server |
Vous allez devoir créer un utilisateur avec les droits d’accès distant.
Sur le serveur jbnet-db, connectez-vous à MySQL avec l’utilisateur root :
1 |
command mysql -u root -p |
Exécutez cette commande pour ajouter l’utilisateur jbnet-user avec le mot de passe test1234 et l’autorisation de se connecter à partir du serveur 192.168.2.10 (jbnet-web01).
Cet utilisateur possède un niveau administrateur et des accès distant à toutes les bases de données.
Il n’est donc pas conseillé de l’utiliser sur les sites web que vous allez héberger dans votre vlan (comme une application type WordPress ou Magento).
Encore moins sur un serveur en production.
1 |
GRANT ALL PRIVILEGES ON *.* TO 'jbnet-user'@'192.168.2.10' IDENTIFIED BY 'test1234' WITH GRANT OPTION; |
Et rechergez les droits pour les appliquer :
1 |
FLUSH PRIVILEGES; |
Testez la connexion à partir du serveur jbnet-web01 :
1 |
command mysql -h 192.168.2.20 -u jbnet-user -p |
Vous pouvez ajouter le mot de passe directement dans la ligne de commande, sans espace avec le paramètre -p.
Ce n’est pas conseillé, car Linux enregistre l’historique des commandes dans le fichier ~/.bash_history et donc le mot de passe en clair.
Dans votre environnement de test, ce n’est pas grave, mais autant prendre de bonnes habitudes pour ne pas se faire avoir sur un serveur de production.
Résultat :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 40 Server version: 5.5.44-0+deb8u1 (Debian) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> |
Tapez « SHOW DATABASES; » pour afficher les bases de données :
1 2 3 4 5 6 7 8 |
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.01 sec) |
Tapez « exit » pour mettre fin à la connexion avec le serveur MySQL.
Félicitation, votre serveur web a accès au serveur MySQL dans votre vlan.