« PI MariaDB » : différence entre les versions

De knowledge
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
 
Ligne 211 : Ligne 211 :
mysql -uknowledge -p
mysql -uknowledge -p
</syntaxhighlight>en donnant le mot de passe défini plus haut.
</syntaxhighlight>en donnant le mot de passe défini plus haut.
=== Acces distant ===
Dans l'état actuel je n'ai défini qu'un accès local. Je voudrais accéder à ma base depuis un autre serveur, c'est même son rôle principal!
==== Configurer le serveur ====
Par défaut le serveur se "binde" sur localhost! On va changer ça:<syntaxhighlight lang="bash">
sudo sed -i.bak 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
</syntaxhighlight>on vérifie le contenu de <code>/etc/mysql/mariadb.conf.d/50-server.cnf</code>. On doit y trouver <code>0.0.0.0</code> et plus <code>127.0.0.1</code>:<syntaxhighlight lang="text">
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 0.0.0.0
</syntaxhighlight>on relance le serveur mariadb:<syntaxhighlight lang="bash">
sudo systemctl restart mariadb
</syntaxhighlight>On vérifie que le flux soit ouvert '''<big>côté client</big>''':<syntaxhighlight lang="bash">
nc -vz database 3306
</syntaxhighlight>Qui nous réponds :<syntaxhighlight lang="text">
database.pilan [10.11.11.10] 3306 (mysql) open
</syntaxhighlight>
=== Création du user ===
On se relogue en root (côté serveur):<syntaxhighlight lang="bash">
mysql -uroot -p
</syntaxhighlight>Et un crée un user pour un client sur un "host" distinct.<syntaxhighlight lang="mysql">
CREATE USER 'knowledge'@'myhost.pilan' IDENTIFIED BY 'SonMotDePasseFort';
GRANT ALL PRIVILEGES ON knowledge.* TO 'knowledge'@'myhost.pilan';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'knowledge'@'myhost.pilan';
</syntaxhighlight>On doit voir les droits de l'utilisateur:<syntaxhighlight lang="text">
+------------------------------------------------------------------------------------------------------------------+
| Grants for knowledge@main-host                                                                                  |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `knowledge`@`myhost` IDENTIFIED BY PASSWORD '*CAB86873A3353AAB303D78B3B4F73555D90B7A3D' |
| GRANT ALL PRIVILEGES ON `knowledge`.* TO `knowledge`@`main-host`                                                |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
</syntaxhighlight>Maintenant, depuis le client:<syntaxhighlight lang="bash">
mariadb -h database.pilan -P 3306 -u knowledge -p --protocol=TCP
</syntaxhighlight>Attention les noms de domaines doivent être "full qualified" <code>FQDN</code> aussi bien côté serveur que côté client. database comme raccourci de database.pilan pause parfois des problèmes.
{|
|[[Fichier:Attention.png|sans_cadre|75x75px]]
|Attention les noms de domaines doivent être "full qualified" aussi bien côté serveur que côté client. database comme raccourci de database.pilan pause parfois des problèmes.
|}

Version actuelle datée du 15 janvier 2026 à 00:13

On commence par créer une carte SD avec le dernier Raspberry OS, sans le "desktop", sans réseau WLAN et avec un user admin qui accepte une clé du serveur front-router.

On lui donnera le nom database

On le déclare en IP fixe sur le routeur.

On branche la carte SD sur le serveur et on le lance.

Installation de base

Depuis le routeur on copie le fichier : basic-install.sh

scp basic-install.sh database:.

Normalement le mot de passe n'est pas demandé. Si c'est le cas c'est que la bonne clé n'a pas été donnée au moment de la création de la carte SD de boot. On se logue sur le serveur:

ssh database

On lance le script :

basic-install.sh

Ca réalise les MAJ apparue depuis la création de l'image SD utilisée (pas grand chose à faire si la carte SD a été crée quelques minutes avant). Une clé est crée (par exemple):

The key fingerprint is:
SHA256:AiJTDFesFI0zGL+Of7RIpKs2BIeJ1g+5TruVrDoy+TY admin@database
The key's randomart image is:
+---[RSA 4096]----+
|o=+*.            |
|.+* o            |
|++++poui         |
|=++* .           |
|o+. + . D        |
|.+.oo..+         |
|o++o.=           |
|==Eo=            |
|==*=.            |
+----[SHA256]-----+
----------------------------------------------------------
-- public key to copy on git server ----------------------
----------------------------------------------------------
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCoff9D17Q9BDqVZP7cAZQZerRVOUSKwgEMUhOaArZxJWWEHACnRlMylRKiWqpjCYZBqB
vB3faayoAcN60AYS6cer7gwnTNY0VFC/LnfwnNFNaroO9HD9Ardrz7RQZtyQrW/xx8n2e6KwyfnGyjjLLQH08uOyfQXVo5NvEt+T5YdaP/
4jH+UYvI7pTAZz681FnT3NlE+wdl9HtjGI+s7c71eBqKUImMkxDIHFvvJFWL1WDnCYWL8qImLrVJ/aFdL5XATeDrncm3HFKqTBdP8sVjsn
nzCFGHGbEmM501dR4meKd+ORD05y//kX0T49XYzasdJtmzeiUz7Zbby7uMly5hkP5VovC46Pga+R2RbT3h4dILo78cQUlN2onc1Vl0+HVW
hkVJxkmRjASUraaGeFKjjK8mgzDHJy8NDt4N/xeE50Z8/mD1kZikO+5cIH+w5dGdf0yZmmNCvhMKxYzbmN08NCFdU6YWt1TziMHhHKjPi3
yfj4Yb1aui5FgJrBvQiy1/62LW7E5sTls+iOWlx6rEgFN7vad8obsjdmNErUACDJ216qwWdg69eFYVeR1BWVKGnhSa+lNmWtoWNHw5Q41L
qD1TlouWbdd8JZeJMrVT0DyXksQvdUXzuTF7/vsVFfI5n4LQgzCQj3dlJY21ibGf57+Ia4i9nvAOWPQ== admin@database
----------------------------------------------------------
Type <Return>

Il faut ajouter cette clé (de ssh-rsa jusqu'à admin@database) dans le .ssh/authorized_keys du user utilisée sur le serveur git.

Et on appuie sur return (Entrée)

Ca crée un dépôt local de notre repo "config" et ça crée un user remote avec peu de droits qui sera utilisé par les robots de collectes d'informations.

Cloning into 'config'...
The authenticity of host 'git.pilan (10.11.11.xx)' can't be established.
ED25519 key fingerprint is SHA256:3xkMU7nO7mr5wodfjUytf56glFu40dWMyAdWHB8yYl8.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'git.pilan' (ED25519) to the list of known hosts.
remote: Enumerating objects: 71, done.
remote: Counting objects: 100% (71/71), done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 71 (delta 28), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (71/71), 9.20 KiB | 1.84 MiB/s, done.
Resolving deltas: 100% (28/28), done.
[OK] Common env is OK
[OK] Utilisateur absent
[OK] Path /home/remote not already exists
[OK] Execution useradd
[OK] User remote created
[OK] Execution mkdir
[OK] Execution chown
[OK] chmod home dir
[OK] Create .ssh
[OK] chown .ssh
[OK] Creation .ssh/authorized_keys
[OK] chown .ssh/authorized_keys
[OK] chmod .ssh/authorized_keys
[OK] add router key

Comme on se connecte pour la première fois au serveur git ca demande une confirmation. On réponds yes.

Le reste se déroule normalement et on ne dois avoir que des [OK]verts.

Installation du moteur de base de donnée

sudo apt install -y mariadb-server

Et c'est fait !

En revanche si on tente d'utiliser la base:

mariadb
ERROR 1698 (28000): Access denied for user 'admin'@'localhost'

Aucun utilisateur n'existe donc... on ne peut pas l'utiliser. On remarque qu'en tant que root, ça marche :

sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 10.11.11-MariaDB-0+deb12u1 Debian 12

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Ca marche mais c'est pas comme ça que ça devrait être pour avoir une sécurité correcte!

Changement du file system de la base

Moi j'ai un disque externe que je veux utiliser. Il est reconnu comme /dev/sda1.

On rajoute une ligne a /etc/fstab

/dev/sda1   /mnt/disk   ext4   defaults   0   2

On reboote la machine pour vérifier que le volume se monte bien et on teste:

admin@database:~ $ df -h /mnt/disk/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       464G  169G  272G  39% /mnt/disk

Dans mon cas y'avait déjà des choses sur le disque mais y'a plus de 60% soit 272 Go de libre. Maintenant on crée un répertoire sur le disque et on y copie ce qui était sur

sudo mkdir /mnt/disk/mariadb
# stop the database server
sudo systemctl stop mariadb
# copy files to external drive
sudo rsync -av /var/lib/mysql/ /mnt/disk/mariadb/
# backup the old directory
sudo mv /var/lib/mysql /var/lib/mysql.bak
# create the symbolic link
sudo ln -s /mnt/disk/mariadb /var/lib/mysql
# restart database
sudo systemctl start mariadb

La base de donnée tourne de nouveau sur /mnt/disk/mariadb.

Configuration

Sécurisation

sudo mariadb

Et on lance les commandes Modification du user root.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyPassword';
FLUSH PRIVILEGES;

Ne pas oublier de changer le mot de passe! Supprimer les utilisateurs anonymes

DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

Désactiver l’accès root distant

DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
FLUSH PRIVILEGES;

Supprimer la base de test

DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;

Vérifier les privilèges:

SELECT Host, User FROM mysql.user;

Qui doit donner :

+-----------+-------------+
| Host      | User        |
+-----------+-------------+
| localhost | mariadb.sys |
| localhost | mysql       |
| localhost | root        |
+-----------+-------------+
3 rows in set (0.004 sec)

Test de connexion

mysql -uroot -p

qui nous demande le mot de passe définit par IDENTIFIED BY 'MyPassword'. et on se retrouve logué root.

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 33
Server version: 11.8.3-MariaDB-0+deb13u1 from Debian -- Please help get to 10k stars at https://github.com/MariaDB/Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Plus besoin de sudo!

Création d'une base de données

On commence pas se connecter:

mysql -uroot -p

On crée la base et l'utilisateur local:

CREATE DATABASE knowledge;
CREATE USER 'knowledge'@'localhost' IDENTIFIED BY 'TonMotDePasseFort';
GRANT ALL PRIVILEGES ON knowledge.* TO 'knowledge'@'localhost';
FLUSH PRIVILEGES;

On vérifie:

SHOW GRANTS FOR 'knowledge'@'localhost';

Qui doit donner:

+------------------------------------------------------------------------------------------------------------------+
| Grants for knowledge@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `knowledge`@`localhost` IDENTIFIED BY PASSWORD '*B1EA1B640CBFC27583E12EACE83AC99E8E621665' |
| GRANT ALL PRIVILEGES ON `knowledge`.* TO `knowledge`@`localhost`                                                 |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.001 sec)

On teste la connexion par :

mysql -uknowledge -p

en donnant le mot de passe défini plus haut.

Acces distant

Dans l'état actuel je n'ai défini qu'un accès local. Je voudrais accéder à ma base depuis un autre serveur, c'est même son rôle principal!

Configurer le serveur

Par défaut le serveur se "binde" sur localhost! On va changer ça:

sudo sed -i.bak 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf

on vérifie le contenu de /etc/mysql/mariadb.conf.d/50-server.cnf. On doit y trouver 0.0.0.0 et plus 127.0.0.1:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 0.0.0.0

on relance le serveur mariadb:

sudo systemctl restart mariadb

On vérifie que le flux soit ouvert côté client:

nc -vz database 3306

Qui nous réponds :

database.pilan [10.11.11.10] 3306 (mysql) open

Création du user

On se relogue en root (côté serveur):

mysql -uroot -p

Et un crée un user pour un client sur un "host" distinct.

CREATE USER 'knowledge'@'myhost.pilan' IDENTIFIED BY 'SonMotDePasseFort';
GRANT ALL PRIVILEGES ON knowledge.* TO 'knowledge'@'myhost.pilan';
FLUSH PRIVILEGES;

SHOW GRANTS FOR 'knowledge'@'myhost.pilan';

On doit voir les droits de l'utilisateur:

+------------------------------------------------------------------------------------------------------------------+
| Grants for knowledge@main-host                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `knowledge`@`myhost` IDENTIFIED BY PASSWORD '*CAB86873A3353AAB303D78B3B4F73555D90B7A3D' |
| GRANT ALL PRIVILEGES ON `knowledge`.* TO `knowledge`@`main-host`                                                 |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

Maintenant, depuis le client:

mariadb -h database.pilan -P 3306 -u knowledge -p --protocol=TCP

Attention les noms de domaines doivent être "full qualified" FQDN aussi bien côté serveur que côté client. database comme raccourci de database.pilan pause parfois des problèmes.

Attention.png Attention les noms de domaines doivent être "full qualified" aussi bien côté serveur que côté client. database comme raccourci de database.pilan pause parfois des problèmes.