MySQL MariaDB-Client-Zertifkate, nur für einen bestimmten User

ruutaiokwu

Top Contributor
Hallo zusammen

Vorab: Es geht nicht um MySQL, sondern um MariaDB - aber das kann man ja nicht selektieren hier. Ist aber "same-same, but different", von daher... ;-)


Wie haben einen MariaDB Master/Master-Cluster inkl einem Skript welches Stamm-, Client-, sowie Serverzertifikate generiert. Die Clientzertifikate werden vom Skript jeweils auf den anderen Server verteilt.

Nun:

Wenn ich in der /etc/mysql/mariadb.conf.d/50-server.cnf den Server-Part angebe, dann passiert soweit nix, es scheint optional zu sein ob der Client nun Zertifikate verwendet oder nicht.

Wenn ich aber sowas angebe, die Konfig der Client-Zertis, dann meckers das `mysql`-Konsolentool bei einer Eingabe von `mysql -h localhost -u root -p password` plötzlich:

```
# J.M., 2020-01-17 {

[client-mariadb]
#ssl = 0
#ssl-cert = /etc/mysql/client-cert.pem
#ssl-key = /etc/mysql/client-key.pem
#ssl-ca = /etc/mysql/ca-cert.pem

[client-mariadb-10.1]
#ssl = 0
#ssl-cert = /etc/mysql/client-cert.pem
#ssl-key = /etc/mysql/client-key.pem
#ssl-ca = /etc/mysql/ca-cert.pem

# } J.M., 2020-01-17

```

Sicherheitshalber habe ich 2 Abschnitte gemacht, und aktuell ist auch wieder jeder Zeile auskommentiert damit's wieder geht.

Frage: Was muss ich da machen?

Ich möchte EINZING UND ALLEINE dass die Benutzer `replication_server_1` sowie `replication_server_2` die X509-Technik verwenden... alle anderen sind eh an localhost gebunden und somit nicht öffentlich.

Aber auch `replication_server_1` sowie `replication_server_2` sind nicht wirklich öffentlich `replication_server_1` akzeptiert nur die IP von Server 2, `replication_server_2` nur die von Server 1!

Um die replication_server_X-Benutzer zu erstellen, verwende ich folgende Befehl:

```
FLUSH PRIVILEGES;
DROP USER IF EXISTS 'replication_server_1'@'1.1.1.1';
FLUSH PRIVILEGES;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replication_server_1'@'1.1.1.1' IDENTIFIED BY 'my_password' REQUIRE X509;
UPDATE mysql.user SET authentication_string = PASSWORD('my_password') WHERE User = 'replication_server_1';
FLUSH PRIVILEGES;


```


resp.


```
FLUSH PRIVILEGES;
DROP USER IF EXISTS 'replication_server_2'@'2.2.2.2';
FLUSH PRIVILEGES;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replication_server_2'@'2.2.2.2' IDENTIFIED BY 'my_password' REQUIRE X509;
UPDATE mysql.user SET authentication_string = PASSWORD('my_password') WHERE User = 'replication_server_2';
FLUSH PRIVILEGES;

```


(CREATE USER scheint Mariadb 10.x nicht zu unterstützen, deshalb GRANT; und das nachträgliche UPDATE ist aus Kompatibilitätsgründen besser habe ich festgestellt. Und ein paar mal FLUSH PRIVILEGES schadet sicher auch nicht.)


Nun: Warum zum Teufel kann ich mich dann plötzlich lokal nicht mehr als root per `mysql -h localhost -u root -p my_password` einloggen mit diese Konfig, WTF!!

Der root-Benutzer ist schliesslich NICHT mit "REQUIRE X509" geflaggt!!!!!!!!!!!!!!!!!!!!


```
# J.M., 2020-01-17 {

[client-mariadb]
ssl = 1
ssl-cert = /etc/mysql/client-cert.pem
ssl-key = /etc/mysql/client-key.pem
ssl-ca = /etc/mysql/ca-cert.pem

[client-mariadb-10.1]
ssl = 1
ssl-cert = /etc/mysql/client-cert.pem
ssl-key = /etc/mysql/client-key.pem
ssl-ca = /etc/mysql/ca-cert.pem

# } J.M., 2020-01-17

```


oder auch

```
# J.M., 2020-01-17 {

[client-mariadb]
ssl = 0
ssl-cert = /etc/mysql/client-cert.pem
ssl-key = /etc/mysql/client-key.pem
ssl-ca = /etc/mysql/ca-cert.pem

[client-mariadb-10.1]
ssl = 0
ssl-cert = /etc/mysql/client-cert.pem
ssl-key = /etc/mysql/client-key.pem
ssl-ca = /etc/mysql/ca-cert.pem

# } J.M., 2020-01-17

```


(Habe zuerst gedacht `ssl = x` bestimmt ob das Zeugs in jedem Fall ZWANGSLÄUFIG angewendet werden soll - also für jeden Account)

Wie kriege ich es also hin dass die Verschlüsselung nur für einen bestimmten Benutzer `mysql_replication_X` erforderlich wird.

Und komisch ist, dass das `mysql`-Konsolentool stress macht mit der Meldung "Unable to very peer checksum", das Windows-MySQL-GUI-Frontend-Tool "HeidiSQL" wiederum nicht. WTF hoch 27!!!!!!!!

Haben die Client-SSL-Einträge in der Konfig zu folge, dass auf dem lokalen System dann mit dem `mysql`-Konsolentool immer versucht wird die Client-Zertifikate (zur Verbindungsverschlüselung) zu verwenden - auch wenn dann der root halt gar nicht mit "... REQUIRE X509" geflaggt ist und das zum ganzen Stress führt.


Dann müsste ich evtl. auf diese Client-Einträge verzichten, um bei der SQL-Anweisung wo der Master-Server definiert wird irgendeinen Pfad mitliefern?

Z.B. was in der Art (Pseudocode):

```
STOP SLAVE;
RESET SLAVE;
RESET MASTER;
CHANGE MASTER TO master_host='1.1.1.1', master_port=3306, master_user='replication_server_2', master_password='my_password', master_log_file='mysql-bin.000001', master_log_pos=313, ssl-cert='/etc/mysql/client-cert.pem' ssl-key='/etc/mysql/client-key.pem' ssl-ca='/etc/mysql/ca-cert.pem'
START SLAVE;
FLUSH PRIVILEGES;
EXIT;

...und dann noch in der Konsole `systemctl restart mysql` ??

```


Eben halb diesen ganzen Kran nur für diese einzelne Verbindung:

" ssl-cert='/etc/mysql/client-cert.pem' ssl-key='/etc/mysql/client-key.pem' ssl-ca='/etc/mysql/ca-cert.pem' "


Danke für die Feedbacks.
 
Zuletzt bearbeitet:

ruutaiokwu

Top Contributor
Das hier alles nutzt mir relativ wenig , wie man für spezifische User das einrichtet, wenn dann plötzlich der root-Account damit "verseucht" ist: Securing Connections for Client and Server

...oder gibt das, was man bei der MariaDB-Konfig im Client-Abschnitt festlegt nur für die MySQL-eigenen Kommandoteilen-Tools wie `mysql` ?


Die Client-Abschnitte in der Konfig-Datei heissen evtl.:

"Verwende mit den MariaDB-eigenen-Kommandozeilen-CLIENT Tools (mysql, mysqldmp etc.) immer SSL mit den angegebenen Zertifikaten, egal was mit dem nun Zielsystem ist"


und NICHT

"Erwarte als Server immer einen Client, der diese Zertifikate einsetzt" ??


-> Vielleicht läuft deshalb auch der Windows-Client "HeidiSQL" weiter ohne zu meckern, da er über SSH (REMOTE_IP:22) dann direkt auf localhost:3306 geht ..?
 

ruutaiokwu

Top Contributor
https://mariadb.com/kb/en/configuring-mariadb-for-remote-client-access/

-> Nein, daran liegt es nicht. Ich habe es hingekriegt für den replication_x-Benutzer es so festzulegen, dass er immer nur die IP-Adresse des anderen Cluster-Parts "frisst"... so weit, so gut...

MySQL läuft halt jetzt als Daemon unter 0.0.0.0 (=alle NIC-Adapter und 127.0.0.1/localhost) statt nur mit 127.0.0.1/localhost. Dafür sind die User dann an localhost gebunden, ausser halt die Replication-User.

Ein telnet auf server:3306 wird damit von überall aus gehen, aber wenn die IP nicht stimmt kommt die Meldung zurück dass diese nicht zugelassen ist. Komplett sperren für alle IPs ausser die vom anderene Cluster-Part, könnte man natürlich mit iptables.

dann gibt z.b. telnet server 3306 von einer nicht zugelassenen Client-IP rein gar nix zurück, antwortet überhaupt nicht. Aber soweit muss es aktuell noch nicht gehen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
C MySQL Remote Verbindung zu MariaDB Datenbankprogrammierung 11
ruutaiokwu SQL-Dump nach MariaDB laden? Datenbankprogrammierung 6
O Dokumentation für MariaDB 10.3. Datenbankprogrammierung 2
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
ruutaiokwu MariaDB root Kennwort zurücksetzen, frische Debian Stretch 9.6.0-Installation!! Datenbankprogrammierung 0
D Installation von MariaDB in java und eclipse Datenbankprogrammierung 2
I MariaDB-Verbindung in JAVA Datenbankprogrammierung 11
L Oracle SQL Inserts via Client vs SQL Datei via ScriptRunner Datenbankprogrammierung 6
L H2 Blob Spalte im Client anzeigen Datenbankprogrammierung 2
B Derby/JavaDB Client-Server-Architektur mit Datenbank Datenbankprogrammierung 6
J Daten synchronisieren in Multi-Client-Anwendungen (Hibernate) Datenbankprogrammierung 6
P Lokaler Java Client auf online Datenbank zugreifen Datenbankprogrammierung 2
D MySQL Client - Server: Client verabschiedet sich sobald ich Variablen im SQL Statement verwende Datenbankprogrammierung 9
R Einfache JDBC-Datenbank mit Admin-Client Datenbankprogrammierung 4
A Client-Server anwendung sofort aktualisieren Datenbankprogrammierung 7
G client <> db anwendung - zugangsdaten? Datenbankprogrammierung 3
G [Hibernate] Hibernate in Desktop Client Datenbankprogrammierung 3
O Oracle Client Software für ojdbc5! Datenbankprogrammierung 1
sparrow Hibernate in non-EE Server/Client-App (Topic geändert) Datenbankprogrammierung 10
G update sperren bei client/server anwendung Datenbankprogrammierung 7
T JDBC und Client/Server Datenbankprogrammierung 12
A MySQL+Webserver --(Java-Applet)----> Client Datenbankprogrammierung 11
S SQLite oder RDBMS als Datei(nicht Client/Server) Datenbankprogrammierung 5
D Datenbank zugriff über Client/Server Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben