Gestion des bases de données avec EoleDB

EoleDB est disponible depuis la version 2.5.2 d'EOLE. C'est une re-implémentation de l'ancien gestionnaire des bases de données EOLE (eole-sql) dont les objectifs principaux sont :

  • n'utiliser qu'un seul fichier de configuration ;

  • supporter nativement plusieurs types de bases de données (MySQL, PostgreSQL, SQLite, ...) ;

  • supporter nativement l'externalisation des bases de données sur d'autres serveurs ;

  • ne plus avoir à fournir des scripts python dans les paquets d'application web du projet EOLE pour pouvoir générer ou mettre à jour des bases de données (cf eole-sql : /usr/share/eole/applications/gen/, /usr/share/eole/applications/passwords/, /usr/share/eole/applications/updates/).

EoleDB rend possible l'externalisation des bases de données d'un module EOLE.

Remarque

Pour le moment, EoleDB gère uniquement les bases de données MySQL[1] et PostgreSQL[2].

Installation d'EoleDB

L'installation d'EoleDB se fait manuellement sur le serveur qui héberge l'application web avec la commande apt-eole :

# apt-eole install eole-db

Remarque

Le paquet eole-db est pré-installé sur le module Scribe depuis la version 2.6.0.

Configuration d'EoleDB

Par défaut le serveur de base de données est paramétré comme étant local. Dans le cas où le serveur est distant quelques variables sont à renseigner.

  • Adresse du serveur de base de données : adresse IP, nom de machine ou nom de domaine du serveur de base de données distant. Cette valeur est utilisée pour toutes les applications web qui ne définiront pas elles-mêmes un serveur de base de données.

  • Port du serveur de base de données : port du serveur de base de données utilisé, par exemple 3306 pour le serveur MySQL fourni par EOLE.

  • Nom d'utilisateur d'administration : identifiant du gestionnaire de la base de données distante.

  • Fichier de mot de passe : chemin d'accès vers le fichier qui contient le mot de passe du gestionnaire, par exemple /root/bdpass.txt. Ce fichier doit être accessible par EoleDB, idéalement le fichier doit avoir les droits 600.

  • Machines qui peuvent utiliser le serveur de BDD : permet d'autoriser des machines à accéder à l'administration des bases distantes #fixme, si rien n'est renseigné l'adresse IP du serveur utilisant EoleDB est ajoutée automatiquement dans le fichier de configuration.

EoleDB dispose d'un fichier de configuration principal, /etc/eole/eole-db.conf, géré par Creole.

Ce fichier est au format YAML[3], il définit le comportement par défaut d'EoleDB si aucune configuration spécifique n'est définie par l'application web.

Exemple

1
dbhost: 192.168.0.24
2
dbport: 3306
3
dbroot: root
4
client_hosts: ['192.168.0.26']
5
dbrootpwd: /root/bdpass.txt

Le fichier /root/bdpass.txt est un fichier à créer, il contient le mot de passe en clair du gestionnaire. Ce fichier doit être accessible par EoleDB, idéalement le fichier doit avoir les droits 600.

Configuration d'une application web

Les applications web disponibles sur les modules EOLE fournissent un fichier de configuration au format YAML[3] qui surcharge le fichier de configuration principal d'EoleDB.

Ces fichiers de configuration spécifiques aux applications redéfinissent le comportement par défaut d'EoleDB, ils sont stockés dans /etc/eole/eole-db.d/.

Pour des raisons pratiques, EoleDB réalise le changement de mots de passe dans les fichiers de configuration des applications.

Les mots de passe sont changés à chaque lancement des commandes eole_db_gen et reconfigure.

Pour utiliser EoleDB il faut mettre en place un fichier de configuration portant l'extension .yml dans le répertoire /etc/eole/eole-db.d/ en utilisant :

  • dbhost : définition de l'adresse du serveur de base de données utilisé par l'application (surcharge la valeur par défaut définie dans /etc/eole/eole-db.conf) ;

  • dbport : définition du port d'écoute du serveur de base de données utilisé par l'application (surcharge la valeur par défaut définie dans /etc/eole/eole-db.conf) ;

  • dbroot : définition du nom de l'utilisateur ayant des droits "Administrateur" sur le serveur de base de données utilisé par l'application (surcharge la valeur par défaut définie dans /etc/eole/eole-db.conf) ;

  • dbrootpwd : définition du mot de passe par défaut de l'utilisateur défini par l'option dbroot (surcharge la valeur par défaut définie dans /etc/eole/eole-db.conf) ;

  • dbtype : définition du type de base de données par défaut du serveur de base de données (mysql, pgsql, sqlite, ...) ;

  • dbname : nom de la base de données de l'application ;

  • dbuser : nom de l'utilisateur utilisé par l'application pour accéder à la base définie dans dbname ;

  • dbpass : mot de passe utilisé par l'application pour l'utilisateur défini dans dbuser ;

  • createscript : script SQL de création de la base de données définie dans dbname ;

  • sqlscripts : scripts SQL a lancer après le script de création défini dans createscript ;

  • updatescripts : scripts de mise à jour exécutés sur la base définie dans dbname (exécutés uniquement si la base existe déjà) ;

  • pwd_files : définition des fichiers à mettre à jour après le changement du mot de passe de l'utilisateur défini dans dbuser.

Exemple

1
dbtype: mysql
2
dbname: taskfreak
3
dbuser: taskfreak
4
dbpass: "53nrgk>as="
5
createscript: "/usr/share/eole/db/taskfreak/gen/taskfreak-create.sql"
6
pwd_files:
7
    - {file: '/var/www/html/taskfreak/include/config.php',
8
       pattern: '$dbpass="',
9
       owner: 'www-data:www-data',
10
       mod: '600' }

Truc & astuce

L'option pwd_files accepte une liste de dictionnaires au format python.

Exemple

1
pwd_files:
2
    - {file: '/var/www/html/posh/includes/config.inc.php',
3
       container: 'web',
4
       pattern: 'define("__PASS","',
5
       end_pattern: ');',
6
       owner: 'root:www-data',
7
       mod: '660' }
8
    - {file: '/usr/share/envole/eoledb/posh',
9
       pattern: 'dbpassPOSH="',
10
       owner: 'root:root',
11
       mod: '600' }

Liste des options possibles d'un dictionnaire pwd_files :

  • file : chemin complet du fichier à modifier (option obligatoire) ;

  • pattern : modèle de ligne qui contient le mot de passe entre " (option obligatoire) ;

  • end_pattern : permet de définir le ou les caractères à ajouter après le pattern ;

  • owner : propriétaire au format "user:group", à définir après la modification du mot de passe ;

  • mod : droits au format Unix (ex: 600) à définir après la modification du mot de passe ;

  • container : conteneur ou se trouve le fichier à modifier.

Attention

L'option pattern permet de définir le modèle de ligne qui contient le mot de passe, il est important de définir la totalité de ce qui précède le mot de passe dans la ligne.

Exemple

Ligne à changer dans le fichier de configuration /chemin/monFichier.conf :

password: "JeSuiSunMauvaisPassowrd"

La valeur de l'option pattern doit être password: "

Extrait du fichier YAML :

pwd_files:

- {file: "/chemin/monFichier.conf",

pattern: 'password: "'

EoleDB détermine automatiquement qu'il faut faire suivre, après remplacement, la valeur de pattern par le caractère ". Aussi si le caractère ouvrant est ' il faut préférer le format suivant :

pattern: "password: '"

EoleDB détermine automatiquement qu'il faut faire suivre la valeur de pattern par le caractère '.

EoleDB détecte également si le caractère ; est requis en fin de ligne et l'ajoute après le pattern.

Truc & astuce

L'option end_pattern permet de maîtriser des cas non gérés par EoleDB, exemple

define('DBPASS': 'JeSuisUnMauvaisPassword');

pattern : "define('DBPASS': '"

end_pattern: ");",

Pour une application 3 modes de gestion de la base de données sont possibles et sont fonctions de la configuration :

  • mode default : l'application utilise la configuration globale d'EoleDB ;

  • mode local : l'application force l'utilisation d'un serveur de base de données local ;

  • mode externe : l'application force l'utilisation d'un serveur de base de données et définit complètement la configuration.

Le mode default

Dans le mode default, l'application ne prend donc aucune liberté et sa configuration repose exclusivement sur la configuration d'EoleDB saisie dans l'onglet Eoledb de l'interface de configuration du module.

Exemple
1
dbtype: mysql
2
dbname: taskfreak
3
dbuser: taskfreak
4
dbpass: "53nrgk>as="
5
createscript: "/usr/share/eole/db/taskfreak/gen/taskfreak-create.sql"
6
pwd_files:
7
    - {file: '/var/www/html/taskfreak/include/config.php',
8
       pattern: '$dbpass="',
9
       owner: 'www-data:www-data',
10
       mod: '600' }
Attention

Si le comportement d'EoleDB est changé, celui-ci impactera l'application.

Le mode local

Dans le mode local la configuration de l'application à utiliser un serveur de base de données local, il faut donc ajouter dans la configuration dbhost et client_hosts.

La configuration d'EoleDB saisie dans l'onglet Eoledb de l'interface de configuration du module est ignorée.

Exemple
1
---
2
dbhost: 127.0.0.1
3
dbtype: mysql
4
dbname: taskfreak
5
dbuser: taskfreak
6
dbpass: "task;Freak" 
7
client_hosts: ["127.0.0.1", "localhost"]
8
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql" 
9
pwd_files:
10
    - {file: '/var/www/html/taskfreak/include/config.php',
11
       pattern: '$dbpass="',
12
       owner: 'www-data:www-data',
13
       mod: '600' }

Le mode externe

Dans le mode externe l'application définie complètement le serveur externe de base de données à utiliser, il faut donc ajouter dans la configuration, en plus de dbhost et client_hosts ajouté dans le mode local, dbroot et dbrootpwd.

La configuration d'EoleDB saisie dans l'onglet Eoledb de l'interface de configuration du module est ignorée.

Exemple
1
---
2
dbhost: 192.168.45.34
3
dbport: 3309
4
dbroot: adminDB
5
dbrootpwd: /root/.secrets-mydb
6
dbtype: mysql
7
dbname: taskfreak
8
dbuser: taskfreak
9
dbpass: "task;Freak" 
10
client_hosts: ["127.0.0.1", "localhost", "192.168.0.14" ]
11
createscript: "/usr/share/eole/mysql/taskfreak/gen/taskfreak-create.sql" 
12
pwd_files:
13
    - {file: '/var/www/html/taskfreak/include/config.php',
14
       pattern: '$dbpass="',
15
       owner: 'www-data:www-data',
16
       mod: '600' }

Mode conteneur

Pour fonctionner dans un conteneur EOLE, sur le module AmonEcole par exemple, l'application doit utiliser le mode local avec une configuration adaptée.

Configuration du serveur distant

Tester la connexion distante au serveur de base de données

# mysql -u admin -h <adresseDuServeur> -p<motDePasse>

Serveur Eolebase

Le serveur EOLE peut être l'un des modules ou un Eolebase.

Installer le paquet eole-adminer, le système de dépendance se charge d'installer les paquets nécessaires eole-web et eole-mysql :

root@eolebase:~# apt-eole install eole-adminer

Éditer le configuration du serveur à l'aide de la commande de l'interface de configuration du serveur :

root@eolebase:~# gen_config

Dans l'onglet t Applications web, la variable minimum à renseigner est Nom de domaine des applications web (sans http://), il est possible d'activer l'application Adminer et de la choisir comme application web par défaut.

Reconfigurer le serveur à l'aide de la commande reconfigure :

root@eolebase:~# reconfigure

Vérifier dans un navigateur web que le serveur répond.

Modifier le mot de passe par défaut du compte root mysql avec la commande mysql_pwd.py :

root@eolebase:~# mysql_pwd.py

## Réinitialisation des mots de passe Mysql ##

Nouveau mot de passe root mysql : eole21

Voulez-vous que les autres mots de passe soient modifiés ? [oui/non][non] : non

root@eolebase:~#

Se connecter à MySQL avec l'utilisateur root :

root@eolebase:~# mysql -u root -h localhost -peole21

Créer un utilisateur autre que root (le mot de passe du compte root est généré à chaque reconfigure) et lui donner les privilèges et l'autorisation de se connecter depuis le serveur hébergeant EoleDB :

mysql> grant all privileges on *.* to admin@<IPServeurEoleDB> identified by "eole21";

mysql> quit

Pour ouvrir le port il faut faire un dictionnaire personnalisé 00_mysql.xml à placer dans /usr/share/eole/creole/dicos/local/

1
<?xml version="1.0" encoding="utf-8"?>
2
<creole>
3
    <files>
4
        <service_access service='mysql'>
5
        <port>3306</port>
6
        <tcpwrapper>mysqld</tcpwrapper>
7
        </service_access>
8
    </files>
9
    <variables />
10
    <constraints />
11
    <help />
12
</creole>
13
<!-- vim: ts=4 sw=4 expandtab
14
-->

Pour qu'il soit pris en compte il faut procéder à la reconfiguration du serveur :

root@eolebase:~# reconfigure

Vérifier la connexion entre le serveur hébergeant EoleDB et le serveur Eolebase :

root@scribe:~# mysql -u admin -h <IPServeurEoleDB> -peole21

mysql>

Remarque

À partir de la version 2.6.1 il n'est plus nécessaire de procéder à l'ouverture de port à l'aide d'un dictionnaire. En effet, depuis cette version, l'onglet expert Mysql permet de déclarer des adresses IP ou des réseaux autorisés à accéder à MySQL.

Serveur non EOLE

Exemple d'une distribution GNU/Linux supportant le système de paquet debian.

Installation du serveur de base de données :

# apt-get install mysql-server

Se connecter à MySQL avec l'utilisateur root :

# mysql -u root -h localhost -p<motDePasse>

Créer un utilisateur autre que root (le mot de passe du compte root est généré à chaque reconfigure) et lui donner les privilèges et l'autorisation de se connecter depuis le serveur hébergeant EoleDB :

mysql> grant all privileges on *.* to admin@<IPServeurEoleDB> identified by "<motDePasse>";

mysql> quit

Vérifier la connexion entre le serveur hébergeant EoleDB et le serveur hébergeant la base de données :

root@scribe:~# mysql -u admin -h <IPServeurEoleDB> -peole21

mysql>

Appliquer la configuration EoleDB

Pour que les changements soient pris en compte il faut exécuter la commande eole_db_gen.

L'appel de cette commande eole_db_gen doit au minimum préciser le répertoire utilisé pour sauvegarder les fichiers modifiés par EoleDB avec l'option -b.

Exemple

1
root@scribe:~# eole_db_gen -b /var/backup/eole-db
2
TASKFREAK :
3
	>>> Passwords 	[OK]
4
	>>> Create  	  [OK]
5
  >>> Update  	  [OK]
6
root@scribe:~#

La commande utilise les fichiers de configuration par défaut d'eoleDB, mais il est possible de préciser d'autres fichiers de configuration :

  • -c : permet de définir un fichier de configuration a utiliser à la place de /etc/eole/eole-db.conf

  • -d : permet de définir un répertoire différent de /etc/eole/eole-db.d/ et qui contient les fichiers de configuration des applications

Truc & astuce

Pour connaître les différents paramètres de la commande eole_db_gen :

# eole_db_gen --help