Sie wollen ein Desktop-Programm mit einer Datenbank auf einem Server verbinden. Der schnelle Weg - an alle Adressen binden und den Port öffnen - stellt Ihre Datenbank vor das ganze Internet, wo Scanner sie binnen Stunden finden. Es gibt einen besseren Weg, der nicht länger dauert.

Die richtige Antwort: ein SSH-Tunnel

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

Die Datenbank lauscht weiterhin nur auf localhost, in der Firewall wird nichts geöffnet, und die Verbindung verschlüsselt SSH. Jedes Desktop-Programm - TablePlus, DBeaver, Sequel Ace, MySQL Workbench - hat das als SSH-Option eingebaut.

Sicherstellen, dass sie nicht schon offen liegt

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

Wenn sie wirklich erreichbar sein muss

Etwa ein Anwendungsserver in einem anderen Rechenzentrum. Dann: ein privates Netz, wenn der Anbieter eines hat, eine Firewallregel mit der genauen Quelladresse, ein auf diesen Host beschränkter Benutzer und erzwungenes TLS.

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';
Legen Sie nie einen Benutzer mit dem Host-Platzhalter an - eine Berechtigung für 'app'@'%' heißt: von überall auf der Welt. Es ist die mit Abstand häufigste Ursache dafür, dass eine Datenbank übernommen wird, und es ist ein einziges Zeichen.

Prüfen, was schon existiert

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

Jede Zeile mit % in der Host-Spalte verdient eine Erklärung. Siehe Benutzer und Rechte, ohne zu viel zu geben.