« PI MariaDB » : différence entre les versions
| (2 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 38 : | Ligne 38 : | ||
-- public key to copy on git server ---------------------- | -- public key to copy on git server ---------------------- | ||
---------------------------------------------------------- | ---------------------------------------------------------- | ||
ssh-rsa | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCoff9D17Q9BDqVZP7cAZQZerRVOUSKwgEMUhOaArZxJWWEHACnRlMylRKiWqpjCYZBqB | ||
vB3faayoAcN60AYS6cer7gwnTNY0VFC/LnfwnNFNaroO9HD9Ardrz7RQZtyQrW/xx8n2e6KwyfnGyjjLLQH08uOyfQXVo5NvEt+T5YdaP/ | vB3faayoAcN60AYS6cer7gwnTNY0VFC/LnfwnNFNaroO9HD9Ardrz7RQZtyQrW/xx8n2e6KwyfnGyjjLLQH08uOyfQXVo5NvEt+T5YdaP/ | ||
4jH+UYvI7pTAZz681FnT3NlE+wdl9HtjGI+s7c71eBqKUImMkxDIHFvvJFWL1WDnCYWL8qImLrVJ/aFdL5XATeDrncm3HFKqTBdP8sVjsn | 4jH+UYvI7pTAZz681FnT3NlE+wdl9HtjGI+s7c71eBqKUImMkxDIHFvvJFWL1WDnCYWL8qImLrVJ/aFdL5XATeDrncm3HFKqTBdP8sVjsn | ||
| Ligne 82 : | Ligne 81 : | ||
</syntaxhighlight>Comme on se connecte pour la première fois au serveur git ca demande une confirmation. On réponds yes. | </syntaxhighlight>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 <code>[OK]</code>. | Le reste se déroule normalement et on ne dois avoir que des <code>[OK]</code>verts. | ||
== Installation du moteur de base de donnée == | == Installation du moteur de base de donnée == | ||
| Ligne 139 : | Ligne 138 : | ||
</syntaxhighlight>Et on lance les commandes | </syntaxhighlight>Et on lance les commandes | ||
Modification du user root.<syntaxhighlight lang="mysql"> | Modification du user root.<syntaxhighlight lang="mysql"> | ||
| Ligne 172 : | Ligne 171 : | ||
3 rows in set (0.004 sec) | 3 rows in set (0.004 sec) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Test de connexion === | |||
<syntaxhighlight lang="bash"> | |||
mysql -uroot -p | |||
</syntaxhighlight>qui nous demande le mot de passe définit par <code>IDENTIFIED BY 'MyPassword'</code>. | |||
et on se retrouve logué root.<syntaxhighlight lang="text"> | |||
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)]> | |||
</syntaxhighlight>Plus besoin de sudo! | |||
== Création d'une base de données == | |||
On commence pas se connecter:<syntaxhighlight lang="bash"> | |||
mysql -uroot -p | |||
</syntaxhighlight>On crée la base et l'utilisateur local:<syntaxhighlight lang="mysql"> | |||
CREATE DATABASE knowledge; | |||
CREATE USER 'knowledge'@'localhost' IDENTIFIED BY 'TonMotDePasseFort'; | |||
GRANT ALL PRIVILEGES ON knowledge.* TO 'knowledge'@'localhost'; | |||
FLUSH PRIVILEGES; | |||
</syntaxhighlight>On vérifie:<syntaxhighlight lang="mysql"> | |||
SHOW GRANTS FOR 'knowledge'@'localhost'; | |||
</syntaxhighlight>Qui doit donner:<syntaxhighlight lang="text"> | |||
+------------------------------------------------------------------------------------------------------------------+ | |||
| 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) | |||
</syntaxhighlight>On teste la connexion par :<syntaxhighlight lang="bash"> | |||
mysql -uknowledge -p | |||
</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 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. |