Jan 152015
 

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:

sshd_config

Ciphers       aes256-ctr,aes128-ctr,aes256-cbc,aes128-cbc
KexAlgorithms diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
MACs          hmac-sha2-512,hmac-sha1

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.

Referenzen:

  1. https://stribika.github.io/2015/01/04/secure-secure-shell.html
  2. http://www.spiegel.de/netzwelt/netzpolitik/snowden-dokument-so-unterminiert-die-nsa-die-sicherheit-des-internets-a-1010588.html
  3. http://www.heise.de/security/artikel/SSH-SSL-IPsec-alles-kaputt-kann-das-weg-2514013.html
  4. http://www.openssh.com/
Sep 132014
 

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:

  1. Plain Text Passwort (sehr unsicher (!))
    Hier steht das Passwort im Klartext in der Spalte. Davon ist dringend (!) abzuraten!
  2. 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=
  3. MD5 Passwort (unsicher (!))
    Dabei wird das MD5-gehashte Passwort als Base64 enkodiert und „$apr1“ vorangestellt. Also z.B.: $apr1$KJJD/S8O$rY.oEVoZ.wovVwDnu1qUK1
  4. crypt
    Diese 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:

#define _XOPEN_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[])
{
    const char *salt = "$6$1234$";
    const char *pass = "test";
    char *result = crypt(pass, salt);
 
    printf("%s\n", result);
    return EXIT_SUCCESS;
}

Das Programm muss noch kompiliert und ausgeführt werden:

gcc crypt.c -o crypt -lcrypt
./crypt

Als Ausgabe erfolgt:

$6$1234$RtjH4vyYsWBTNKMNb.n8pesSjKQm4e/mTwC8kGIX4G29pNGyRUWvUETb/z1emQuQ8R6h6kou8eriOKZ0j2IAi0

SHA-512 mit Java

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:

import org.apache.commons.codec.digest.Crypt;
...
    public static String encrypt()
    {
        return Crypt.crypt("test", "$6$1234$");
    }
...

Anzeige:


Konfiguration im Apache

Die Konfiguration besteht aus zwei Teilen

  1. Die Kontaktdaten zur Datenbank
  2. Die Konfiguration der Basic Authentication

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.

Referenzen:

Aug 312014
 

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:

service mysql restart

Referenz:

http://dev.mysql.com/doc/refman/5.5/en/large-page-support.html

Aug 242014
 

MySQL lässt den verschlüsselten Zugriff mit SSL zu. Dazu sollte das passende Zertifikat im Ordner /etc/ssl hinterlegt werden.

Konfiguration

Unter Ubuntu oder Debian empfiehlt es sich, die vom Paketverwalter mitgelieferte Datei /etc/mysql/my.cnf unangetastet zu lassen. Stattdessen können im Verzeichnis /etc/mysql/conf.d beliebig viele Dateien mit Endung .cnf ergänzt werden. Für die verschlüsselte Connection legen wir daher folgende Datei in /etc/mysql/conf.d/001-ssl.cnf an:

[client]
ssl-ca      = /etc/ssl/certs/ca-certificates.crt
 
[mysqld]
ssl
ssl-ca      = /etc/ssl/certs/ca-certificates.crt
ssl-cert    = /etc/ssl/localhost-cert.pem
ssl-key     = /etc/ssl/localhost-key.pem
ssl-cipher  = DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA

Anzeige:


Das Zertifikat für Client und Server darf nicht mit SHA256 signiert werden, ansonsten erscheint folgende Fehlermeldung, wenn man sich mit dem mysql-Client verbinden will:

mysql -p
Enter password:
ERROR 2026 (HY000): SSL connection error: ASN: bad other signature confirmation

Es gibt auch einen vermeintlichen Bug unter Ubuntu 12.04 LTS. Ein dort generierter SSL-Private Key kann nicht von MySQL eingelesen werden. Mit der Anweisung kann der Schlüssel jedoch umgewandelt werden:

openssl rsa -in /etc/ssl/localhost-key.pem  -out /etc/ssl/localhost-key.pem 

Neustart

Die Datei des Private Key darf nur für Root und der Gruppe ssl-cert lesbar sein. Daher muss der MySQL-User mysql auch in die Gruppe ssl-cert eingetragen werden. Nach diesen Eintragungen muss MySQL mit

usermod -G ssl-cert mysql
service mysql restart

neu gestartet werden.


Anzeige:


Testen der verschlüsselten Verbindung

Jetzt kann überprüft werden, ob sich ein Client mit SSL verbindet. Dazu benutzt man einfach das Terminal-Programm mysql und verbindet sich mit beliebigen Benutzerdaten mit einer beliebigen Datenbank. Als nächstes gibt man nur:

status

ein und erhält folgende Ausgabe:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.2

Connection id:          5000
Current database:
Current user:           root@localhost
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.5.38-0ubuntu0.12.04.1 (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:            /run/mysqld/mysqld.sock
Uptime:                 7 days 5 hours 48 min 30 sec

Threads: 21  Questions: 321745  Slow queries: 0  Opens: 1197  Flush tables: 1  Open tables: 413  Queries per second avg: 0.514

Die Zeile mit „SSL“ deutet auf den verwendeten Verschlüsselungsalgorithmus hin.

Verschlüsselte JDBC-Verbindung

Damit die typischen Application Server auch eine verschlüsselte Verbindung zu MySQL aufbauen, ist nur ein weiterer Connection Parameter notwendig: useSSL=true. Ein kompletter Connection String könnte also so aussehen:

jdbc:mysql://localhost:3306/database?autoReconnect=true&characterEncoding=utf8&useSSL=true

Referenz:

http://dev.mysql.com/doc/refman/5.5/en/ssl-connections.html

Mrz 192014
 

Seit geraumer Zeit entwickele ich mit meinem Kollegen Dominik Pieper an einem JEE-Generator, mit dem es auf einfache Art und Weise möglich ist, eine CRUD-Webanwendung zu generieren. In einem kleinen Einführungsvideo stelle ich einen kleinen Einstieg in den Generator dar.

Der generierte Code ist eine JEE6-Applikation basierend auf JSF 2.0 und EJB 3.1. Alle Masken können vollständig generiert werden. Zusätzlich kann eigener Code zusätzlich hinzugefügt werden. Somit wird eine maximale Flexibilität gewährleistet. Weitere Features sind:

  • Rollenbaseierte Sicherheit mit JAAS
  • Lokalisierung
  • Vollständige Eclipse-Integration
  • Deployment in JBoss 7 und Glassfish 3
  • u.v.a

Anzeige:


Dez 262013
 

Die neuesten Nachrichten aus den USA über das Mitlauschen der NSA des nahezu gesamten Internet-Verkehrs hat gezeigt, dass es heißt mit Daten sehr sensibel umzugehen. Es hat sich aber auch gezeigt, dass die bloße Verschlüsselung z.B. über HTTPS alleine nicht ausreicht, da häufig Verschlüsselungsalgorithmen (z.B. RC4) eingesetzt werden, von denen man vermutet, dass die erzeugten verschlüsselten Daten von der NSA in Echtzeit mitgelesen werden können. Insbesondere Sparkassen und Banken in Deutschland bevorzugen leider immer noch RC4. Hier kann man sich z.B. bei Benutzung des Firefox dagegen schützen, indem man hier RC4 ausschaltet. Die Banken bieten häufig genug andere, bessere Verschlüsselungsalgorithmen an, sodass die Seiten weiterhin uneingeschränkt benutzt werden können. Bei itemis habe ich mit meinem Kollegen Dominik Kupschke sämtliche verschlüsselten Dienste auf sichere Algorithmen gehärtet, sodass sie z.B. gar nicht erst RC4 anbieten. Dieser Artikel soll eine Zusammenfassung dieser Ergebnisse liefern und Aufschluss über gute Verschlüsselungsverfahren bieten. Es soll hier nicht auf deren Funktionsweise eingegangen werden, hierfür gibt es genug Quellen im Internet.

Für eine gute SSL-Verschlüsselung sind vier Punkte wesentlich:

  1. Das Zertifikat
  2. Der Schlüsselaustausch für die synchrone Verschlüsselung
  3. Die synchrone Verschlüsselung
  4. Die Prüfung der Authenzität

Die verwendeten Algorithmen werden in ihrer Kombination Cipher genannt. Diese können bei den meisten Diensten konfiguriert werden.


Anzeige:


Das Zertifikat

Das Zertifikat ist ein Public Key, der von einer Zertifizierungsstelle (CA) signiert wurde, bei einem Verbindungsaufbau gegen diese Zertifizierungsstelle verifiziert werden. kann. Die entscheidende Kenngröße ist die Breite des Schlüssels. Für die typischerweise verwendeten RSA-Schlüssel sollten mindestens 2048 Bits verwendet werden. Für wirklich sensible Daten sollten mindestens 4096 Bits verwendet werden.

Der Schlüsselaustausch

Mit dem asynchronen Verschlüsselungsverfahren wird das Verteilungsproblem des Schlüssels gelöst. Mit dem Public Key kann nur verschlüsselt werden und mit dem Private Key kann entschlüsselt werden. Wie die Namen schon andeuten, darf der Public Key in fremde Hände geraten. Der Private Key verbleibt auf dem Server und muss entsprechend gegen unberechtigten Zugriff geschützt werden. Diese Verschlüsselungsart ist gegenüber der synchronen Verschlüsselungsart sehr langsam. Es gibt Verfahren, die mit asynchroner Verschlüsselung einen zufälligen synchronen Schlüssel aushandeln, der dann für den weiteren Verbindungsverlauf verwendet wird. Hier gibt es zwei herausragende Verfahren:

  1. Diffie-Hellman
  2. Elliptic Curves

Beide Verfahren behandeln sog. Perfect Forward Secrecy. Damit werden auch im Laufe der Verbindung die synchronen Schlüssel ausgetauscht. Das erhöht die Sicherheit, da mit immensen Aufwand nur ein Teil der Verbindung geknackt werden könnte. Bei den Perfect Forward Secrecy Verfahren lassen sich aufgezeichnete Verbindungen nicht mit dem Privaten Schlüssel des Servers entschlüsseln, hier spricht von man Folgenlosigkeit.  Das Verfahren, das die Elliptic Curves benutzt wurde von dem amerikanischen Normungsinstitut spezifiziert. An diesem Verfahren hat die NSA mitgewirkt und daher steht dieses Verfahren im Verdacht, eine Backdoor der NSA zu haben. Das Diffie-Hellman-Verfahren kann mit unterschiedlichen Schlüsselbreiten arbeiten. Natürlich sollte auch hier ein möglichst breiter Schlüssel verwendet werden.

Zusammenfassung:

Auch wenn Elliptic Curves performanter sind, sollte auf dieses Verfahren verzichtet werden! Das empfohlene Schlüsselaustauschverfahren lautet DH Group 15.


Anzeige:


Die synchron verschlüsselte Verbindung

Aus Gründen der Performance wird für den Datentransport synchrone Verschlüsselung verwendet. Hierbei wird zum Ver- und Entschlüsseln derselbe Schlüssel verwendet. Folgende Verfahren werden typischerweise angeboten:

  • RC4
  • DES
  • 3DES
  • AES
  • CAMELLIA

Man geht davon aus, dass RC4 von der NSA in Echtzeit mitgelesen werden kann. Daher sollte dieser Algorithmus dringend vermieden werden! Leider bevorzugen gerade viele Banken und Sparkassen diese Verschlüsselung. Im Firefox kann man die Verwendung dieser Verschlüsselung abschalten. Dazu ruft man die URL about:config auf. Im Suchfeld sucht man nach „rc4“. Die sechs angezeigten Werte werden mittels Doppelklick auf „false“ gesetzt.

RC4

DES benutzt eine Schlüsselbreite von nur 56 Bits und ist somit ebenfalls zu schwach. 3DES ist ein dreifach hintereinander durchgeführter DES. Derzeit gilt dieser Algorithmuss noch als sicher. AES ist der bevorzugte Algorithmus. Er kann mit 128, 192 und 256 Bits Schlüsselbreite verwendet werden. AES ist über einen Wettbewerb ausgeschrieben worden, der unter Anderem die Implementierung in Soft- und Hardware erleichtern soll. AES mit 256 Bits ist daher der bevorzugte Algorithmus. Java kann in der handelsüblichen Form nur AES mit 128 Bits. Diese Verschlüsselung ist dem 3DES vorzuziehen. CAMELLIA ist ein weiterer Algorithmus, der nicht selten auftaucht und ebenfalls als sicher gilt.

Zusammenfassung:

AES256 ist optimal. 3DES ist zwar noch sicher, aber AES128 ist 3DES vorzuziehen.

Die Prüfung der Authenzität

Um beim Schlüsselaustausch sog. Man in the middle-Attacken zu vermeiden, gibt es sog. HMAC-Verfahren. Hier werden Hashing-Algorithmen eingesetzt. Häufig wird SHA eingesetzt. Lässt sich SHA 256 oder SHA2 einsetzen, sollte dieser benutzt werden. Auf MD5 sollte dringend verzichtet werden.

Gesellschaftliche Aspekte

Verschlüsselung und das Abschöpfen des Internet-Verkehrs ist für IT-Laien ein undurchschaubares Thema. Im Zusammenhang mit der NSA-Affäre taucht sehr häufig das Argument auf: „Ich habe nichts zu verbergen!“. Vielleicht veranschaulicht die Tatsache, dass wir nicht nackt rumlaufen, weil wir was zu verbergen haben, diesen Unterschied. Hier muss zwischen Unschuld und Scham unterschieden werden. Man hat sich nichts zu Schulden kommen lassen und es wird durch das Abschöpfen der Internet-Daten mit gutem Gewissen nichts ans Licht kommen. Allerdings ist im Grundgesetz das Recht auf Privatsphäre festgeschrieben. Wir hängen unsere Kontoauszüge auch nicht an den nächsten Baum und hier greift das Argument: „Wenn es den Nachbarn nicht zu interesssieren hat, dann hat es die NSA auch nicht zu interessieren!“.

Die NSA schöpft ohne zu fragen die Daten ganzer Völker ab und stellt damit ganze Völker unter Generalverdacht. Das ist der Anfang eines Überwachungsstaates und untergräbt bestehende rechtsstaatliche Demokratien.

Mehr zu diesem Thema: