Consigner les tentatives de connexion MySQL


25

De temps en temps, des tentatives de connexion échouent sur notre serveur de production MySQL (le tableau de bord MySQL nous alerte). Existe-t-il un moyen de consigner chaque réussite et échec de connexion au serveur MySQL sans l'activer general_log?

Nous pensons que ce general_logn'est pas une option car c'est un serveur de production avec une charge élevée.



Selon le responsable de mysql: As of MySQL 5.5.28, MySQL Enterprise Edition includes MySQL Enterprise Audit, implemented using a server plugin named audit_log. seule la version entreprenante en est dotée.
Tiina

Réponses:


20

juste pour informer le curieux: creusez dans votre journal des erreurs et hop!

(1). modifier my.cnf (documentation des paramètres trouvée ici )

[mysqld]

: #Entrez un nom pour le fichier journal des erreurs. Sinon, un nom par défaut sera utilisé.

log_error = / var / log / mysql / error

: #defaults to 1. Si la valeur est> 1, les connexions abandonnées et les erreurs d'accès refusé pour les nouvelles tentatives de connexion sont écrites dans le journal des erreurs

log_warnings = 2

...

(2). lors de l'exécution de la commande

$ sudo cat /var/log/mysql/error.err | egrep '[aA] ccess refusé'

(3). et vous l'avez!

(4). si vous devez restreindre l'utilisateur (attaque DOS ou tentative de récupération de mot de passe utilisateur mysql dans une base de données multi-utilisateurs), alors ( http://dev.mysql.com/doc/refman/5.5/en/user-resources.html )

mysql> GRANT USAGE ON *. * À 'attaquant' @ 'localhost' AVEC MAX_CONNECTIONS_PER_HOUR 100;

pour limiter à seulement 100 tentatives de récupération de mot de passe par heure.


2

Je pense que le journal général peut consigner toutes les tentatives de connexion (succès et échec) entre beaucoup d'autres choses. Le principal problème est que le journal général affectera les performances de votre base de données. Vous pouvez activer le journal général avec la requête

SET GLOBAL general_log = 'on'

pour les nouvelles versions de MySQL.


C'est temporaire ou permanent?, Si c'est temporaire cela signifie que j'ai besoin de modifier /etc/mysql/my.cnfmysql?
DarckBlezzer

C'est temporaire. Cette approche peut fonctionner, ou vous pouvez ajouter --general-logdes indicateurs lorsque vous démarrez MySQL.
rmc00

1

Salut, je ne pense pas que ce soit possible.

Depuis mysql 5.1.29 - vous pouvez spécifier l'option de stockage (table ou fichier) et l'emplacement et le journal que vous souhaitez - erreur, requête générale, binaire ou lente. Pour autant que je sache - vous ne pouvez pas spécifier le format du journal ou ce qui est enregistré. Je peux me tromper - mais je pense que toutes les tentatives de connexion seront enregistrées dans le journal général, et non l'erreur.

Cependant, en supposant que votre serveur mysql fonctionne sur une machine distincte, à partir de votre serveur d'application, et que vous avez besoin du port 3306 (ou autre) ouvert et que vous ne pouvez pas utiliser le tunnel ssh, votre serveur mysql ne devrait toujours pas être accessible par quiconque le voudra- nilly. Je recommande fortement de ne pas l'exposer au trafic Web, et si vous devez (comme dans le cas où résider quelque part pas derrière votre pare-feu) le lier à l'adresse IP ou au bloc IP de votre serveur d'applications et à votre IP d'accès administrateur (où vous êtes accès depuis)

J'espère que ça t'as aidé.


1

On peut se connecter connectet quitcommander en utilisant mysql-audit-plugin.

  1. Trouvez la bonne version de la version mysql-audit-plugin , j'ai utilisé mysql 5.7, donc j'ai utilisé audit-plugin-percona-5.7-1.1.7-805-linux-x86_64.zip.
  2. déplacer le sofichier téléchargé à l'endroit indiqué par mysqladmin variables | grep plugin_dir.
  3. mysql>install plugin audit soname 'libaudit_plugin.so'
  4. en activant la fonction de journal mysql>set global audit_json_file=ON, par défaut, il enregistre toutes les opérations réussies. en le paramétrant, set global audit_record_cmds='quit,connect'il se connecte uniquement et se ferme, je suppose, selon la configuration de mysql-audit-plugin .

Voici à quoi cela ressemble dans le fichier pour la connexion et la déconnexion:

{"msg-type":"activity","date":"1543740612328","thread-id":"1015112","query-id":"3045222","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11575","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Quit","query":"Quit"} 

{"msg-type":"activity","date":"1543740724627","thread-id":"1015113","query-id":"0","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Connect","query":"Connect"}
{"msg-type":"activity","date":"1543740724629","thread-id":"1015113","query-id":"3045223","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"rows":"1","status":"0","cmd":"select","query":"select @@version_comment limit 1"}

0

si le serveur en question ne devrait pas avoir de connexions externes, comme configuré, je serais inquiet à propos d'une sorte d'attaque contre votre serveur d'applications, à moins que les connexions échouées proviennent de nouvelles applications en cours de déploiement avant que l'utilisateur / pass ait été configuré.

si le serveur est en quelque sorte exposé à des connexions externes sur 3306, à moins que cela ne soit intentionnel et nécessaire, je définirais la configuration comme l'a dit Nick, et j'essaierais également d'utiliser iptables pour restreindre le trafic à 3306 uniquement à partir de vos serveurs d'applications.


MySQL refuse automatiquement les connexions depuis l'adresse IP qui n'ont pas au moins une ligne correspondante dans mysql.user
David M

0

Sur http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/ , l'auteur montre une méthode pour capturer les paquets à l'aide de tcpdump et filtrer la sortie en fonction de la chaîne.

Cela contourne vos préoccupations concernant le journal général et les performances, bien que tcpdump puisse lui-même encourir une pénalité de performance mineure. Cette solution enregistrera également moins de données que le journal général des requêtes.

Je ne l'ai pas utilisé moi-même, mais cela semble très utile.


Sonne bien, mais le lien ne fonctionne pas pour moi.
CarlosH

Le lien fonctionne pour moi ce matin, en utilisant Firefox. mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging
Stefan Lasiewski

Et je serais intéressé à entendre votre expérience avec cela.
Stefan Lasiewski
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.