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

Diskutiere MariaDB-Client-Zertifkate, nur für einen bestimmten User im Datenbankprogrammierung Bereich.

Bitte aktiviere JavaScript!
J

jmar83

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:
J

jmar83

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 ..?
 
J

jmar83

@Blender3D: Dein Beitrag ist mir während dem Schreiben von meinem zweiten "dazwischengeraten". Vielen Dank, werde mal schauen! :)
 
J

jmar83

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...
 
Thema: 

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

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben