MaDoVi - Le wiki

Machines - Données - Virtualisation

Outils pour utilisateurs

Outils du site


archives:logiciel:mysql_ouverture

Le VHS - Un Serveur MySQL

Le présent tutoriel est très largement inspiré des tutoriels du wiki, du forum, des posts divers et variés sur le sujet.

Principales références.
Tuto de tbayart - Forum / SQL Workbench
Tuto de Guilouz - Forum / Kodi

Précautions d'empoi…

  • La configuration par défaut du serveur MySQL sur le NAS est ici modifiée. Ce changement (un ligne à commenter dans un fichier) est écrasé lors de chaque mise à jour de l'OS de Ve-hotech. Sauf grosses évolutions dans l'architecture de l'OS ou de MySQL et son fonctionnement, ce tuto - et son § 5. en particulier - devraient rester re-jouables … :-)
  • Les manipulations proposées sont réalisées sans aucune considération ou attention particulière quant à la sécurité et aux contrôles des accès - et notamment depuis l'extérieur du réseau local. Il vous appartiendra d'évaluer ces aspects pour votre installation et vos usages, et de mettre en œuvre en conséquence toutes configurations utiles sur vos routeur, pare-feu, “force” des mots de passe, limitations des accès, etc …



Modèle Versions VHT Versions softs Commentaires
8-) VHS4-VX 6.1.0
6.0.0
MySQL: 5.5.41
:-( —- —- MySQL: x.x.xx
:?: —- —- MySQL: x.x.xx
A compléter …

1. Contexte

MySQL est le Système de Gestion de Base de Données (SGBD) livré nativement sur le serveur NAS VHS par Ve-hotech.
Mais il est livré … «étanche» (pas accessible depuis le réseau)…

Pour réaliser des sites internet, la «triplette logicielle» PHP / MySQL / phpMyAdmin (+ le serveur web Apache évidemment) constitue la palette d'outils nécessaires et généralement suffisants, avec une gestion de contenu dynamique. C'est son objectif premier sur le NAS. Dans ce contexte, un accès au SGBD uniquement en local par le seul VHS n'est pas illogique pour un tel usage dédié.

Donc, sur le principe, pas grand chose à dire …
En outre, et pour bénéficier d'un support, Ve-hotech a adopté une licence particulière sur le produit MySQL aux termes de laquelle l'outil ne doit pas être ouvert à tous les vents …Il est bien connu qu'un contrat, y compris de licence, consiste pour l'essentiel à blinder, et donc à fermer portes et fenêtres ….

Néanmoins…

Néanmoins, il est quand même dommage de ne pas pouvoir accéder nativement à MySQL en dehors des outils du VHS, et notamment:

  • depuis un PC et ses applications
  • ou une application dans une VM hébergée sur le serveur,
  • ou depuis une application sur un smartphone/une tablette
  • ou par un système Kodi
  • ou par un système à base de RaspBerry ou autre

Bref ! Depuis à peu près n'importe quoi qui a un accès au réseau et connaît MySQL…

Le moteur MySQL existe sur le NAS, pourquoi ne pas l'utiliser différemment, et surtout hors du cadre strict des sites internet du VHS ?


2. Objectif

Modifier la configuration native de MySQL afin que le VHS soit vu - aussi et en plus - comme serveur de bases de données accessible et mutualisé sur le réseau local (ou au-delà: dans ce cas sécurité à creuser !).

Ce tutoriel n'invente rien: il tente de centraliser et généraliser à partir d'un existant et présente par étape les modifications de configuration nécessaires à l'ouverture réseau de l'accès à MySQL.
Il est long parce qu'il propose des explications - il s'agit plutôt de déductions - pour “justifier” les manipulations (faut bien essayer un peu de valeur ajoutée).

Pour les pressés ou ceux que le baratin n'intéresse pas : Au + court qui démontre au passage que ce n'est pas très compliqué et le retour arrière non plus, au cas où…


3. Au préalable

3.1. «Vocabulaire»

Dans les étapes et informations données au long du tutoriel, on utilisera par convention :

Libellé Description
sesame Sesame est le nom réseau du VHS. Il a une adresse de type 192.168.x.x.
paprika Paprika est le nom réseau du PC à partir duquel on travaille et utilisé pour illustrer l'accès distant. Il a une adresse de type 192.168.x.y.
Term_cmd C'est le nom donné, par commodité dans la rédaction, à une fenêtre terminal avec une connexion active en ssh admin@sesame. Destinée à la saisie/exécution de commandes.
Term_log Pour les mêmes raisons, autre fenêtre terminal avec une connexion active en ssh admin@sesame. Destinée à l'affichage des log MySQL, cette console n'est pas vraiment indispensable, juste par curiosité …
sudo sudo permet d'exécuter la commande à suivre avec les droits root. Elle demande un mot de passe qui dans notre cas sera celui du compte de l’administrateur du NAS admin.

Rem. n°1: admin est le compte administrateur du NAS. La connexion en mode ssh est supposée connue - elle est décrite à plein d'endroits dans le wiki ou sur le forum.
Rem. n°2: Vous n'échapperez pas à un exercice de transposition nécessaire des noms et adresses IP pour corresponde à votre environnement…

3.2. Définitions

MySQL s' «ouvre au monde» au moyen d'une configuration à deux étages:

  1. Au niveau du moteur lui-même :
    • écoute-t-il les demandes de connexion localement seulement (c'est la configuration par défaut de l'installation pour des raisons de sécurité - et c'est celle du VHS)
    • ou bien traite-t-il tout ce qui arrive par le réseau, quelque soit son origine ?
  2. Au niveau de chaque utilisateur qui se connecte: en particulier, l'utilisateur a-t-il le droit de venir d'où il vient ?

☛ C'est la variable de configuration bind_address, située dans le fichier my.cnf de l'instance MySQL concernée, qui pilote le «niveau moteur».
☛ Les droits des utilisateurs se définissent en mode connecté avec le compte root de MySQL.

3.3. Pré-requis

On va devoir accéder à la gestion des droits de MySQL. Et depuis le VHS (au moins dans un premier temps). Pour faire cela, on peut:

  • Se dire qu'on dispose sur le portail du VHS de l'outil phpMyAdmin. Raté, car le problème c'est que là-aussi les portes sont fermées et qu'on a pas accès à la gestion des utilisateurs (pas même la création de bases de données d'ailleurs). Ve-hotech reste cohérent dans ses choix d'implémentation: un utilisateur déclaré implique (entre autre) une arborescence de fichiers et une, et une seule, base à son nom dans MySQL et puis c'est tout…
  • en passer par la console mysql sur le VHS pour passer des requêtes… On va le faire comme çà et on s'en sort c'est évident, mais bon
  • tenir le raisonnement suivant: Le fait d'ouvrir MySQL implique de devoir administrer des bases “hors VHS”. Autant prendre un outil qui nous dispensera du mode console. Disponible sur le site de MySQL, l'outil «MySQL Workbench» est fait pour çà; il présente l'avantage de proposer un mode de connexion “over ssh” qui permet d'établir un connexion en faisant comme si on était sur le VHS (on gruge MySQL quant à l'adresse des connexions entrantes, parce que l'outil passe par ssh ). La récupération et l'installation sur une bécane de cette application multi-OS ne pose aucun souci particulier (voir le tuto de tbayart référencé ci-dessus).

On va donc préparer notre bureau comme çà sur Paprika: «MySQL Workbench» installé, les consoles «Term_cmd» et «Term_log» ouvertes et connectées à Sesame en ssh.


4. Configuration

4.1. Partie de chasse

Regardons d'abord ce qui se passe au niveau réseau pour MySQL (il y a d'autres lignes dans la réponse à la commande netstat auxquelles on ne s’intéresse pas ici):

Term_cmd
admin@sesame:~$ sudo netstat -nap | grep mysql
tcp        0      0 127.0.0.1:3306        0.0.0.0:*     LISTEN      14953/mysqld    
tcp        0      0 127.0.0.1:3307        0.0.0.0:*     LISTEN      14568/mysqld    
tcp        0      0 127.0.0.1:3308        0.0.0.0:*     LISTEN      14963/mysqld    
........
........

Tiens ?: 3 ports - 3306 (standard), 3307 & 3308 - en écoute locale (127.0.0.1) ⇒ 3 instances du moteur MySQL tournent sur le serveur.

En principe sous Linux (voir https://doc.ubuntu-fr.org/arborescence sur l'organisation des fichiers), le fichier se situe là: /etc/mysql/my.cnf et il existe bien sur le VHS. C'est vrai pour une instance. Si il y en a plusieurs, on doit trouver plusieurs exemplaires de ce fichier… et a priori, celui-là ne sert pas.

En générale, lorsque qu'on fait des choses optionnelles, on le fait dans /opt (emplacement pour des applications installées hors gestionnaire de paquets (logiciels optionnels) - voir même lien ubuntu ci-dessus).

VHT a fait les choses comme il faut et à «rangé ses petites affaires» sous /opt/vht:-D

On trouve 3 définitions (fichiers my.cnf) dans 3 chemins distincts:

Term_cmd
admin@sesame:~$ ls /opt/vht/etc/mysql*
/opt/vht/etc/mysql:
dbsBackup.list	my.cnf	startup.sql
 
/opt/vht/etc/mysql-sys:
my.cnf	startup.sql
 
/opt/vht/etc/mysql-users:
my.cnf	startup.sql

L'instance qui nous intéresse écoute sur le port standard 3306, d'abord parce qu'il est … standard, ensuite parce qu'il est confirmé par l'écran de phpMyAdmin sur le portail du NAS:


Le fichier dans /opt/vht/etc/mysql-users semble le plus indiqué (par son nom). On s'en assure en le lisant et en vérifiant que le port qu'on cherche est bien défini:

Term_cmd
admin@sesame:~$ sudo cat /opt/vht/etc/mysql-users/my.cnf 
[client]
port					= 3306

On pourra vérifier que les fichiers /opt/vht/etc/mysql/my.cnf et /opt/vht/etc/mysql-sys/my.cnf activent les ports 3307 et 3308 respectivement et qu'ils concernent ainsi les autres instances à l'écoute sur le VHS et identifiées au début de ce §. A priori ces environnements sont propres au systèmes du VHS.

:!: Recommandation: Ne pas y toucher:!:
sauf peut-être ludovicalchi qui veut intégrer des applis … ;-).


4.2. Étage 1 - Écoute

Il s'agit donc d'indiquer à l'instance du serveur MySQL (identifiée ci-dessus) de traiter l'ensemble des requêtes, y compris celles en provenance du réseau.
On va ici activer un fichier de log, juste pour voir ce qui se passe, dans la console qui va bien:

Term_log
admin@sesame:~$ sudo tail -f /var/log/mysql-users/error.log
151002  1:52:10 InnoDB: Completed initialization of buffer pool
151002  1:52:10 InnoDB: highest supported file format is Barracuda.
151002  1:52:10  InnoDB: Waiting for the background threads to start
151002  1:52:11 InnoDB: 5.5.41 started; log sequence number 1622500
151002  1:52:11 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
151002  1:52:11 [Note]   - '127.0.0.1' resolves to '127.0.0.1';
151002  1:52:11 [Note] Server socket created on IP: '127.0.0.1'.
151002  1:52:11 [Note] Event Scheduler: Loaded 0 events
151002  1:52:11 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.41-0ubuntu0.14.04.1'  socket: '/opt/vht/wshserver/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)

On voit dans cette log (c'est la bonne, notez le chemin du fichier dans la commande tail): Qu'on écoute en local donc (127.0.0.1) sur le port 3306.

On va changer cela en éditant le fichier my.cnf de notre instance MySQL pour y commenter la ligne bind_address:

Term_cmd
admin@sesame:~$ sudo nano /opt/vht/etc/mysql-users/my.cnf 

Cette commande ouvre l'éditeur nano qui permet de modifier le fichier (sauvegarde: CTRL+X + y pour écraser l'original). Cherchez la ligne bind_address et commentez-là (# en début de ligne).

:?: On ajoutera optionnellement la variable / flag skip-name-resolve: cf. la doc MySQL pour en comprendre la raison et en mesurer la pertinence sur votre réseau.


La prise en compte de ces modifications passe par un arrêt / relance de MySQL (ici, plus de notion d’instance, on redémarre tout). La commande est la suivante (elle dure un peu):

Term_cmd
admin@sesame:~$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 4696

Et vous pourrez observer la console Term_log, y voir le shutdown et vous assurer de la bonne prise en compte: 127.0.0.1 devient 0.0.0.0

Term_log
admin@sesame:~$ sudo tail -f /var/log/mysql-users/error.log
151002  1:52:10 InnoDB: Completed initialization of buffer pool
151002  1:52:10 InnoDB: highest supported file format is Barracuda.
151002  1:52:10  InnoDB: Waiting for the background threads to start
151002  1:52:11 InnoDB: 5.5.41 started; log sequence number 1622500
151002  1:52:11 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
151002  1:52:11 [Note]   - '127.0.0.1' resolves to '127.0.0.1';
151002  1:52:11 [Note] Server socket created on IP: '127.0.0.1'.
151002  1:52:11 [Note] Event Scheduler: Loaded 0 events
151002  1:52:11 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.41-0ubuntu0.14.04.1'  socket: '/opt/vht/wshserver/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)
151002  2:09:39 [Note] /usr/sbin/mysqld: Normal shutdown
 
151002  2:09:39 [Note] Event Scheduler: Purging the queue. 0 events
151002  2:09:39  InnoDB: Starting shutdown...
151002  2:09:40  InnoDB: Shutdown completed; log sequence number 1622500
151002  2:09:40 [Note] /usr/sbin/mysqld: Shutdown complete
 
151002  2:09:57 [Note] Plugin 'FEDERATED' is disabled.
151002  2:09:57 InnoDB: The InnoDB memory heap is disabled
151002  2:09:57 InnoDB: Mutexes and rw_locks use GCC atomic builtins
151002  2:09:57 InnoDB: Compressed tables use zlib 1.2.8
151002  2:09:57 InnoDB: Using Linux native AIO
151002  2:09:57 InnoDB: Initializing buffer pool, size = 128.0M
151002  2:09:57 InnoDB: Completed initialization of buffer pool
151002  2:09:57 InnoDB: highest supported file format is Barracuda.
151002  2:09:57  InnoDB: Waiting for the background threads to start
151002  2:09:58 InnoDB: 5.5.41 started; log sequence number 1622500
151002  2:09:58 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
151002  2:09:58 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
151002  2:09:58 [Note] Server socket created on IP: '0.0.0.0'.
151002  2:09:58 [Note] Event Scheduler: Loaded 0 events
151002  2:09:58 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.41-0ubuntu0.14.04.1'  socket: '/opt/vht/wshserver/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)

Cette phase est terminée. L'instance destinée aux utilisateurs (celle du phpMyAdmin et des sites internet du VHS) traite désormais les flux entrant en provenance du réseau, en plus des demandes locales auxquelles elle se limitait jusqu'à présent.

Mais ce n'est pas fini: Il faut maintenant s'occuper des utilisateurs, aucun d'entre-eux n'est encore autorisé à ce connecter par un canal réseau.

Remarque: La variable bind_address peut être positionnée à 0.0.0.0 au lieu d'être commentée, cela a le même effet. Elle a une tête d'adresse IP et peut être utilisée, pour par exemple et dans un autre environnement, positionner l'@IP du serveur hébergeant MySQL - serveur qui pourrait disposer de plusieurs adresses et cartes réseaux.

Les changements apportés à ce fichier /opt/vht/etc/mysql-users/my.cnf sont perdus à chaque mise à jour du serveur VHS par ve-hotech. Par exemple, le passage de la v 6.0.0 à la v 6.1.0 a remis le fichier d'origine, même avec des évolutions sans rapport avec MySQL …



4.3. Étage 2 - Droits utilisateurs

On va définir un utilisateur “remoteAdmin” dont le rôle sera d'administrer les bases de données, celles du VHS et les autres, avec un accès distant autorisé (on verra que des bases tierces peuvent en partie entrer dans le domaine VHS).

:!: Attention: Dans ce tuto, notre utilisateur va disposer des tous les privilèges, y compris sur les bases existantes et propres au VHS… Cassez pas tout …

Les utilisateurs et leurs droits - au moins le premier - sont définis au moyen d'un accès en root à MySQL. Donc, il nous faut mettre la main sur le mot de passe de ce compte root.

Dans le “magasin” bien ordonné de Ve-hotech, on va trouver le fichier /opt/vht/etc/db/mysql-users.ini. Ce fichier contient le mot de passe du compte root de l'instance qui nous intéresse: On va le récupérer et le garder sous le coude pour l'utiliser.

Term_cmd
admin@sesame:~$ sudo cat /opt/vht/etc/db/mysql-users.ini
[database]
adapter = pdo_mysql
params.host = localhost
params.unix_socket = /opt/vht/wshserver/run/mysqld/mysqld.sock
params.dbname = mysql
params.username = root
params.password = <<<<mode_de_passe_root>>>>

On se connecte à la console de MySQL en root donc (avec le mot de passer récupéré juste avant).

NB: Dans la commande, prenez garde à bien remplacer sesame par l'adresse IP de votre VHS ou son nom réseau.

Term_cmd
admin@sesame:~$ mysql -h sesame -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
 
Copyright (c) 2000, 2014, 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> 

Le prompt mysql> indique que vous êtes en mode de commande SQL.

La création de notre utilisateur correspond aux deux commandes ci-dessous (vous pouvez copier/coller dans la console les deux en une fois - il y aura une validation demandée sur la seconde).
NB: En dehors des privilèges sur la bases de données, c'est le caractère % qui indique «connexion autorisée en provenance de n'importe où» :

Term_cmd
GRANT ALL privileges ON *.* TO 'remoteAdmin'@'%' IDENTIFIED BY 'remoteAdmin' WITH GRANT OPTION;
FLUSH privileges;

On obtient le résultat suivant (on termine avec exit ou [CTRL]+c:

Term_cmd
mysql> GRANT ALL privileges ON *.* TO 'remoteAdmin'@'%' IDENTIFIED BY 'remoteAdmin' WITH GRANT OPTION;
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> FLUSH privileges;
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> exit
Bye
admin@sesame:~$ 

Bon, c'est peut-être un peu trop «Open bar» en termes de contrôles d'accès… On peut faire des définitions du genre:

CREATE USER 'toto@192.168.110.2' IDENTIFIED BY 'motdepasse';
CREATE USER 'developpeur@192.168.110.%' IDENTIFIED BY '...';
CREATE USER 'developpeur@192.168.110.0/255.255.255.0' IDENTIFIED BY '...';

Mais c'est un autre sujet… A vous de définir votre propre stratégie de sécurité et vos règles et contrôles des accès…

:!: Pour ouvrir MySQL, tout compte utilisateur qu'on souhaite utiliser pour une connexion distante doit avoir, après le @, une adresse IP (différente de 127.0.0.1 ou de localhost), un masque d'adresse (sous réseau), un nom de machine réseau ou bien %.


4.4. Vérification

Utilisez l'outil «MySQL Workbench» pour voir ce qui se passe.

Définissez votre connexion en vous appuyant sur l'écran ci-dessus (adaptez votre Hostname: adresse ou nom de votre VHS, login: remoteAdmin - mot de passe: remoteAdmin).

Notez la méthode de connexion: «Standard (TCP/IP)» et pas «over ssh» (qu'on aurait pu utiliser pour définir notre utilisateur initial et ses droits d'accès réseau en '@%' ).
Avec les privilèges qu'on a donné à notre utilisateur (tous), vous pourrez voir les bases de tous les utilisateurs du VHS.

Vous pouvez désormais définir et accéder à des bases de données hébergées sur le VHS, dès lors que vos systèmes clients ont accès à votre réseau et qu'ils disposent des librairies pour MySQL client. Les comptes définis pour ces connexions (que vous pouvez ajouter avec remoteAdmin) devront avoir des droits de connexion réseau.

La chaîne de connexion de ces clients doit exploiter les informations suivantes:

  • host=adresse du VHS ou son nom réseau
  • port=3306
  • user=nouveau compte défini ou remoteAdmin
  • pwd=celui du compte ou remoteAdmin

☛ Ceci termine les manipulations de configuration. Le reste vous appartient…8-)


5. Au + court

En synthèse: Opérations sur le VHS / connexion ssh

  1. Ouvrir l'instance MySQL:3306 aux connexions réseau
    1. Commenter la ligne bind_address dans le fichier /opt/vht/etc/mysql-users/my.cnf
    2. Arrêt/relance du moteur MySQL pour prise en compte : service mysql restart
  2. Créer un utilisateur MySQL avec droit réseau
    1. Récupérer le mot de passe du compte root dans /opt/vht/etc/db/mysql-users.ini
    2. Se connecter à la base: mysql -h <adresse VHS> -u root -p
    3. Créer un utilisateur avec accès distant et tous privilèges (exemple)
      1. GRANT ALL privileges ON *.* TO 'remoteAdmin'@'%' IDENTIFIED BY 'remoteAdmin' WITH GRANT OPTION;
      2. FLUSH privileges;
  3. Utiliser les informations suivantes pour accéder au serveur MySQL sur le VHS, depuis n'importe quel client réseau:
    • host=adresse du VHS ou son nom réseau
    • port=3306
    • user=nouveau compte défini ou remoteAdmin
    • pwd=celui du compte ou remoteAdmin

C'est tout !

Retour arrière: Annuler les étapes ci-dessus, dans l'ordre inverse et en supprimant au préalable les tables et bases de données éventuellement créées: plus personne n'y aura accès.

Pour plus de précisions, voir la documentation MySQL…
En cas de problème, contactez votre administrateur…. :-x


6. Travaux pratiques

La suite du tuto consiste à proposer des cas d'usage, pour s'assurer que çà fonctionne comme prévu ou donner des idées d'utilisation… sous entendu: pas forcément pratique ou réaliste, c'est pas important!

6.1. Un client sous Android

On va ici illustrer l'accès à des données de notre instance MySQL par un client du réseau. Pour ce faire, on va définir une base de données et une table, à laquelle on va accéder à partir d'un smartphone (ou d'une tablette) et sa connexion wifi. On supposera donc que la connexion du téléphone au réseau local est opérationnelle.

Désolé: c'est sous Android, mais on doit pouvoir trouver une application équivalente pour IBidule…?


6.1.1. Côté Serveur

On va créer un base et une table … parfaitement inutiles…: Le top5 des inscrits au forum en nombre de messages écrits ! m(

La création et le peuplement de notre exemple (données au 12 octobre 2015 …) correspond au code SQL suivant:

CREATE DATABASE `BddAndroid`;
CREATE TABLE `BddAndroid`.`ForumTop5` (
  `idForumTop5` INT NOT NULL,
  `Nom` VARCHAR(45) NULL,
  `Status` VARCHAR(45) NULL COMMENT 'Status sur le forum',
  `Inscription` DATETIME NULL COMMENT 'Date d\'inscription',
  `Visite` DATETIME NULL COMMENT 'Date de dernière visite',
  `NbMsg` INT NULL COMMENT 'Nombre de messages');
INSERT INTO `BddAndroid`.`ForumTop5` (`idForumTop5`,`Nom`,`Status`,`Inscription`,`Visite`,`NbMsg`) 
VALUES (1,'Epy','Modérateur','2009-01-22 19:00:49','2015-10-12 19:38:44', 2917);
INSERT INTO `BddAndroid`.`ForumTop5` (`idForumTop5`,`Nom`,`Status`,`Inscription`,`Visite`,`NbMsg`) 
VALUES (2,'Laurent','Membre très actif','2009-03-11 23:55:36','2015-10-12 10:20:05',1766);
INSERT INTO `BddAndroid`.`ForumTop5` (`idForumTop5`,`Nom`,`Status`,`Inscription`,`Visite`,`NbMsg`) 
VALUES (3,'bpe','Posting Freak','2010-12-06 00:28:22','2015-10-11 20:30:45',1556);
INSERT INTO `BddAndroid`.`ForumTop5` (`idForumTop5`,`Nom`,`Status`,`Inscription`,`Visite`,`NbMsg`) 
VALUES (4,'introid','Posting Freak','2011-03-12 13:28:08','2015-06-13 18:58:54',1481);
INSERT INTO `BddAndroid`.`ForumTop5` (`idForumTop5`,`Nom`,`Status`,`Inscription`,`Visite`,`NbMsg`) 
VALUES (5,'gece','Posting Freak','2009-05-15 07:24:12','2015-09-10 18:10:15',1132);

On pourra utiliser MySQL Workbench ou bien la console mysql sous ssh sur le VHS (vous pouvez copier/coller le code SQL à la suite du prompt mysql dans la console).

6.1.2. Côté Client

Installer sur votre smartphone ou votre tablette Android le client vcrox à partir de Google Play (d'autres choix sont sans doute possibles):



Lancez l'application, définissez les informations de connexion à l'instance MySQL du NAS (remplacer l'adresse IP par celle de votre VHS), connectez-vous, choisissez la base “BddAndroid” et naviguez dans la table …

NB: Comme notre utilisateur “remoteAdmin” à tous les droits, vous pourrez ainsi accéder à l'ensemble des bases et tables définies sur le VHS…


6.2. Un utilisateur, pour les réunir toutes

Le compte MySQL “remoteAdmin” tel que défini dans ce tuto est une espèce de “super-administrateur” pour l'instance de MySQL utilisée ici: Il accède en effet à tous les utilisateurs et toutes les bases définies, y compris celles créées via les comptes du portail du VHS. Ainsi, par une sorte d' «effet de bord», il est possible d'intégrer des bases dans le domaine du VHS, et également d'autoriser l’accès aux bases VHS depuis des clients externes, et cela en manipulant les droits des utilisateurs sur les bases…

6.2.1. Bases in...

☛ Changer les droits d'un utilisateur défini par un compte dans le domaine du VHS, de telle façon qu'il puisse voir et gérer l'ensemble des bases/sites web hébergés sur le VHS.
Résultat: plusieurs bases pour un même utilisateur, visibles depuis le portail / phpMyAdmin…

Supposons qu'on ait créé un utilisateur du VHS nommé «intranet», dans l'idée que c'est via son compte qu'on va gérer l'ensemble des sites web hébergés sur le NAS. Cet utilisateur dispose d'un compte donc, d'un login/mot de passe pour le portail, et d'une (et une seule, sans possibilité d'en ajouter) base de données à son nom, accédée avec les mêmes login et mot de passe.

Sur le portail du VHS, et avec ce compte via l'outil phpMyAdmin, on voit quelque chose proche de ceci:


Même en jonglant avec les noms de tables et autres préfixes, gérer les données de plusieurs sites à partir d'une seule base devient rapidement chia… complexe !
Définir autant de bases de données que de sites hébergés pourrait être autrement plus simple, pour autant qu'on n'ait pas à créer les utilisateurs portail correspondant.

Si on arrive à mettre la base «BddAndroid», définie dans l'exemple précédent, dans le périmètre de notre compte «intranet», on aura solutionné le problème: il suffira de reproduire la manip autant de fois que de bases qu'on veut y voir…

Illustration: On va changer la vue qu'a l'utilisateur «intranet» sur les données, via ses droits sur les bases - et avec l'outil Workbench pour changer - étant entendu qu'on peut le faire dans la mesure où l'utilisateur «remoteAdmin» de ce tuto a été défini avec tous les droits.

Dans MySQL WorkBench donc, définissez votre connexion et utilisez-là avec le compte “remoteAdmin”:


Une fois connecté:

  • via la rubrique à gauche “Management / Users & Privilèges” (le logiciel redemande le mot de passe),
  • choisir l'onglet «schema privileges» pour le compte «intranet»,
  • ajouter une entrée et choisir la base «BddAndroid»,
  • activer le bouton “Select ALL” pour donner tous les droits.


Vous obtenez un écran analogue à celui-ci:


Appliquez vos choix avec “Apply”; dès lors, vous pouvez retourner sur le portail VHS / phpMyAdmin et rafraîchir l'écran.
Hop, on “voit” notre nouvelle base:


On peut créer de cette manière plusieurs base de données, initialement “extérieures” au VHS et hors portail, et par une simple attribution de droits, les “internaliser” et les “affecter” à un ou plusieurs utilisateurs/comptes dans le portail du NAS…

6.2.2. Bases [depuis] out...

☛ Inversement, permettre qu'un compte utilisateur défini dans le VHS puisse être utilisé par un client MySQL réseau.

Beaucoup de sites internet sont “dynamiques” en ce sens que des données sont stockées en bases. « Euh… Ok ! ».
La mise à jour de ces données ne se fait pas toujours - voire rarement - depuis le site lui-même: le site n'est souvent “que” de la présentation et la mise en base des données passe par un autre biais.
Sur la VHS, on utilisera phpMyAdmin a priori, mais on peut imaginer l'utilisation d'un autre outil, extérieur au NAS (par exemple, une application dédiée sur un poste du réseau).

Si on reprend l'application sous Android (pour l'exemple…) et si on veut réserver le compte “intranet” à cet usage de mise à jour des données (à la place de “remoteAdmin”, histoire de pas mélanger les rôles), on va changer l'utilisateur de la connexion “remoteAdmin” en “intranet” sur le téléphone et … çà ne marchera pas : “intranet” ne peut accéder aux données que depuis le VHS lui-même, parce que le compte est défini en mode de connexion “localhost” uniquement lors de sa création par le VHS.

Qu'a cela ne tienne: On va ajouter un accès en % pour le compte “intranet” et il aura le droit d'accéder depuis n'importe où.

MySQL permet une grande souplesse dans la définition des droits. Pour exploiter cette souplesse, plutôt que de modifier le localhost en % pour l'utilisateur “intranet”, il vaut mieux ajouter un nouvel utilisateur avec même nom et même mot de passe.

Donc à nouveau dans MySQL WorkBench :

  • utiliser la rubrique à gauche “Management / Users & Privilèges” (le logiciel redemande le mot de passe),
  • ajouter un utilisateur avec le bouton “Add Account”: dans la rubrique “limit connectivity…” positionner % et positionner même login et mot de passe que le compte “intranet”
  • Ne pas oublier de choisir l'onglet «schema privileges» et ajouter une entrée et choisir la base «BddAndroid»,
  • activer le bouton “Select ALL” pour donner tous les droits (on peut la faire plus fine dans les d'accès)
  • appliquez avec “Apply”.

L'écran ne doit pas être loin de celui-là:

Cette opération faite, sur votre smartphone définissez une nouvelle connexion à l'instance MySQL du NAS, analogue à celle de “remoteAdmin” mais avec les login/mot de passe de “intranet”.

Et hop, vous avez accès … à la même chose qu'avec “remotAdmin”, au premier abord … Ça à l'air un peu bête, mais ce n'est pas tout à fait la même chose:

  • “intranet” est à l'origine un compte du VHS, défini via le portail
  • “intranet” a désormais accès à MySQL depuis l'extérieur (il ne pouvait pas avant)
  • “intranet” ne voit que “BddAndroid” parce qu'on n'a défini que ces droits-là dans ses privilèges; on n'aurait pu lui donner accès, depuis l'extérieur, à sa base “intranet” à lui.

Bref…

Ce qu'il faut retenir: A partir du moment où les bases de données sont présentes sur le serveur, le fait de les voir ou pas, d'y accéder ou pas, sur le portail et depuis l'«extérieur», se limite uniquement à une question de droits des utilisateurs (et de chacun des utilisateurs), en termes d'origine des connexions et en termes de privilèges sur telle ou telle base.

Ceci pour dire que vous avez intérêt à user et abuser des droits des utilisateurs tels que définis dans MySQL, en les ouvrant ou au contraire en les limitant, en exploitant au maximum toute la finesse que le système autorise:

  • dupliquer les comptes
  • utiliser de façon ciblée “limit connectivity to host”: localhost, @IP connue, nom de machine, % (de n'importe où)
  • définir des droits précis sur les “schema” (ou bases de données)
  • faire une combinatoire des ces critères pour des définitions “aux petits oignons” …

6.3. Accès depuis une VM

Une VM hébergée sur le VHS est vue comme un machine comme une autre, y compris au regard du réseau: Elle a sa propre adresse IP. En conséquence, et même si en principe l’accès des VM au SGBD est “natif” semble-t-il, il n'y a pas de différence pour MySQL, entre un accès depuis une machine quelconque du réseau et une VM du VHS…

Donc il n'y a rien de particulier à faire en plus: un client MySQL depuis une VM est … un client MySQL d'une machine sur le réseau…!

A titre d'exemple idéal, tentons la synthèse (avec un cas un brin perso que j’aimerais bien mettre en œuvre … et qui n'existe pas encore, hélas !)

Supposons qu'on dispose d'une application “NetSniff” (à trouver et/ou à construire) qui soit capable de mesurer l'activité sur le réseau local ainsi que vers et depuis l'extérieur (faut sniffer le modem/routeur) - régulièrement sur des périodes programmées. Cette application stocke les indicateurs dans une base de données (MySQL au hasard …): quels volumes d'octets échangés, par qui et depuis/vers quelles machines et applications, sur quelles périodes de temps, selon quels protocoles, etc…

La place de NetSniff est bien sûr dans une VM du VHS: pas question de faire tourner une autre bécane en permanence et improbable - en l'état - qu'elle s'installe nativement sur le NAS.
A l'instar de “BddAndroid”, on crée une base de données “NetSniff” et son utilisateur avec droit réseau (% ou mieux: adresse IP de la VM).

Et pour la synthèse, on déroule… :

  • Ouverture de droit pour l'utilisateur “intranet” du VHS
  • Réalisation d'un superbe site en php: historique sur 24 mois glissant, sélection de périodes, comparaisons, graphismes colorés, courbes rouges et vertes calendaires, et autres histogrammes et camemberts
  • Cerise sur le gâteau, un système d'alerte: procédure stockée MySQL ou bout de code quelque part qui calcule des pics et des seuils et envoie un mail d'alerte: “Nous sommes le 21 et vous avez consommé 92% de votre quota mensuel !”
  • Ça arrive évidemment sur le smartphone, qui permet de consulter la base …
  • … et d'éteindre à distance le composant qui consomme…
  • 8-O
  • … pfff

Calme… ! Bon là, y a encore du boulot …:-/

Hum, y avait peu à dire sur les VM - pour l'accès MySQL ! - c'était juste pour illustrer un truc «de bout en bout» … ;-)


6.4. Base Kodi

Voir Tuto de Guilouz - Forum / Kodi

FIXME Pas ce qu'il faut pour tester mais il ne devrait pas y avoir de raison que l'inconvénient mentionné existe:

Inconvénients : La gestion de la base MySQL ne peut plus se faire via 
PHPmyAdmin sur l'interface du VHS mais via uniquement des logiciels tiers de 
gestions MySQL (Sequel Pro, MySQLWorkbench, etc...).

Pistes / Suggestions - A confirmer:
1/ Pas de remplacement de localhost dans params.host par l'adresse du VHS dans le fichier suivant /opt/vht/etc/db/mysql-users.ini.
2/ Commenter le bind_address avec # en début de ligne, plutôt que fixer l'adresse du VHS ⇒ arrêt/relance…. Mais sans conviction …
3/ L'utilisateur KODI du VHS doit avoir des droits sur la base KODI (“schema privilege” dans Workbench)

archives/logiciel/mysql_ouverture.txt · Dernière modification: 04/10/2019 20:47 de Cram28