Méthodes de surveillance des connexions et de l'activité MySQL

L'analyse des flux de connexion et des requêtes exécutées sur une instance MySQL est une tâche courente pour le diagnostic de performance ou l'audit de sécurité. Il existe principalement deux approches pour capturer ces informations sur une période donnée : l'activation des journaux internes du serveur ou l'interception des paquets réseau.

1. Utilisation du Genarel Query Log

Le general_log est un mécanisme natif de MySQL qui enregistre chaque connexion client et chaque instruction SQL reçue par le serveur. Bien que très complet, il doit être utilisé avec prudence en production en raison de l'impact potentiel sur les performances disque.

Activation du journal

Il est possible d'activer cette fonctionnalité dynamiquement sans redémarrer le service :

SET GLOBAL general_log = 'ON';
-- Optionnellement, définir le format de sortie (FILE ou TABLE)
SET GLOBAL log_output = 'FILE';

Exemple de capture d'activité

Imaginons une série d'opérations effectuées par un utilisateur sur une base nommée inventory_db :

-- Connexion et manipulation de données
USE inventory_db;
SELECT item_name FROM products WHERE stock_count < 10;
UPDATE products SET stock_count = stock_count + 5 WHERE id = 101;

Le fichier de log (généralement situé dans le répertoire des données avec l'extension .log) affichera des entrées structurées comme suit :

2023-10-25T10:15:01.123456Z   12 Connect   admin@192.168.1.50 on inventory_db using TCP/IP
2023-10-25T10:15:05.654321Z   12 Query     SELECT item_name FROM products WHERE stock_count < 10
2023-10-25T10:15:10.987654Z   12 Query     UPDATE products SET stock_count = stock_count + 5 WHERE id = 101
2023-10-25T10:15:15.112233Z   12 Quit

2. Analyse par interception réseau (MySQL Sniffer)

Une alternative moins intrusive pour le moteur de base de données consiste à utiliser un outil de "sniffing". MySQL Sniffer, développé par l'équipe de Qihoo360, permet de capturer les requêtes en temps réel en écoutant l'interface réseau.

Prérequis et installation

L'outil nécessite plusieurs bibliothèques de développement pour la capture de paquets et la gestion du processeur :

# Installation des dépendances sur un système basé sur Yum
yum install gcc gcc-c++ cmake libpcap-devel glib2-devel libnet-devel -y

# Compilation de l'outil
git clone https://github.com/Qihoo360/mysql-sniffer.git
cd mysql-sniffer
mkdir build && cd build
cmake ../
make

Options principales de la commande

Une fois compilé, l'exécutable se trouve dans le dossier bin. Voici les paramètres essentiels :

  • -i : Spécifie l'interface réseau (ex: eth0).
  • -p : Définit les ports à écouter (ex: 3306,3307).
  • -l : Répertoire de destination pour les logs.
  • -d : Mode démon pour une exécution en arrière-plan.

Test de capture en temps réel

Pour observer l'activité d'un port spécifique directement sur la console :

./mysql-sniffer -i eth0 -p 3306

Si un client exécute des commandes, l'outil formatera la sortie avec des métriques précises :

# Temps | Utilisateur | IP Source | Base de données | Latence | Lignes retournées | Requête
2023-10-25 14:20:01  app_user  192.168.1.100  sales_prod  2ms   15   SELECT * FROM orders LIMIT 10
2023-10-25 14:20:05  app_user  192.168.1.100  sales_prod  12ms  0    INSERT INTO logs (event) VALUES ('login')

Exportation vers un fichier

Pour archiver l'activité sur une période prolongée, il est préférable d'écrire dans un fichier :

./mysql-sniffer -i eth0 -p 3306 -l /var/log/mysql_capture/

Note technique : L'efficacité de l'interception réseau peut varier avec MySQL 8.0 si l'authentification native ou le chiffrement TLS est activé, car le sniffer pourrait ne pas déchiffrer le contenu des paquets sans les clés appropriées.

Étiquettes: MySQL database-administration Network-Sniffing SQL-Audit Performance-Monitoring

Publié le 28 juin à 21h03