SHH Zugriff auf Datenbank in Flask

Django, Flask, Bottle, WSGI, CGI…
Antworten
naheliegend
User
Beiträge: 170
Registriert: Mittwoch 8. August 2018, 16:42

Freitag 16. Oktober 2020, 10:57

Hi,

ich poste auf meinem local eine flaskwebsite und ich habe auf dem Rechner einen SSH-Zugang zu einer MySQL Datenbank.

Ich habe gegeben:
-SQL-Host = 127.0.0.1
-SQL-Username
-SQL-PW
-DB-Name

-SSH-Host
-SSH-Username
-SSH-PW

Ports müssten da 3306 und 22 sein. Trotzdem sagt mir Python:
sshtunnel.BaseSSHTunnelForwarderError
sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway

Code: Alles auswählen

   
    import pymysql
    import pandas as pd
    from sshtunnel import SSHTunnelForwarder


    sql_hostname = 'SQL-Host'
    sql_username = 'SQL Username'
    sql_password = 'SSH-PW'
    sql_main_database = 'DB-Name'
    sql_port = 3306
    ssh_host = 'SSH-Host'
    ssh_user = 'SSH-Username'
    ssh_passw = 'SSH-PW'
    ssh_port = 22
    sql_ip = '1.1.1.1.1'

    with SSHTunnelForwarder(
            (ssh_host, ssh_port),
            ssh_username=ssh_user,
            ssh_password=ssh_passw,
            remote_bind_address=(sql_hostname, sql_port)) as tunnel:
        conn = pymysql.connect(host='127.0.0.1', user=sql_username,
                               passwd=sql_password, db=sql_main_database,
                               port=tunnel.local_bind_port)
        query = '''
        SELECT *
        FROM BLA p 
         WHERE p.yes = 1234 ;'''
        data = pd.read_sql_query(query, conn)
        conn.close()
Zuletzt geändert von naheliegend am Freitag 16. Oktober 2020, 11:06, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 2263
Registriert: Freitag 17. April 2009, 10:28

Freitag 16. Oktober 2020, 11:02

Wenn du auf dem selben, lokalen Rechner ein RDBMS hast - warum möchtest du dann einen SSH-Tunnel aufbauen?
naheliegend
User
Beiträge: 170
Registriert: Mittwoch 8. August 2018, 16:42

Freitag 16. Oktober 2020, 11:12

Merke gerade, dass mit 127.0.0.10 auch funktioniert als SQL-Host über HeidiSQL
naheliegend
User
Beiträge: 170
Registriert: Mittwoch 8. August 2018, 16:42

Freitag 16. Oktober 2020, 12:24

Also wenn ich die Daten in HeidiSQL oder Sequel Pro oder whatever eingebe, dann wird eine Verbindung erfolgreich aufgebaut. Im Pythoncode kommt halt der Fehler. Jetzt mit ich überfragt.
Jankie
User
Beiträge: 511
Registriert: Mittwoch 26. September 2018, 14:06

Freitag 16. Oktober 2020, 12:36

Kenne mich leider nicht gut damit aus, aber vielleicht kann ich ja trotzdem versuchen einen Beitrag zu leisten.

Kannst du vielleicht mal den gesamten Traceback posten?

Bei einigen Beispielen habe ich gesehen, dass neben remote_bind_address auch die local_bind_address mit angegeben wird, könnte es vll daran liegen? Oder evtl. an Problemen mit den RSA-Keys?
Ich habe für SSH Zgriffe bisher immer paramiko genutzt, eventuell ist da ja was dabei was dir helfen könnte.
naheliegend
User
Beiträge: 170
Registriert: Mittwoch 8. August 2018, 16:42

Freitag 16. Oktober 2020, 12:46

Traceback (most recent call last)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/PycharmProjects/flaskProject/app.py", line 24, in adder_page
result = do_calculation(number1, number2)
File "/Users/PycharmProjects/flaskProject/algorithm.py", line 20, in do_calculation
with SSHTunnelForwarder(
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/sshtunnel.py", line 1552, in __enter__
self.start()
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/sshtunnel.py", line 1293, in start
self._raise(BaseSSHTunnelForwarderError,
File "/Users/PycharmProjects/flaskProject/venv/lib/python3.8/site-packages/sshtunnel.py", line 1100, in _raise
raise exception(reason)
sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway



Wo ist denn der Unterschied zwischen dem remote_bind und local_bind?
Benutzeravatar
sparrow
User
Beiträge: 2263
Registriert: Freitag 17. April 2009, 10:28

Freitag 16. Oktober 2020, 12:52

Ich frage noch einmal: Warum willst du zu einem RDBMS, die auf dem selben lokalen Rechner läuft einen SSH-Tunnel aufbauen?
naheliegend
User
Beiträge: 170
Registriert: Mittwoch 8. August 2018, 16:42

Freitag 16. Oktober 2020, 13:26

sparrow hat geschrieben:
Freitag 16. Oktober 2020, 12:52
Ich frage noch einmal: Warum willst du zu einem RDBMS, die auf dem selben lokalen Rechner läuft einen SSH-Tunnel aufbauen?
weil ich einen VPN zu dem "lokalen Rechner" habe
Benutzeravatar
sparrow
User
Beiträge: 2263
Registriert: Freitag 17. April 2009, 10:28

Freitag 16. Oktober 2020, 13:31

Du hast ein VPN zu dem lokalen Rechner?!? Das macht nicht wirklich Sinn.
127.0.0.1 ist localhost, also der Rechner, auf dem du lokal bist. Dorthin einen SSH-Tunnel aufzubauen, ist in etwa so, als würdest du ein Paket, dass du zu deinem Nachbarn bringen möchtest, erst zu einem anderen Nachbarn bringen, der das Paket in einen anderen Karton packt und dann zu dem Nachbarn bringt, der es eigentlich haben sollte und der sich vor allem darüber ärgert, dass da jetzt 2 Kartons drum sind.

Nochmal: Deine Webanwendung und dein RDBMS laufen auf der selben Maschine? Weil das tun sie laut deinem Code. Und dann braucht es keinen SSH-Tunnel, sondern du verbindest dich direkt mit dem RDBMS.


Edit: Oh, ich sehe gerade, dass du deinen Code im Anfangspost editiert hast und nun der SSH-Hoste nicht mehr localhost ist.
naheliegend
User
Beiträge: 170
Registriert: Mittwoch 8. August 2018, 16:42

Freitag 16. Oktober 2020, 13:48

Nein, VPN-Tunnel in ein entferntes Netz, in der auch die Datenbank steht. Es werden nur SHH Zugriffe auf die DB erlaubt.

Deswegen habe ich durch den VPN noch einen SSH gelegt, weil mir nichts schnelleres eingefallen ist.
Wenn ich die Daten mit HeidiSQL oder so eingebe, dann ist der DB-Zugriff erfolgreich.

Webanwendung läuft momentan auf meinem lokalen Rechner. 127.0.0.1:5000.
naheliegend
User
Beiträge: 170
Registriert: Mittwoch 8. August 2018, 16:42

Mittwoch 21. Oktober 2020, 07:29

Habe es immer noch nicht geschafft. Es failed immer der SSHTunnelForwarder, aber ich verstehe nicht warum.

Wenn ich im Terminal

Code: Alles auswählen

ssh user@ip-adresse
eingebe und im Anschluss mein

Code: Alles auswählen

ssh-passwort
, dann läuft alles durch und die Connection wird aufgebaut.

Wenn ich aber:

Code: Alles auswählen

    import sshtunnel
    from sshtunnel import SSHTunnelForwarder

    sshtunnel.SSH_TIMEOUT = 5.0
    sshtunnel.TUNNEL_TIMEOUT = 5.0

    server = SSHTunnelForwarder(
        'ip-adresse', 22,
        ssh_username="user",
        ssh_password="ssh-passwort",
        remote_bind_address=('127.0.0.1', 3306)
    )

    server.start()

    print(server.local_bind_port)
Bekomme ich wieder den:
sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway
Warum?
Benutzeravatar
sparrow
User
Beiträge: 2263
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 21. Oktober 2020, 09:43

@naheliegend: Das wird dir niemand beantworten können, denn dein Code aus dem ersten Post funktioniert.

Code: Alles auswählen

from sshtunnel import SSHTunnelForwarder

ssh_host = 'der Hostname des SSH-Servers'
ssh_user = 'der SSH Benutzer'
ssh_passw = 'das Passwort des SSH Benutzers'
ssh_port = 22
remote_hostname = '127.0.0.1'
remote_port = 3306

with SSHTunnelForwarder(
    (ssh_host, ssh_port),
    ssh_username=ssh_user,
    ssh_password=ssh_passw,
    remote_bind_address=(remote_hostname, remote_port)) as tunnel:
        print(tunnel)
Wenn das bei dir nicht funktioniert, dann liegt das Problem nicht am Code.
Lässt die Firewall die Connection zu?
Hast du verstanden wie ein SSH-Tunnel funktioniert und sind alle Parameter für die Verbindung wirklich richtig? Inklusive Hostname des SSH-Servers?
Was passiert, wenn man die IP statt des Hostnamens des SSH Servers verwendet?

Und vielleicht musst du dich in der Dokumentation schlau machen, ob man das Logging irgendwo erhöhen kann.
Antworten