Günther S: SSL Verständnisfragen

Hallo zusammen,

ich habe mich etwas in SSL vertieft, bin inzwischen zu einigen Erkenntnissen gelangt und hätte gerne eine Bestätigung oder Berichtigung dafür.

  1. Zum Herstellen einer SSL-Verbindung
    a) benötigt man ein Zertifikat, bekommt man z.B. von thawte
    b) und SSL-Unterstützung auf seiten des Webservers, z.B. durch OpenSSL für Apache (das entsprechende Modul muss natürlich aktiviert werden)
    c) und muss die entsprechende Seite dann einfach mit 'https://' anstatt 'http://' aufrufen.

  2. SSL sollte aus Performancegründen nur dann verwendet werden, wenn es wirklich benötigt wird.

Soweit meine "Erkenntnisse".

Eine Frage hätte ich allerdings noch bezüglich der Verbindung zwischen PHP und MySQL-Server mit SSL.
Ich muss gestehen, dass ich nicht informiert bin, wie genau mit PHP geöffnete MySQL-Verbindungen aussehen (sprich welches Protokoll verwendet wird; ob es sicherheitstechnisch einen Unterschied macht, ob die MySQL-Datenbank auf demselben Server liegt wie die PHP-Skripte)
Sofern es überhaupt einen Unterschied macht, ob MySQL-DB und PHP-Skripte auf demselben Server liegen oder nicht, gehen wir doch einmal davon aus, das sei _nicht_ der Fall.

  1. Was muss ich tun, um die Verbindung mit SSL zu sichern?
  2. Gibt es eine Möglichkeit, PHP-MySQL-Verbindungen nur manchmal mit SSL zu verschlüsseln (nämlich dann, wenn ein Benutzer eine Seite über 'https://' aufruft) oder wird dann jede Verbindung zwischen PHP und MySQL verschlüsselt?
  3. zu Frage 4: Falls jede Verbindung verschlüsselt wird, wie viel Performance kostet das in etwa?

Gruß,
Günther

  1. Hallo Günther,

    Ich muss gestehen, dass ich nicht informiert bin, wie genau mit PHP geöffnete MySQL-Verbindungen aussehen (sprich welches Protokoll verwendet wird; ob es sicherheitstechnisch einen Unterschied macht, ob die MySQL-Datenbank auf demselben Server liegt wie die PHP-Skripte)

    Ja sicher. Befinden sich MySQL-Server und Webserver auf dem gleichen Rechner, so gibt es keinen externen Netzwerkverkehr, der eventuell mitgeschnitten werden könnte. Hat jemand unberechtigten Zugriff auf den Server, dann hast Du eh' ein Sicherheitsproblem.

    Sofern es überhaupt einen Unterschied macht, ob MySQL-DB und PHP-Skripte auf demselben Server liegen oder nicht, gehen wir doch einmal davon aus, das sei _nicht_ der Fall.

    1. Was muss ich tun, um die Verbindung mit SSL zu sichern?

    Dazu gibt es ein eigenes Kapitel im MySQL-Handbuch: Using Secure Connections.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      Dazu gibt es ein eigenes Kapitel im MySQL-Handbuch: Using Secure Connections.

      Danke!

      Gruß,
      Günther

  2. Hallo,

    1. Zum Herstellen einer SSL-Verbindung
      a) benötigt man ein Zertifikat, bekommt man z.B. von thawte

    Ja. Man kann sich ein Zerti auch selbst ausstellen, um Kosten zu sparen. Die Verbindung ist dann genau so gut verschlüsselt. Man büsst dann allerdings die Sicherheit ein, dass die Gegenseite die ist, die sie vorgibt zu sein, die man seinen Besuchern bieten möchte.

    b) und SSL-Unterstützung auf seiten des Webservers, z.B. durch OpenSSL für Apache (das entsprechende Modul muss natürlich aktiviert werden)
    c) und muss die entsprechende Seite dann einfach mit 'https://' anstatt 'http://' aufrufen.

    Ja alles richtig.

    1. SSL sollte aus Performancegründen nur dann verwendet werden, wenn es wirklich benötigt wird.

    Ich denke der Grund es nicht überall einzusetzen sollte eher sein, dass gesicherte Bereiche von ungesicherten Bereichen auch von einem Besucher klar unterscheidbar sind. Die zusäzliche Rechenleistung, die man für die Verschlüsselung braucht, ist kaum spürbar, und muss höchtens auf Systemen in Betracht gezogen werden, die sehr schwer unter Last stehen.

    Ich muss gestehen, dass ich nicht informiert bin, wie genau mit PHP geöffnete MySQL-Verbindungen aussehen (sprich welches Protokoll verwendet wird; ob es sicherheitstechnisch einen Unterschied macht, ob die MySQL-Datenbank auf demselben Server liegt wie die PHP-Skripte)

    Diese Medallie hat zwei Seiten. Sind Skripte und Datenank auf dem selben Server, dann müssen sie nicht über eine unsichere Verbindung (Netzwerk oder sogar über Internet) kommunizieren. Anderseits bietet ein Host, wo Webdienste (apache + PHP, SSH und womöglich sogar FTP) laufen, mehr Angriffsfläche und ist daher grundsätzlich schon mal etwas unsicher. Die Datenbank kann dann natürlich auch nur den selben, geminderten Sicherheitsstandard haben.

    Eine Konstellation, wo die Skripte und die DB auf unterschiedlichen Hosts sind, lässt sich besser absichern. Die Verbindung kann man ja verschlüsseln und damit die Datenübertragung hinreichend gut schützen. Und wenn die Datenbank der einzige Dienst ist, den der Datenbankserver betreibt, dann kann man diesen Server wunderbar absichern, indem er keine anderen Anfragen annimmt, als für die Datenbank und die am besten auch noch nur von einem einzigen bestimmten Host, nämlich da wo die Skripte laufen. Auf diese Weise kann man die Sicherheit der Daten etwas erhöhen. Viel ist es allerdings nicht, denn wenn ein Angreifer die Kontrolle über den "PHP" Server erlangt, dann kann er ja die Skripte selbst dafür benutzen die Daten abzusaugen.

    1. Was muss ich tun, um die Verbindung mit SSL zu sichern?

    Das kann ich jetzt auch nicht aus dem Stehgreif sagen, ich müsste genau das tun was du lieber selber machst, nämlich die Dokumentation aufschlagen.

    1. Gibt es eine Möglichkeit, PHP-MySQL-Verbindungen nur manchmal mit SSL zu verschlüsseln (nämlich dann, wenn ein Benutzer eine Seite über 'https://' aufruft) oder wird dann jede Verbindung zwischen PHP und MySQL verschlüsselt?

    Ja die Möglichkeit besteht, aber es ist zusätzlicher Aufwand das so einzurichten und gewinnen tust du dadurch nicht wirklich was. Verschlüssele die Übertragung lieber einfach in jedem Fall.

    1. zu Frage 4: Falls jede Verbindung verschlüsselt wird, wie viel Performance kostet das in etwa?

    Nicht spürbar.

    Gruß,
    Cruz

    1. Hallo,

      Zuallererst: Danke für die Infos!

      Nach der Lektüre des Links in Vinzenz Beitrag zu dem Thema SSL-Verbindung zu MySQL habe ich in einem Punkt von deiner Aussage sehr abweichende Angaben bekommen:

      1. Gibt es eine Möglichkeit, PHP-MySQL-Verbindungen nur manchmal mit SSL zu verschlüsseln (nämlich dann, wenn ein Benutzer eine Seite über 'https://' aufruft) oder wird dann jede Verbindung zwischen PHP und MySQL verschlüsselt?

      Ja die Möglichkeit besteht, aber es ist zusätzlicher Aufwand das so einzurichten und gewinnen tust du dadurch nicht wirklich was. Verschlüssele die Übertragung lieber einfach in jedem Fall.

      1. zu Frage 4: Falls jede Verbindung verschlüsselt wird, wie viel Performance kostet das in etwa?

      Nicht spürbar.

      Laut der MySQL Doku wird das nämlich _deutlich_ langsamer:

      The standard configuration of MySQL is intended to be as fast as possible, so encrypted connections are not used by default. Doing so would make the client/server protocol much slower. Encrypting data is a CPU-intensive operation that requires the computer to do additional work and can delay other MySQL tasks. For applications that require the security provided by encrypted connections, the extra computation is warranted.

      Was stimmt denn nun? :-)

      Gruß,
      Günther

      1. Hallo,

        die mysql Developers denken in einem wesentlich größerem Rahmen. Wenn sich die Antwortzeit einer verschlüsselten mysql Anfrage von 1ms zu 10ms erhöht, dann ist es eine _deutliche_ Verlangsamung, die für Datenbanken unter schwerer Last eine erhebliche Einschränkungen bedeuten kann. Nichtsdestotrotz ist dieser Effekt für eine Datenbank, die im Schnitt vielleicht 1 Query pro Sekunde bekommt, nicht wirklich spürbar. Diese Größenordnung würde ich von deiner PHP Applikation maximal erwarten. Daher bleibe ich vorerst bei meiner Meinung.

        Aber anstelle dem Gerede gibt es nur eine Möglichkeit es wirklich zu fühlen und zu wissen: ausprobieren. :) Du wolltest doch sowieso die Verschlüsselung für die mysql Verbindung einrichten. Führe doch einen Performancetest durch einmal mit und einmal ohne Verschlüsselung. Das kannst du auch dann machen, wenn die mysql auf dem selben Server sitzt, wie die PHP Skripte, sie kommunizieren ja sowieso über TCP miteinander. Du kannst zum Beispiel das Tool namens "ab" benutzen, um Benutzeranfrage zu simulieren. Erhöhe graduell die Last und prüfe, ab welcher Anfrage pro Sekunde Marke die Performance deutlich anfängt zu fallen. Und dann poste hier bitte deine Ergebnisse. :)

        Grüße,
        Cruz

        1. Moin!

          Führe doch einen Performancetest durch einmal mit und einmal ohne Verschlüsselung. Das kannst du auch dann machen, wenn die mysql auf dem selben Server sitzt, wie die PHP Skripte, sie kommunizieren ja sowieso über TCP miteinander.

          Das stimmt nicht. Standard (und aus Performancesicht ausdrücklich zu bevorzugen) ist, dass ein lokales MySQL über eine Unix Domain Socket ansprechbar ist. Der TCP-Netzwerkcode kann sogar explizit in der Config-Datei deaktiviert werden, um die Sicherheit der Datenbank zu erhöhen: Keine TCP-Funktionalität bedeutet keine Möglichkeit, remote irgendeine DB-Abfrage direkt zu realisieren, und somit extreme Sicherheit gegen Netzwerk-Lücken in MySQL (was natürlich nichts aussagt über Lücken, die man via PHP-Skripten nutzt).

          - Sven Rautenberg

          --
          "Love your nation - respect the others."