Verantwortlich für diese Seite ist:
Steffen A. Mork
Markenhudeweg 18
D-44267 Dortmund
Telefon: 0231/42 78 09 67
wwwadm@morknet.de
Haftungsausschluss:
Trotz sorgfältiger inhaltlicher Kontrolle übernehme ich keine
Haftung für die Inhalte externer Links. Für den Inhalt der
verlinkten Seiten sind ausschließlich deren Betreiber verantwortlich.
OpenJDK 7 kam ohne Probleme mit 4 KBit breiten Diffie-Hellman-Schlüsselaustausch klar. Aus unbekannten Gründen ist das in OpenJDK 8 nicht mehr der Fall. Da Apache 2.4 die DH-Schlüsselbreite aus der Schlüsselbreite des SSL-Zertifikats übernimmt, kann man mit OpenJDK 8 keinen Kontakt mit Webservern aufnehmen, die eine entsprechend hohe SSL-Sicherheit bieten.
Installation von OpenJDK 8 unter Ubuntu 14.04 LTS
Unter Ubuntu 14.04 ist OpenJDK 8 noch nicht in der Distribution enthalten. Um hier ein OpenJDK 8 zu installieren, muss ein PPA-Repository in der Datei /etc/apt/sources.list ergänzt werden.
deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu trusty main
Das OpenJDK 8 wird durch folgende Befehlsfolge installiert:
Die erste Befehlsfolge installiert den Repository Key lokal, um dem PPA-Repository vertrauen zu können.
Anzeige:
Installation von Bouncy Castle
Bouncy Castle eine Sammlung kryptografischer Algorithmen und enthält einen sog. Security Provider, welcher diese Algorithmen für das JRE bereitstellt. Glücklicherweise stellt Ubuntu 14.04 Bouncy Castle schon in der Distribution bereit und muss somit nur noch installiert werden:
sudo apt-get install libbcprov-java
Jetzt muss die Library aus dem Paket im OpenJDK sichtbar gemacht werden. Das erfolgt sinnvollerweise über einen symbolischen Link:
cd /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext
sudo ln -s /usr/share/java/bcprov.jar .
Als abschließenden Schritt muss der Security Provider konfiguriert werden. Mit dem Lieblingseditor – z.B. vi – wird die Datei /etc/java-8-openjdk/security/java.security geöffnet:
sudo vi /etc/java-8-openjdk/security/java.security
Relativ am Anfang der Datei befinden sich mehrere Zeilen, die mit security.provider.X beginnen. Es sind die möglichen Security Provider, die priorisiert bei der Instanziierung abgearbeitet werden. An zweiter Stelle wird folgende Zeile eingefügt:
YAKINDU statechart tools are a pretty nice tool to model statemachines. You can generate code for C/C++ and Java out of the model. Further you can validate and simulate your statemachine to verify the behaviour. If you want to integrate your statemachine into a Qt application the concept of signals and slots fits perfectly into the in and out events of the statechart definition language of the YAKINDU SCT. My new custom Qt generator links both concepts together. It generates a C++ class which links between the C++ class generated from the C++ generator of YAKINDU SCT and the custom implementation code which must be implemented for custom behaviour of your application.
The generated code implements the following methods of the statemachines base class:
Initialisation of all SCT operation callbacks (so called OCB).
A pure virtual method initializeValues() for custom value initialisation.
In events as Qt slots.
Out events as Qt signals.
Respects internal events with an extra runCycle() call.
If you have a working YAKINDU SCT running you only need to add an update site to your Eclipse. You may choose between a snapshot build or the release build.
Nach neuesten Erkenntnissen [2] und [3] ist die NSA nicht nur an HTTPS-Verkehr, sondern auch an SSH interessiert. Es ist aber nicht so, dass SSH grundsätzlich geknackt ist, sondern dass SSH-Verkehr nur unter gewissen Umständen entziffert werden kann. Werden entsprechend gute Cipher verwendet, ist auch für die NSA eine Entschlüsselung derzeit nicht möglich. Wie bei HTTPS sollten bei SSH nur die Cipher eingestellt werden, die derzeit als sicher gelten. Das ist auch nötig, da selbst in aktuellen Betriebssystemversionen (z.B. Ubuntu 12.04 LTS und 14.04 LTS) unter anderem auch RC4 möglich ist, was inzwischen als hinreichend unsicher gilt.
Bei OpenSSH werden die Ciphers nicht mit einem Kommando festgelegt. Es werden der Schlüsselaustausch, das symmetrische Kryptoverfahren und die Authenzität mit drei getrennten Kommandos eingestellt. Diese Werte können für den Server (/etc/ssh/sshd_config) und für den Client (/etc/ssh/ssh_config) auf demselben Weg konfiguriert werden. SSH beherrscht unter neueren Linux-Versionen mehr Cipher. Welche unterstützt werden, sind in der Man Page unter den entsprechenden Schlüsselwörtern einsehbar.
Anzeige:
Key Exchange
Die Schlüsselaustausch-Algorithmen für den symmetrischen Verschlüsselungsalgorithmus wird mit dem Schlüsselwort KexAlgorithms konfiguriert. Grundsätzlich sollte hier Perfect Forward Secracy verwendet werden. Das hat den Vorteil, dass selbst für mitgeschnittenen Traffic der Schlüssel nur durch Brute Force ermittelt werden muss. Hier sind je nach Version folgende Algorithmen in ihrer Reihenfolge sinnvoll:
curve25519-sha256@libssh.org
diffie-hellman-group-exchange-sha256
diffie-hellman-group-exchange-sha1
diffie-hellman-group14-sha1
diffie-hellman-group1-sha1
Clientseitig kann noch folgende Option ergänzt werden, damit nach 64 MByte Traffic ein neuer symmetrischer Schlüssel ausgehandelt wird. Das erschwert zusätzlich noch das Knacken der Daten.
RekeyLimit 64M
Symmetrische Verschlüsselung
Die symmetrische Verschlüsselung wird mit dem Schlüsselwort Ciphers konfiguriert. Auch hier eine Liste der entsprechenden Ciphers:
chacha20-poly1305@openssh.com
aes256-gcm@openssh.com
aes256-ctr
aes256-cbc
aes128-ctr
aes128-cbc
Anzeige:
Message authentication codes
Hierfür wird das Schlüsselwort MACs verwendet. Grundsätzlich sollte kein MD5 oder SHA1 verwendet werden, da sie inzwischen als weich gelten. Leider können einige SSH-Varianten keine besseren MACs als SHA1, sodass man hierauf leider noch nicht vollständig verzichten kann. Auch sollten mindestens 128 Bit verwendet werden. In den neuesten SSH-Varianten gibt es noch die Encrypt-then-Mac-Varianten, die als noch sicherer gelten. Hier die Liste der möglichen MACs:
hmac-sha2-512-etm@openssh.com
hmac-sha2-256-etm@openssh.com
hmac-sha2-512
hmac-sha2-256
hmac-sha1
Für ein Ubuntu 12.04 LTS sähe eine entsprechende Konfiguration folgendermaßen aus:
Außer den Ciphers gibt es noch weitere Einstellungen, auf die Wert gelegt werden sollte. So sollte grundsätzlich Public Key Authentication eingesetzt werden und die Passwort-Authentifizierung abgeschaltet werden:
PubkeyAuthentication yes
PasswordAuthentication no
Welche Algorithmen ein Client verwenden darf, kann zentral in der Datei /etc/ssh/ssh_config eingestellt werden. Es gibt aber noch zusätzlich die Möglichkeit, in der Datei $HOME/.ssh/config Ausnahmen zu konfigurieren, da meist ältere Hosts nicht ganz so sichere Algorithmen benutzen können. So muss man nicht die Algorithmen auf den kleinsten gemeinsamen Nenner bringen, sondern kann die besten Algorithmen als Default einsetzen.
Will man sich auf einem anderen Host einloggen, können die ausgehandelten Algorithmen und Werte mit ssh -vv eingesehen werden:
...
debug1: kex: server->client chacha20-poly1305@openssh.com none
debug1: kex: client->server chacha20-poly1305@openssh.com none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<8192<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug2: bits set: 4052/8192
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
...
debug1: Host 'trusty' is known and matches the ECDSA host key.
...
debug2: bits set: 4089/8192
debug1: ssh_ecdsa_verify: signature correct
...
Abschließende Bemerkungen
Wie bei allen asymmetrischen Verfahren ist es auch bei SSH wichtig, dass der Private Key nicht verloren geht und mit einer ausreichend harten Passphrase gesichert ist. Aus den Snowden-Dokumenten geht hervor, dass die NSA stark an den Private Keys interessiert ist und unter Umständen mit allen Mitteln versucht, an diese zu kommen. Gerade wenn keine Perfect Forward Secrecy eingesetzt wird ist das ein Problem, weil damit rückwirkend aufgezeichneter Traffic im Nachhinein entschlüsselt werden kann.
Der SSL-Server-Test bei den Qualys SSL Labs hat sich als de facto Standard zum Testen der SSL-Verschlüsselung entwickelt. Es werden vier prozentuale Ratings ermittelt und eine abschließende Qualitätsstufe. Die vier Ratings lauten:
Güte des Zertifikats
Protokoll-Support, je neuer desto besser und je weniger alte Protokolle, desto besser.
Art des Schlüsselaustauschs
Güte der Verschlüsselung
In Zusammenarbeit mit meinem Kollegen Dominik Kupschke haben wir erarbeitet, wie man einen Apache 2.4 so konfiguriert, dass man ein „A+“-Rating mit 100%/95%/100%/100% erhält.
Anzeige:
Durch dieses Rating bedingt können sich Oracle Java Clients und Windows XP-Clients nicht mehr verbinden. Für normales Web Browsing reicht das typischerweise aus. Wenn es nötig ist, dass sich auch diese Clients verbinden, sind kleinere Änderungen nötig, die weiter unten beschrieben werden.
Hinweis!Ein Apache 2.2 unter Ubuntu kann kein „A+“-Rating erreichen, weil er kein Elliptic Curve Diffe-Hellman unterstützt und einige Windows-Varianten kein Ephemeral Diffie-Hellman unterstützen.
Das Zertifikat
Ein gutes Zertifikat sollte folgende Kriterien erfüllen:
Der Common Name (CN) sollte zum Hostname passen.
Der Zeitbereich sollte passen, also nicht abgelaufen sein.
Es sollte durch eine offizielle CA signiert worden sein.
Der Schlüssel sollte mindestens 2048 Bit breit sein. Spielt Performance keine Rolle, sind 4096 Bit besser.
Das Zertifikat muss mindestens mit SHA256 signiert worden sein. Neuerdings meldet SSL-Labs Intermediate CAs als „weak“, wenn sie selbst mit SHA1 signiert wurden.
Das Zertifikat sollte nicht widerrufen worden sein und die CA sollte OCSP und CRL unterstützen.
Sind Intermediate Zertifikate im Spiel, sollten diese mit dem Apache-Befehl SSLCertificateChainFile ausgewiesen werden. Da der Befehl typischerweise in der Virtual Host-Umgebung benutzt wird, sollten auch nur die benötigten Intermediate CAs hier angegeben werden, was den SSL-Handshake beim Aufbau der Verbindung beschleunigt.
Der Protokoll-Support
Moderne Browser unterstützen mindestens TLSv1, was der Nachfolger von SSL3 ist. Da TLSv1.1 nur wenig Bedeutung findet, reicht die Aktivierung von TLSv1.0 und TLSv1.2 im globalen Server Context des Apache. In der Datei /etc/apache2/conf-enabled/ssl.conf wird daher das Protokoll global konfiguriert.
SSLProtocol all -SSLv3 -TLSv1.1
Hier kann man nur ein Rating von 95% erreichen. Für 100% müsste man auch TLSv1.0 ausschalten, was aber unter heutigen Bedingungen nicht praktikabel ist, denn es sind noch viele Browser im Feld, die kein TLSv1.2 unterstützen.
Key Exchange und Cipher Strength
Diese beiden Ratings werden im Apache im selben Kommando konfiguriert. Wir bevorzugen Ephemeral Diffie-Hellman vor Elliptic Curve Diffie-Hellman. Beides sind Perfect Forward Secrecy-Verfahren und gelten als besonders sicher. Braucht man Java und Windows XP nicht, muss Apache 2.4 tatsächlich nur vier Ciphers unterstützen. Damit der Client einen Cipher aus der Prioritätenliste des Apache benutzt, ist noch das Kommando SSLHonorCipherOrder On nötig.
Hier bietet es sich an, gleich OCSP-Stapling mit zu konfigurieren. OCSP-Stapling hat den Vorteil, dass der Apache ermittelt, ob das Zertifikat noch gültig ist und diese Information dem Client mitteilt. Dazu muss allerdings die CA OCSP unterstützen. Die CA schreibt in das Zertifikat die URL des OCSP-Responders hinein. Diese kann ganz einfach mit folgendem Kommando ermittelt werden:
Wird keine OCSP-URL ausgegeben, sollte man OCSP-Stapling sicherheitshalber abschalten (das ist Default im Apache 2.4).
Die gesamte Datei /etc/apache2/conf-enabled/ssl.conf enthält daher nur fünf Kommandos:
SSLProtocol all -SSLv3 -TLSv1.1
SSLHonorCipherOrder On
SSLCipherSuite DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA
SSLUseStapling On
SSLStaplingCache "shmcb:${APACHE_RUN_DIR}/stapling_cache(128000)"
Anzeige:
Unterstützung für Oracle Java
Leider unterstützt Oracle Java im Gegensatz zu OpenJDK keine AES-256-Bit-Verschlüsselung. Soll Java auch unterstützt werden, senkt sich leider für die Cipher Strength das Rating auf 90%. Das gesamte „A+“-Rating bleibt jedoch erhalten. Hierfür muss nur das Kommando SSLCipherSuite durch weitere Cipher ergänzt (nicht ersetzt) werden:
Oracle Java 8 und 7:SSLCipherSuite ...:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA
Oracle Java 8, 7 und 6:SSLCipherSuite ...:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:AES128-SHA
Falls die Kontrolle über alle Oracle Java Installationen gegeben ist, kann durch die Installation der Java Cryptography Extension (JCE) die Unterstützung für 256-Bit Verschlüsselungen nachgerüstet werden. Die beiden .jar Files aus diesem Zip müssen einfach in den Ordner $JAVA_HOME/lib/security/ verschoben werden. Diese Maßnahme läuft allerdings client-seitig ab und ändert nichts an den server-seitigen Einstellungen für die Java-Unterstützung.
Hinweis!Java 6 unterstützt kein Perfect Forward Secrecy!
Unterstützung für Windows XP
Obwohl Microsoft Windows XP abgekündigt hat, setzen gerade viele größere Unternehmen Windows XP mit einer erweiterten Support Lizenz ein. Sollen auch Windows XP-Clients auf die Website zugreifen können, müssen zwei Varianten unterschieden werden:
Windows XP mit Internet Explorer 8Für Windows XP muss der Cipher DES-CBC3-SHA ergänzt werden.
Windows XP mit Internet Explorer 6Diese Variante sollte nicht mehr in Betracht kommen, wird hier aber der Vollständigkeit halber mit ausfgelistet. Hierfür muss zusätzlich noch SSLv3 aktiviert werden, was auch das Protokoll-Rating von 95% auf 90% herunterzieht.
Hinweis!Windows XP unterstützt kein Perfect Forward Secrecy!
Hinweis!Wird Windows XP benötigt, Java allerdings nicht, kann Java sich trotzdem mit dem für Windows XP benötigtem Cipher DES-CBC3-SHA verbinden. Das ist an dieser Stelle kein wirkliches Sicherheitsproblem, allerdings empfiehlt es sich, trotzdem die Cipher für Oracle Java 6-8 mit zu übernehmen.
Strict Transport Security
Mit Strict Transport Security wird durch einen HTTP-Header-Eintrag dem Browser mitgeteilt, dass er für die konfigurierte Dauer diese Website ausschließlich verschlüsselt aufzurufen hat. Eine unverschlüsselte Verbindung ist für den Browser dann nicht mehr möglich. Diese Erweiterung ist schon seit ein paar Jahren in allen gängigen Browsern implementiert. Wir empfehlen eine Verwendung von einem Jahr. Die Konfiguration sollte im Virtual Host Context gesetzt sein. Das Modul mod_headers muss für die Funktion aktiviert sein.
<VirtualHost ...:443>
...
Header always set Strict-Transport-Security "max-age=31556926"
...
</VirtualHost>
In der Online-Literatur wird fast immer ergänzend der Wert includeSubDomains erwähnt. Werden mehrere Hosts unter derselben Domain verwendet, werden dadurch zu allen anderen Servern verschlüsselte Verbindungen eingefordert. Dies ist aber typischerweise nicht erwünscht und so sollte jeder Virtual Host einzel konfiguriert werden.
Hinweis! Erst HSTS sorgt bei den SSL-Labs dafür, dass aus einem „A“-Rating ein „A+“-Rating wird.
Server Name Indication
Auf Grund des Mangels an IP-Adressen, wird häufig sog. Name Based Virtual Hosting verwendet. Dabei teilen sich eine IP-Adresse mehrere Hostnames. Das führt zu Problemen bei SSL-Verbindungen, da in der Virual Host-Umgebung das richtige Zertifikat ermittelt werden muss. Da die Verbindung erstmal nur über die IP-Adresse zustande kommt, musste der SSL-Handshake um die Server Name Indication (SNI) ergänzt werden. Hier ist nur zu erwähnen, dass Windows XP und Java 6 die SNI nicht beherrschen.
An dieser Stelle sei auch erwähnt, dass die gemachten Cipher Einstellungen auch im Virtual Host Context funktionieren. Somit können in einer Apache-Instanz mehrere Virtual Hosts konfiguriert werden, in denen unterschiedlichen Anforderungen an das SSL gestellt werden.
Abschließend sei natürlich noch bemerkt, dass die Software aktuell gehalten werden muss! Nur so lassen sich Sicherheitslücken wie POODLE oder BEAST vermeiden!
Es kommt häufig vor, dass man beim Apache nicht gegen eine htpasswd-Datei authentifizieren möchte, sondern das gegen eine MySQL-Datenbank erledigen möchte. Unter Ubuntu muss zu diesem Zweck das Paket libaprutil1-dbd-mysql installiert werden:
sudo apt-get install libaprutil1-dbd-mysql
Danach müssen die passenden Module aktiviert werden. Der Restart kann erfolgen, wenn die Konfiguration angepasst wurde:
sudo a2enmod authn_dbd
Für die Datenbank sollte ein eigener DB-User eingerichtet werden, der nur Lesezugriff auf die Tabelle mit den Passwörtern hat. In unserem Beispiel heißt die Tabelle User und hat mindestens zwei Spalten names login und password. Die Spalte password sollte das verschlüsselte (Warnung) Passwort enthalten. Für den Apache ergeben sich für die Basic Authentication folgende Bedingungen für den Inhalt der password-Spalte:
Plain Text Passwort (sehr unsicher (!))Hier steht das Passwort im Klartext in der Spalte. Davon ist dringend (!) abzuraten!
SHA1 Passwort (SHA1 gilt inzwischen als weich (!)) Dabei wird das SHA1-gehashte Passwort als Base64 enkodiert und „{SHA}“ vorangestellt. Also z.B.: {SHA}YusNsXhRioN2sjZ2wmOesnMsC+g=
MD5 Passwort (unsicher (!)) Dabei wird das MD5-gehashte Passwort als Base64 enkodiert und „$apr1“ vorangestellt. Also z.B.: $apr1$KJJD/S8O$rY.oEVoZ.wovVwDnu1qUK1
cryptDiese Methode greift unter Linux auf die crypt()-Funktion der libcrypt zu. Hiermit lassen sich MD5, blowfish, SHA1, SHA-256 uns SHA-512 realisieren.
Anzeige:
Welche Methode Apache benutzt hängt also von dem einzelnen Passwort ab, so wie es in der Datenbank steht. Es lassen sich also die Passwort-Formate mischen. Mit der crypt-Variante kann man auf SHA-512 zurückgreifen. Das in der Datenbank hinterlegte Format lautet:
$6$<salt>$<40-byte-hash>
Ich will hier zwei Methoden vorstellen, wie man einen SHA-512 mit crypt-Format für die Datenbank erzeugen kann: erstens mit C und zweitens mit Java.
SHA-512 mit C
Unter Linux lässt sich unter Verwendung der crypt()-Methode, die auch Apache verwendet, ein Text mit SHA-512 hashen. Die Methode nimmt ein Passwort und ein Salt. Dem Salt wird die Hashing-Methode in "$"-Zeichen vorangestellt. Für SHA-256 ist das $5$ und für SHA-512 $6$ vorangestellt. Das folgende Code-Beispiel erzeugt einen gehashten Text aus dem Passwort „test“ und dem Salt „1234„, den der Apache verarbeiten kann:
Für Java benötigt man die Apache Commons Codec. In ihr ist eine zu Linux kompatible crypt()-Methode in der Klasse org.apache.commons.codec.digest.Crypt enthalten. Der Aufruf ist zu der mit C kompatibel und sieht im Vergleich so aus:
Die Kontaktdaten zur Datenbank müssen zwingend außerhalb der Location– bzw. Directory-Tags stehen. Die Konfiguration der Basic Authentication selbst ist einfach. Neben der üblichen Kommandos AuthType, AuthName und Require muss nur der AuthBasicProvider und die DB-Query mittels AuthDBUserPWQuery angegeben werden. Der User wird über das %s in der Query ersetzt. Das Passwort wird mit dem ersten Ergebnis der ersten Spalte verglichen. Apache wandelt das Passwort automatisch in das Format um, wie das Passwort in der Datenbank hinterlegt ist. So können sogar gemischte Werte in der Tabelle hinterlegt werden.
...
<IfModule mod_dbd.c>
DBDriver mysql
DBDParams "host=<DB-Host> dbname=<DB-Name> user=<DB-User> pass=<password>"
</IfModule>
...
<Location ...> oder <Directory ...>
AuthType Basic
AuthName "Authentifizierter Bereich"
AuthUserFile /dev/null
<IfModule mod_authn_dbd.c>
AuthBasicProvider dbd
AuthDBDUserPWQuery "SELECT u.password FROM User u WHERE user.login = %s"
Require valid-user
</IfModule>
</Location> oder </Directory>
...
Die Werte DB-Host, DB-Name, DB-User und password müssen den eigenen Gegebenheiten angepasst werden. Nachdem die Module aktiviert und der Apache konfiguriert wurde, muss er neu gestartet werden:
sudo service apache2 restart
Authentifizierung über Rollen
Das Modul mod_authn_dbd ermöglicht auch das Login über Rollen. Dazu muss statt einem Require valid-user ein Require dbd-group konfiguriert werden. Zusätzlich muss eine Query zum Ermitteln der Rolle eines Users konfiguriert werden. Dabei handelt es sich um eine Mapping-Tabelle, die vom User auf eine Gruppe zielt:
...
<Location ...> oder <Directory ...>
...
Require dbd-group
AuthzDBDQuery "SELECT ur.group FROM UserRole ur WHERE ur.user = %s"
...
</Location> oder </Directory>
...
Alternative: mod_auth_mysql
Alternativ kann man auch das Modul mod_auth_mysql benutzen. Leider wird es nur bis Apache 2.2 unterstützt, so dass ich hier nicht näher auf die Konfiguration eingehe.
Um einen möglichst hohen Performance Gewinn unter MySQL zu erzielen, sollte die Größe der Buffer Pools mindestens die Größe der Datenmenge umfassen. So funktioniert MySQL wie eine in-Memory-Datenbank. Für die Default Storage Engine InnoDB ist dafür der Parameter innodb_buffer_pool_size verantwortlich. Mit dem Tool mysqltuner kann man noch Hinweise bekommen, wie man noch weitere Parameter anpassen sollte.
Ein Beispiel für eine solche Ausgabe mit mysqltuner sieht folgendermaßen aus:
-------- Performance Metrics -------------------------------------------------
[--] Up for: 1d 0h 17m 42s (3M q [42.492 qps], 150K conn, TX: 12B, RX: 304M)
[--] Reads / Writes: 98% / 2%
[--] Total buffers: 1.5G global + 18.6M per thread (150 max threads)
[OK] Maximum possible memory usage: 4.3G (27% of installed RAM)
[OK] Slow queries: 0% (10K/3M)
[OK] Highest usage of available connections: 55% (83/150)
[OK] Key buffer size / total MyISAM indexes: 16.0M/97.0K
[OK] Key buffer hit rate: 99.1% (1K cached / 17 reads)
[!!] Query cache efficiency: 6.8% (30K cached / 443K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 13K sorts)
[OK] Temporary tables created on disk: 3% (14K on disk / 412K total)
[OK] Thread cache hit rate: 87% (19K created / 150K connections)
[OK] Table cache hit rate: 27% (584 open / 2K opened)
[OK] Open file limit used: 0% (71/41K)
[OK] Table locks acquired immediately: 100% (112K immediate / 112K locks)
[OK] InnoDB data size / buffer pool: 652.3M/1.0G
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
Variables to adjust:
query_cache_limit (> 256M, or use smaller result sets)
Anzeige:
In diesem Beispiel kann man sehen, dass die Datenmenge ohne Probleme in den Speicher passt. Ein maximaler Speicherverbrauch von 4,3 GB ist für heutige Verhältnisse schon als klein zu betrachten. Ich habe schon in meinem Artikel über die SSL-Connections beschrieben, dass man die Default-Konfiguration nicht ändern sollte und statt dessen im Verzeichnis /etc/mysql/conf.d eine weitere Konfigurationsdatei anlegen sollte. Hier können die angepassten Werte z.B. in die Datei /etc/mysql/conf.d/003-performance.cnf eingetragen werden.
Huge Pages
Einen weiteren Performance-Schub kann man erreichen, in dem der Buffer Pool Huge Pages benutzt. In meinem Artikel Huge Pages unter Linux für die JVM nutzen beschreibe ich, wie man grundlegend Huge Pages unter Linux aufsetzt. Sind die Huge Pages eingerichtet, muss der User mysql in die Gruppe eingetragen werden, die auf die Huge Pages zugreifen darf. In meinem Artikel ist das die Gruppe hugetlb. Das kann mit folgendem Befehl durchgeführt werden:
usermod -G hugetlb mysql
Damit MySQL die Huge Pages auch benutzt, muss in die Section mysqld der Parameter large-pages ergänzt werden. Danach muss MySQL nur noch neu gestartet werden: