SSL Verschlüsseltung der Datenbankverbindung zw. Master/Client im Cluster

#1
Hallo Leute, hallo Till,

ich versuche seit Tagen die Datenbankverbindung zwischen dem Masterserver und den Clienten zu verschlüsseln. Es gibt ein Tuorial von Falko Timme, dass die Verschüsselung des Servers und dem phpMyAdmin aufzeigt.

Analog dazu habe ich jetzt den Server eingerichtet, Zertifikate erstellt, Rechte und Pflichten der DB-User vergeben - und beim Login erhalte ich die Nachricht "Segmentation fault".

Ob ich die Zertifikate falsch erstellt habe (CN!=FQDN) oder nicht, werde ich nochmal testen müssen, aber das Wichtigste ist: Wie sage ich dem Clienten, dass er eine verschlüsselte Verbindung zur Datenbank aufbauen soll? Ist sowas schon in ISPConfig drin oder muss ich auf OS-Ebene runter oder doch noch woanders rumschrauben?

Der Client verbindet sich doch zum Master aber nicht umgekehrt - oder doch?
Vielen Dank für die Hilfe vorab, vg.ks
 
Zuletzt bearbeitet:

Till

Administrator
#2
Segmentation fault klingt stark nach ssl Zertifikatsproblem.

wie sage ich dem Clienten, dass er eine verschlüsselte Verbindung zur Datenbank aufbauen soll? Ist sowas schon in ISPConfig drin oder muss ich auf OS-Ebene runter oder doch noch woanders rumschrauben?
Dafür wirst Du wahrscheinlich den code des mysql libraries in ispconfig ändern müssen.

Der Client verbindet sich doch zum Master aber nicht umgekehrt
ja.
 
#3
das bedeutet also das OS baut nicht die verbindung auf, sondern ispconfig über php .. ok.

ich hatte gehofft du holst etwas weiter aus .. welche "mysql libraries in ispconfig" meinst du? etwa die db_mysql.inc.php?

 
#5
Hallo Leute, endlich hatte ich mal Zeit das Thema zu ende zu testen .. hier das Ergebnis:
Wie man sich eine PKI einrichtet und Zertifikate anlegt setze ich mal als Grundwissen voraus, genauso wie man SSL in mySQL aktiviert.

Bringen wir ispconfig etwas SSL bei :)

in der /usr/local/ispconfig/server/lib/classes/db_mysqli.inc.php:~65 im Konstruktor:public function __construct(..) nach den Klassenvariablenzuweisungen und vor dem parent::_construct(...); folgenden Code (an Eure Bedürfnisse angepasst) einfügen.

Code:
parent::init($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);
$key = "/usr/local/ispconfig/server/ssl/mysql-ispcsrvX.key";
$cert = "/usr/local/ispconfig/server/ssl/mysql-ispcsrvX.crt";
$ca = "/usr/local/ispconfig/server/ssl/root_mysql-ca.crt";
$capath = NULL;
$cipher = NULL;
parent::ssl_set($key, $cert, $ca, $capath, $cipher);
parent::init() initialisiet die mySQL Verbindung, ich habe mir hier ein Unterodner ssl/ im server/ Verzeichnis angelegt indem die Zertifikate liegen.
Alternativ kann man auch nur den Zertifikatsnamen der CA angeben (war nur angegeben für die CA) und für $capath den Pfad zum CA Zertifikat .. ob das auch für Cert und Key gilt hab ich nicht getest. Cipher habe ich als Option im [server]-Bereich der /etc/mysql/my.cnf auf dem master Server gesetzt, deshalb lasse ich das hier leer. Per Console wurde immer automatisch der serverseitige Cipher verwendet, deshalb denke ich es wir hier genauso sein .. PHP ist hier nicht so redselig. Wenn jemand weiß wie man die Verwendung von SSL bei erfolgreicher Verbindung ausgeben kann .. bitte mal posten .. ich hab nichts dazu gefunden. Mit parent::ssl_set() werden die SSL Optionen gesetzt und bei parrent::_construct() übermittelt.

Dies müsste dann für alle Slaves im Multserver-Setup geändert werden. Ob dann auch wirklich die Verbindung per SSL aufgebaut wird habe ich damit getestet, dass ich auf dem master Server per:

Code:
update mysql.user set ssl_type = 'X509' where host = '12.34.56.78' and user = 'USER';
flush privileges;
Wird SSL verlangt, dann kann keine ungesicherte Verbingung aufgebaut werden. Sonst gehts nach dem Prinzip SSL kann verwendet werden, man muss es aber nicht.

Bitte beachtet, dass nach einem Update/Patch diese Änderungen erneut durchgeführt werden müssen, insbesondere sollte vor dem Update die SSL Pflicht am master Server rausgenommen werden.

Code:
update mysql.user set ssl_type = '';
flush privileges;
Es fehlt mir diesbezüglich noch an Erfahrungswerten beim Update, deshalb Vorsicht!

Happy SSL-ing!

p.s.: Wär echt coll, wenn das im nächsten Patch übernommen werden kann ..
 
Zuletzt bearbeitet:
#7
Ja die CA muss immer dabei sein, da keine Datenbasis über gültige Zertifikate existiert wie im Webbrowser die Root CAs. Insbesondere muss auch der ganze Zertifizierungspfad (CA + Intermedaite Zertifikate) in einem Bundle bzw. Chain enthalten sein, wenn Intermediate Zertifikate verwendet werden.

Ich habe mir nach dieser Anleitung hier eine eigene PKI mit Intermediate Zertifikaten angelegt, um einzelne Bereiche wie Webdienste (Webserver, FTP-Server ..) oder Netzwerkdienste wie (VPN, mySQL ..) zu unterteilen. Abhängig von der Anzahl an enthaltenen Intermediate Zertifikaten in dieser Chain können so z.B bereichsweise "Zugriffsrechte" realisiert werden.

Beispiel: Fügt man CA, Intermediate Networking CA, VPN Intermediate CA und mySQL Intermediate CA in eine Chain, dann werden Zertifikate ausgestellt von VPN CA gültig auch gegen die, die von mySQL CA ausgestellt wurden, sonst nur die von der eigenen (z.B mySQL) Intermediate CA.

$ca muss auf allen identisch sein, wenn es nur eine CA gibt, sonst muss der jeweilige berechtigende Zertifizierungspfad in der Datei enthalten sein.

real_connect ruf doch nur parent::_construct auf .. aber ich finde keine parent::ssl_details() oder Ähnliches .. hab ich was übersehen?
 
#8
Wenn das in _construct steht, könntest Du mysqli_real_connect mit ssel nehmen. Gibt das false, hat es es nicht geklappt. Vielleicht sowas wie
$link = mysqli_real_connect();
if (!$link) remove_ssl;

Das Problem beim Setup ist doch, dass das CA dann auch auf dem Client verfügbar sein muss. Du könntest den installer so erweitern, dass auf dem Master die drei Files erstellt werden und das CA in die Datenbank geschrieben wird. Beim installer auf einem Slave wird das ca dann aus der DB geladen und auf die Platte geschrieben.
 

Werbung

Top