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

Dieses Thema im Forum "Installation und Konfiguration" wurde erstellt von isp_geek, 8. Mai 2014.

  1. isp_geek

    isp_geek Member

    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: 8. Mai 2014
  2. Till

    Till Administrator

    Segmentation fault klingt stark nach ssl Zertifikatsproblem.

    Dafür wirst Du wahrscheinlich den code des mysql libraries in ispconfig ändern müssen.

    ja.
     
  3. isp_geek

    isp_geek Member

    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?

     
  4. Till

    Till Administrator

    Ja, es gibt ja nur eines. Du musst das serverseitige ändern, nicht das vom Interface.
     
  5. isp_geek

    isp_geek Member

    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: 21. Sep. 2015
    Till und florian030 gefällt das.
  6. florian030

    florian030 Member

    Muss $ca nicht auf allen Servern identisch sein?
    Ob SSL beutzt wird, müsstest Du mit mysqli_real_connect testen können.
     
  7. isp_geek

    isp_geek Member

    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. florian030

    florian030 Member

    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.
     

Diese Seite empfehlen