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';
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.