MySQL Remote Verbindung zu MariaDB

coldstone

Bekanntes Mitglied
Hallo zusammen,

ich habe folgendes problem, wo ich nicht weiterkomme. Vielleicht kann mir der ein oder andere einen Tip geben.

Ich möchte über JavaFX die Verbindung zu MariaDB testen.

MariaDB (10.1.47) ist auf ein Ubuntu-Server (18.04) installiert.

Über die Server-Konsole kann ich mich auf MariaDB einloggen und Tabellen erstellen oder löschen.
Nur klappt es irgendwie nicht über den Java-Client.
Ziel ist es später Benutzer auf den Client anzulegen und Client seitig Daten abzufragen.


Ich habe in der MariaDB config datei 850-server.cnf, die bind-adress auf 0.0.0.0 gesetzt. Dies ist glaube ich erforderlich, damit alle anfragen von aussen erlaubt sind.
Hatte ich in einem Tutorial gelesen. Falls ich falsch liege korrigiert mich bitte.

Die mariadb-java-client-2.7.2.jar datei habe ich als Path in Eclipse angegeben.

Mein Java-Cose sieht wie folgt aus:

Java:
package application;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class DBConnection {
   
    public static void main(String[] args) {
   
    Connection connection = null;
    String url = "jdbc:mariadb://***.***.***.***:3306/player";
    String user = "root";
    String pwd = "*******,";
           
           
    try {
        connection = DriverManager.getConnection(url, user, pwd);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("Erfolgreiche Verbindung zur Datenbank");
    }
}

Es wird leider eine Exception in der Konsole von Eclipse ausgegeben.

Java:
java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=***.***.***.***)(port=3306)(type=master) : Socket fail to connect to host:***.***.***.***, port:3306. Connection timed out: no further information
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73)
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:192)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1392)
    at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:635)
    at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150)
    at org.mariadb.jdbc.Driver.connect(Driver.java:89)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
    at application.DBConnection.main(DBConnection.java:20)

Eine Datenbank namens player ist angelegt.
Was mich unsicher macht ist der String url:

Code:
jdbc:mariadb://***.***.***.***:3306/player

Hier wird doch die IP-Adresse meines Ubuntu Servers eingetragen, gefolgt vom PORT meines MariaDB Datenbanks, Richtig?
 
Du kannst von deinem Client aus testen, ob die DB überhaupt erreichbar ist:
Bash:
telnet <ip> 3306
Du kannst dich auf diese Weise nicht verbinden aber du müsstes eine Meldung von der DB sehen, mit <version>MariaDB<wilde zeichen>passwordConnection closed by foreign host.
Sollte das nicht funktionieren, gibt es möglicherweise ein Problem mit IP, der Firewall o.ä.
 
Ich würde vermuten, dass eine Firewall aktiv ist. Das kannst Du aber testen wenn Du das machst, was Oneixee5 vorgeschlagen hat.

Generell ist es aber auch keine gute Idee, eine Datenbank von außen zugänglich zu haben. Da ist der übliche Aufbau, dass man dies über einen Webservice oder so laufen lässt.
 
Du kannst von deinem Client aus testen, ob die DB überhaupt erreichbar ist:
Bash:
telnet <ip> 3306
Du kannst dich auf diese Weise nicht verbinden aber du müsstes eine Meldung von der DB sehen, mit <version>MariaDB<wilde zeichen>passwordConnection closed by foreign host.
Sollte das nicht funktionieren, gibt es möglicherweise ein Problem mit IP, der Firewall o.ä.
Danke für den Telnet Tip.
Über Telnet konnte ich eine Verbindung aufbauen. Aber mit dem richtigen Link zum Server. Hatte unter JavaFX die Ip-Adresse angegeben, was auch über das Telnet nicht funktioniert hat.

Ich bekomme folgende Exception jetzt ausgegeben:

Java:
java.sql.SQLInvalidAuthorizationSpecException: Could not connect to address=(host=**************.de)(port=3306)(type=master) : (conn=*******) Access denied for user 'root'@'*******.dynamic.kabel-deutschland.de' (using password: YES)
Current charset is windows-1252. If password has been set using other charset, consider using option 'passwordCharacterEncoding'

Liegt das Problem darin, das ich mich als 'root' versuche zu verbinden?

@kneitzel
Generell soll auch nur von aussen ein neuer "Player" in die Datenbank eingefügt werden. Ist dies auf diesem wege nicht möglich?
 
Generell soll auch nur von aussen ein neuer "Player" in die Datenbank eingefügt werden. Ist dies auf diesem wege nicht möglich?
dein Spieler muss sich sowieso mit deinem Server verbinden und der stellt dann die Anfrage "trag mich ein" und nur dein Server kennt den sql Server und weis was er eintragen muss ansonsten könnte jeder von aussen an deiner Datenbank rum wurschteln
 
Danke für den Telnet Tip.
Über Telnet konnte ich eine Verbindung aufbauen. Aber mit dem richtigen Link zum Server. Hatte unter JavaFX die Ip-Adresse angegeben, was auch über das Telnet nicht funktioniert hat.

Ich bekomme folgende Exception jetzt ausgegeben:

Java:
java.sql.SQLInvalidAuthorizationSpecException: Could not connect to address=(host=**************.de)(port=3306)(type=master) : (conn=*******) Access denied for user 'root'@'*******.dynamic.kabel-deutschland.de' (using password: YES)
Current charset is windows-1252. If password has been set using other charset, consider using option 'passwordCharacterEncoding'

Liegt das Problem darin, das ich mich als 'root' versuche zu verbinden?
Man muss bei mysql auch angeben, von wo sich welcher User verbinden dürfen. Siehe z.B. hier: https://www.fosit.de/benutzerverwaltung-mysql

root wird sich standardmäßig nur von localhost aus einloggen dürfen.
@kneitzel
Generell soll auch nur von aussen ein neuer "Player" in die Datenbank eingefügt werden. Ist dies auf diesem wege nicht möglich?
Nein. Der Benutzer kann dann auf der Datenbank alles tun, wozu er rechte hat. Mit dem root Account die komplette Datenbank auslesen und löschen. Sprich, wer dein javafx programm hat, hat Vollzugriff auf die Datenbank.
 
Also generell sollte man die Angriffsmöglichkeiten immer so sehr beschränken, wie es nur irgendwie geht. Gerade bei einer Datenbank hat ein Angreifer aber schnell einiges an Möglichkeiten. Über das Abgreifen von Daten bis hin zur Kompromittierung des ganzen Servers sind da Tür und Tor geöffnet.

Eine Datenbank bietet einem Benutzer nun einmal standardmäßig sehr viele Möglichkeiten. Da will man so wenig Risiken eingehen, wie nur irgendwie möglich.
 
Ok, vielen dank für die Antworten.
Aber generell gesehen kann ich mich auch als root über den server einloggen, wenn die Konfiguration von MariaDB es hergibt, sehe ich das Richtig?
Unabhängig davon ob diese variante sicher ist oder nicht?
Ich verstehe die Exception jetzt so, dass die Anfrage beim Server ankommt, aber ich keine Berechtigung habe.
 
Ja, wobei das an mehreren Dingen liegen kann:
- falsches Passwort (ggf. durch falsches Encoding - dazu hat Du ja auch eine Meldung bekommen)
- User prüfen - hast Du ein root@% user? Oder nur den root@locahost?
 
Passwort ist eigentlich richtig. Encoding müsste ich mal gucken.
User habe ich nur den root, welches standardmäßig ja vorhanden ist. Habe nur das Password geändert.
 
Einfach mal verbinden zur mysql Datenbank (Also mit sowas wie mysql -u root -p) und da dann ein
SELECT user, host from mysql.user;
Dann siehst Du ja, was da an Usern gelistet wird.
 

Zurück
Oben