Le serve collegare un client da scrivania a un database su un server. La via rapida - mettersi in ascolto su tutti gli indirizzi e aprire la porta - piazza il suo database davanti a tutta internet, dove gli scanner lo trovano nel giro di ore. C'è un modo migliore e non più lungo.

La risposta giusta: 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

Il database continua ad ascoltare soltanto su localhost, nel firewall non si apre nulla, e la connessione la cifra SSH. Ogni client da scrivania - TablePlus, DBeaver, Sequel Ace, MySQL Workbench - ce l'ha già dentro come opzione SSH.

Confermi che non sia già esposto

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

Se davvero deve essere raggiungibile

Per esempio un server applicativo in un altro data center. Allora: una rete privata se il fornitore la offre, una regola di firewall che nomina l'indirizzo di origine esatto, un utente ristretto a quell'host, e il TLS obbligatorio.

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';
Non crei mai un utente con il carattere jolly nell'host: un permesso a 'app'@'%' vuol dire da qualunque punto della Terra. È di gran lunga la causa più comune di un database sottratto, ed è un carattere solo.

Controlli che cosa esiste già

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

Ogni riga con % nella colonna host merita una spiegazione. Veda utenti e permessi, senza darne troppi.