Connettersi a MySQL con un Tunnel SSH

Qualche volta vi sarà capitato di dover accedere ad un database MySQL configurato per accettare esclusivamente connessioni da altre macchine sulla rete locale.

Quella descritta è una misura di sicurezza comune che viene adottata ad esempio sui web server.

Il problema si può aggirare attraverso un tunnel SSH per accedere alla macchina, aprire una connessione al database e mappare la porta del database a quella sulla tua macchina locale.

Vediamo ora come si può implementare questa soluzione in Python utilizzando i pacchetti sshtunnel e mysql.connector.

import os
import sys
import time
from datetime import date
from datetime import datetime
from datetime import timedelta
import mysql.connector
import sshtunnel
import time

host = 'remote_ip'
sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0

def get_data():
    with sshtunnel.SSHTunnelForwarder( (host, 22), ssh_username='ssh_username', ssh_password='ssh_password', remote_bind_address=('127.0.0.1', 3306), local_bind_address=('127.0.0.1', 3306)) as tunnel:
        connection = mysql.connector.connect(
            user='db_user', password='db_password',
            host='127.0.0.1', port=3306,
            database='db',
        )
        sql = "SELECT * FROM DATA"
        cur = connection.cursor(dictionary=True)
        cur.execute(sql)
        results = cur.fetchall()
        connection.close()
        return results


if __name__ == '__main__':
    results = get_data()
    if len(results) > 0:
        for index in range(len(results)):
            result = results[index]
            print(result)