MaDoVi - Le wiki

Machines - Données - Virtualisation

Outils pour utilisateurs

Outils du site


services:autres:tuto:mariadb_tuto1

MariaDB - Serveur de base de données

Dans le cadre du projet , ce service propose un SGBD, destiné en particulier à offrir cet outil à d'autres services qui pourraient l'utiliser: Nextcloud par exemple, ou bien la base de données partagée avec tous les lecteurs Kodi de la maison…

On va positionner ce composant au sein d'un container LXC, ce qui correspond au schéma plus global proposé dans ce paragraphe.

On installera ensuite le service web Adminer pour le gérer.

Les manipulations listées ci-dessous pourront s'appliquer dans un environnement Linux quelconque – aux commandes près propres à la distribution choisie – une fois qu'on est à l'intérieur du CT. Vous pouvez ainsi ignorer les mentions au container si vous ne travaillez pas dans ce contexte, le reste demeure applicable…


1. Création du container LXC

On souhaite donc installer notre serveur de bases de données dans un CT LXC. Ce container sera «non privilégié», et on va donc le créer depuis le compte admin. On va mettre, comme pour beaucoup de CT LXC, la distribution Alpine Linux, qui a une très faible empreinte système: «Les cibles principales d'Alpine sont les conteneurs et presque tous les appareils embarqués».

Mais au préalable, on va créer un dossier destiné à recevoir les fichiers de données du SGBD dans le système RAID qui sera plus sûr: en effet, autant on peut recréer facilement la partie applicative de MariaDB en cas de crash du disque, autant les données de la base seront mieux “sécurisées” sur le RAID 5, justement défini pour recevoir les data (et même si ceci ne remplace pas une sauvegarde !).

Ainsi donc:

  • Définition d'une cible data dans l'espace RAID:
    $ sudo mkdir -p /mnt/raid_data/datasys/lxc-mariadb/data
  • Les propriétaire/groupe sont les {u,g}id des CT “non privilégiés” que vous trouvez dans le fichier de configuration:
    $ cat ~/.config/lxc/default.conf 
    .....
    # Ajout {g,u}id pour containers "unprivileged"
    lxc.idmap = u 0 231072 65536
    lxc.idmap = g 0 231072 65536
    .....

    Ainsi, l'affectation du propriétaire correspond ici à la commande suivante:

    $ sudo chown -R 231072:231072 /mnt/raid_data/datasys/lxc-mariadb
  • Création du CT:
    admin@wasabi:~$ lxc-create -n lxc-mariadb -t download -- -d alpine -r 3.11 -a amd64
  • Édition du fichier de configuration et définition d'un montage à l'intérieur du CT correspondant au dossier qu'on vient de définir:
    $ nano $(lxc-config lxc.lxcpath)/lxc-mariadb/config
    ...
    # Montage de l'espace des data sur le RAID dans le CT
    lxc.mount.entry = /mnt/raid_data/datasys/lxc-mariadb/data var/lib/mysql none defaults,bind,uid=0,create=dir 0 0
  • Lancement:
    admin@wasabi:~$ lxc-start -n lxc-mariadb 
  • Contrôle:
    admin@wasabi:~$ lxc-ls -f
    NAME        STATE   AUTOSTART GROUPS   IPV4      IPV6 UNPRIVILEGED 
    lxc-mariadb RUNNING 1                  10.0.3.3  -    true         

    Il tourne, il a l'adresse attendue, il est bien unprivileged.


2. Préparation & Installation

On commence par s'«attacher» au container pour faire ce qu'on a à faire dedans:

admin@wasabi:~$ lxc-attach -n lxc-mariadb 
/ # 

Les ajouts/installations/configurations de base: outils, ssh, MariaDB (l'outil de gestion de paquets s'appelle apk sous Alpine).

  • Commençons par les outils:
    / # /sbin/apk update
    / # /sbin/apk add attr dialog dialog-doc bash bash-doc bash-completion grep grep-doc
    / # /sbin/apk add util-linux util-linux-doc pciutils usbutils binutils findutils readline
    / # /sbin/apk add man man-pages lsof lsof-doc less less-doc nano nano-doc curl curl-doc
    / # /sbin/apk add sudo sudo-doc openssh 
    / # export PAGER=less
  • On prend bash comme interpréteur de commandes: il suffit de remplacer, dans le fichier /etc/passwd la fin de la ligne associée au compte root (la 1ière) par celle-ci (ash devient bash):
    # nano /etc/passwd
     
    root:x:0:0:root:/root:/bin/bash
    ...

    Ctrl+x et y pour enregistrer et sortir.

  • Lancer le service ssh (et l'ajouter au démarrage du container):
    / # /sbin/rc-update add sshd
    / # /etc/init.d/sshd start
    ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 
     * Starting sshd ...                                        [ ok ]
  • Ajout d'un utilisateur «monusr» (changer pour votre login à vous) avec droit root (sudo):
    / # /usr/sbin/adduser monusr
    Changing password for monusr
    New password: 
    Retype password: 
    passwd: password for monusr changed by root
     
    / # /usr/sbin/visudo
    ## ajouter la ligne suivante (attention: VI - i pour insérer, esc + :w (sauver) + :q (quitter))
    ##                                                               
    ## User privilege specification
    ##
    root ALL=(ALL) ALL       
    monusr ALL=(ALL) ALL   ## <<<=== ICI

    :!: Attention: éditeur VI i pour insérer, Esc puis :w pour enregistrer les modifications et :q pour quitter.

  • On lève un truc bizarre dans l'utilisation de sudo: il nous colle un setrlimit(RLIMIT_CORE): Operation not permitted à chaque utilisation… Pour l'éviter, on crée un fichier de config avec le contenu suivant (trouvé sur le web, pas tout compris mais ça marche…):
    / # nano /etc/sudo.conf
    Set disable_coredump false
  • On redémarre pour prise en compte, du coup on sort et on se retrouve avec le shell du serveur:
    / # /sbin/reboot
    admin@wasabi:~$
  • On va maintenant travailler à partir d'une connexion ssh:
    admin@wasabi:~$ ssh monusr@lxc-mariadb
    ## accepter l'échange de clé
    monusr@lxc-mariadb's password: 
    Welcome to Alpine!
     
    The Alpine Wiki contains a large amount of how-to guides and general
    information about administrating Alpine systems.
    See <http://wiki.alpinelinux.org/>.
     
    You can setup the system with the command: setup-alpine
     
    You may change this message by editing /etc/motd.
    lxc-mariadb:~$
  • On se positionne en root pour toutes les manip. à suivre (vous aurez droit au message de mise en garde à la première utilisation de sudo):
    lxc-mariadb:~$ sudo -i
     
    We trust you have received the usual lecture from the local System
    Administrator. It usually boils down to these three things:
     
        #1) Respect the privacy of others.
        #2) Think before you type.
        #3) With great power comes great responsibility.
     
    [sudo] password for admin: 
    lxc-mariadb:~# 

    Notez le changement de $ à #: on est bien administrateur dans notre container.

  • On fixe le fuseau horaire:
    lxc-mariadb:~# setup-timezone -z Europe/Paris
  • On installe les paquets MariaDB :
    lxc-mariadb:~# apk add mariadb mariadb-client

Maintenant, on va configurer tout cela.


3. Configuration

La configuration du SGBD va passer ici par la définition de variables qu'on va utiliser ensuite pour fixer des paramètres.

  • On définit ainsi, que vous adapterez à vos souhaits:
    ## Définition de variables pour installation - adaptez les valorisations...
    DB_DATA_PATH="/var/lib/mysql"     ## Va donc pointer sur notre montage sur le RAID à l’intérieur de LXC
    DB_ROOT_PASS="mariadb_root_password"
    DB_USER="mariadb_user"
    DB_PASS="mariadb_user_password"
    MAX_ALLOWED_PACKET="200M"         ## Pas trouver où ça se trouve cette config. ...
  • Installation:
    lxc-mariadb:~# mysql_install_db --user=mysql --datadir=${DB_DATA_PATH}
  • Définition du service:
    lxc-mariadb:~# rc-service mariadb start
    ## Le lancer au démarrage
    lxc-mariadb:~# rc-update add mariadb default
  • Fixer le mot de passe root:
    lxc-mariadb:~# mysqladmin -u root password "${DB_ROOT_PASS}"
  • Fixer nouvel utilisateur, suppression de données pour sécurisation:
    echo "GRANT ALL ON *.* TO ${DB_USER}@'127.0.0.1' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;" > /tmp/sql
    echo "GRANT ALL ON *.* TO ${DB_USER}@'localhost' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;" >> /tmp/sql
    echo "GRANT ALL ON *.* TO ${DB_USER}@'::1' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;" >> /tmp/sql
    echo "GRANT ALL ON *.* TO ${DB_USER}@'%' IDENTIFIED BY '${DB_PASS}' WITH GRANT OPTION;" >> /tmp/sql
    echo "DELETE FROM mysql.user WHERE User='';" >> /tmp/sql
    echo "DROP DATABASE test;" >> /tmp/sql
    echo "FLUSH PRIVILEGES;" >> /tmp/sql
    cat /tmp/sql | mysql -u root --password="${DB_ROOT_PASS}"
    rm /tmp/sql
  • Ouverture sur le réseau:
    lxc-mariadb:~# sed -i "s|skip-networking|#skip-networking|g" /etc/my.cnf.d/mariadb-server.cnf
    lxc-mariadb:~# sed -i "s|#bind-address=0.0.0.0|bind-address=0.0.0.0|g" /etc/my.cnf.d/mariadb-server.cnf

4. Quelques compléments

☛ Démarrage avec l'hôte

Si vous souhaitez éviter de faire «à la main» le lancement du container après chaque arrêt/relance du serveur, il suffit de modifier la configuration du container en ajoutant ou dé-commentant les lignes suivantes en éditant le fichier de configuration du CT:

$ nano $(lxc-config lxc.lxcpath)/lxc-mariadb/config
lxc.group = onboot
lxc.group = dataserver
lxc.start.auto = 1

Pour autant que vous ayez suivi la partie “autostart:” dans la configuration des containers «non privilégiés»

☛ NATer - Ouvrir les accès

Dans la configuration ci-dessus, MariaDB est prêt pour recevoir des requêtes depuis le réseau sur le port 3306. Mais il s'agit du réseau auquel il appartient, à savoir le réseau de containers LXC en 10.0.3.x.

Si l'on souhaite qu'il soit accessible sur le réseau local de notre installation, il va falloir que l'hôte expose un port sur le réseau via la commande iptables. Elle peut prendre les formes suivantes:

Ouvrir & fermer et Voir les @:ports NATés:

Terminal
Ouvrir:
sudo iptables -t nat -A PREROUTING -p tcp -i <interface> --dport <portHost> -j DNAT --to-destination <@IP:Port Destination>
Exemple:
sudo iptables -t nat -A PREROUTING -p tcp -i br0 --dport 63306 -j DNAT --to-destination 10.0.3.3:3306
 
Fermer:
sudo iptables -t nat -D PREROUTING -p tcp -i <interface> --dport <portHost> -j DNAT --to-destination <@IP:Port Destination>
Exemple:
sudo iptables -t nat -D PREROUTING -p tcp -i br0 --dport 63306 -j DNAT --to-destination 10.0.3.3:3306
 
Liste:
sudo iptables -t nat -L
sudo iptables -t nat -S

Par défaut, on n'ouvre pas cet accès ici:

  • On va proposer l'outil web Adminer, un équivalent de PhpMyAdmin;
  • Les applications utilisatrices seront elles aussi sur le serveur en tant que CT: elles auront ainsi un accès direct au SGBD…

Mais la possibilité reste ouverte selon les besoins (par ex. accès par un tableur Excel/Calc depuis votre poste de travail…) d'ouvrir l'accès sur le réseau, soit par l'ouverture d'un port dédié comme indiqué ci-dessus via iptables, soit encore en configurant le CT pour une ouverture sur le LAN (cf. Containers LXC - Config réseau ).

services/autres/tuto/mariadb_tuto1.txt · Dernière modification: 26/03/2020 00:01 de Cram28