Vous voulez brancher un client de bureau sur une base hébergée sur un serveur. La voie rapide - écouter sur toutes les adresses et ouvrir le port - met votre base face à internet tout entier, où les scanners la trouvent en quelques heures. Il y a mieux, et ce n'est pas plus long.

La bonne réponse : un tunnel SSH

ssh -N -L 3307:127.0.0.1:3306 sara@server.example.com

# then point the client at:
#   host 127.0.0.1   port 3307

La base continue de n'écouter que sur localhost, rien n'est ouvert dans le pare-feu, et la connexion est chiffrée par SSH. Tous les clients de bureau - TablePlus, DBeaver, Sequel Ace, MySQL Workbench - l'ont intégré sous forme d'option SSH.

Vérifier qu'elle n'est pas déjà exposée

sudo ss -tlnp | grep 3306
# 127.0.0.1:3306  good
# 0.0.0.0:3306    exposed
# /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1

S'il faut vraiment qu'elle soit joignable

Un serveur d'application dans un autre centre de données, par exemple. Alors : un réseau privé si l'hébergeur en propose un, une règle de pare-feu nommant l'adresse source exacte, un utilisateur restreint à cet hôte, et le TLS exigé.

sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp

CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY '...' REQUIRE SSL;
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'203.0.113.20';
Ne créez jamais un utilisateur avec le joker d'hôte : une autorisation pour 'app'@'%' veut dire depuis n'importe où sur la Terre. C'est de loin la cause la plus fréquente d'une base prise, et cela tient en un caractère.

Vérifier ce qui existe déjà

SELECT user, host FROM mysql.user ORDER BY host;

Toute ligne avec % dans la colonne hôte mérite une explication. Voyez utilisateurs et droits, sans en donner trop.