Grundlagen der Kryprographie

Stefan Miethke & Carsten Strotmann

Created: 2025-09-07 Sun 09:23

Agenda

  1. Grundlagen der Computersicherheit
  2. Kryptografie für Linux-Systemadministratoren

Grundlagen der Computersicherheit

Sicherheitseinstellungen von Linux-Systemen sollten sich an der Gefährdung des Systems orientieren

  • Wer ist der Angreifer
  • Was sind die Ziele von Angreifer
  • Was kann angegriffen werden (Daten, Ressourcen, Personen, Infrastruktur …)

Lebensdauer von Systemen

Bei der Planung von Sicherheitssystemen muss die Lebensdauer dieser Systeme berücksichtigt werden

  • Sind heute sichere System auch in 5,10,15 Jahren noch sicher?
  • Die Lebenszeit von Computersystemen verlängert sich
    • Embedded Systeme (IoT)
    • Virtualisierung (Hardware wird erneuert, die VMs werden umgezogen)
    • 'Enterprise'-Distribution mit langer Wartung (10+ Jahre)

Komplexität vs. Sicherheit

  • Unix-Systeme und Netzwerke sind komplex. Spezielle Sicherheitseinstellungen entfernen das System von der vom Hersteller gelieferten Grund-Konfiguration.
  • Die Komplexität des Systems und der Systemadministration erhöht sich.

Komplexität vs. Sicherheit

  • Spezielle Sicherheitseinstellungen sollten automatisiert eingerichtet und (regelmäßig) getestet werden. 'Configuration Orchestration' Werkzeuge können dabei helfen:
    • Ansible
    • SaltStack
    • Puppet
    • Chef
    • cfengine
  • Dabei sollte das Werkzeug keine neuen Sicherheitslücken erzeugen!

Kryptographie für Linux-Systemadministratoren

Eine kleine Einführung in Begriffe und Kryptographische Algorithmen, welche bei der Arbeit als Systemadmin vorkommen

  1. Kryptographische Hashes (Fingerprints)
  2. Hashed Message Authentication Codes (HMAC)
  3. Symmetrische Verschlüsselung
  4. Asymmetrische Verschlüsselung
  5. Digitale Signaturen

Funktionen von Kryptographie

  1. Authentisierung - die Antwort auf die Frage "wer?"
  2. Integrität - die Antwort auf die Frage "wurden Daten geändert?"
  3. Geheimhaltung - Daten Verschlüsseln so das nur der/die Empfänger die Daten lesen kann
  4. Verbindlichkeit/Nichtabstreitbarkeit - "Sage nicht Du hast es nicht geschrieben"

Kryptographische Hashes

Kryptographische Hashes sind spezielle mathematische Funktionen, welche aus beliebigen Eingabe-Daten einen digitalen Fingerabdruck fester Länge erstellen.

Kryptographische Hashes

Kryptografische Hash-Funktionen haben dabei vier Hauptmerkmale:

  • Die Berechnung des Hash-Wertes sollte einfach (nicht rechenintensiv) sein
  • Die Hash-Funktion darf nicht umkehrbar sein, d.h. es darf nicht möglich sein nur aus dem Hash-Wert die ursprünglichen Daten wiederherzustellen
  • Bei leichten Änderungen in den Eingabewerten muss sich der Hash komplett ändern
  • Es muss unmöglich sein, zwei Eingabewerte zu finden welche in den gleichen Hash-Wert resultieren

Kryptographische Hash-Funktionen werden auch Message Digest genannt.

Bekannte kryptographische Hash-Funktionen

  • MD5 (unsicher)
  • RIPEMD160
  • SHA1 (nicht mehr empfohlen)
  • SHA256
  • SHA512
  • SHA3 (Keccak)

Benutzung von kryptografischen Hash-Funktionen

  • Integritätsprüfung von Dateien und Nachrichten (z.B. nach Download)
  • Password-Prüfung (Datei /etc/shadow)
  • 'Proof-of-Work', Beweis das der Anfrager eine Arbeit geleistet hat (z.B. Bitcoin Mining)
  • Datei/Versions-ID (Beispiel 'git')

Benutzung von kryptografischen Hash-Funktionen

Kryptografische Hash-Funktionen haben keine Authentisierungs-Funktion. Das prüfen von MD5-, SHA1- oder andern Hash-Werten nach dem Download einer Datei über ungesicherte Netzwerke gibt keine Auskunft über die Quelle der Daten!

Beispiele der Benutzung von kryptografischen Hash-Funktionen

# echo "Hallo" | md5sum
3290ec3c19a8a39362f7d70043f15627  -

# echo "Hallo" | sha1sum
6ce3fe1479a10edb2f1bdd6d181a5b0e210abe1a  -

# echo "Hallo" | openssl dgst -sha1
(stdin)= 6ce3fe1479a10edb2f1bdd6d181a5b0e210abe1a

# echo "Hallo" | openssl dgst -sha256
(stdin)= 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03

# echo "Hello" | openssl dgst -sha256
(stdin)= 66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18

HMAC - Hash-based Message Authentication Codes

  • HMAC-Funktionen verbinden eine kryptografische Hash-Funktion mit einem geteilten Geheimnis (pre shared secret, PSK).
  • Ein HMAC liefert Authentisierung (die Daten kommen von einem Ersteller des HMAC mit dem PSK) und Integrität (die Daten wurden seit Erstellung des HMAC nicht verändert).
  • HMACs sind symmetrische kryptografische Signaturen.
  • HMAC-Funktionen werden z.B. SSH und DNS (TSIG) benutzt.

HMAC Algorithmen

  • HMAC-MD5 (siehe RFC 6151 "Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms")
  • HMAC-SHA1
  • HMAC-SHA256
  • HMAC-SHA512
  • HMAC-RIPEMD160

Weitere MAC-Algorithmen

  • UMAC-32/64/96/128 (OpenSSH)
  • SKEIN-256/512 (SHA3-Finalist)
  • Keccak/SHA3 (SHA3-Gewinner)
  • Poly1305-AES (RFC 7539, TLS, OpenSSH)

Beispiele: HMAC-SHA1 mit OpenSSL

echo -n "nachricht" | openssl sha1 -hmac "geheimnis"  

Symmetrische Verschlüsselung

  • Bei symmetrischer Verschlüsselung kommt sowohl beim Verschlüsseln als auch beim Entschlüsseln der identische Schlüssel zur Anwendung (Preshared Secret Key, PSK).
  • Symmetrische Verschlüsselung ist in der Regel um ein vielfaches schneller als asymmetrische Verschlüsselung

Symmetrische Verschlüsselungs-Algorithmen

  • DES (veraltet, unsicher)
  • 3DES (unsicher)
  • AES-128/256 (Rijndael)
  • Twofish (AES Finalist, OpenSSH)
  • Serpent (AES Finalist)
  • RC4 (unsicher)
  • Salsa20/ChaCha20 (RFC 7539, benutzt in OpenSSL/Android/Chrome/OpenSSH)

Beispiel: symmetrische Verschlüsselung mit OpenSSL: RC4

  • RC4 (schnell, aber ggf. nicht sicher genug)

    echo "Hallo LinuxHotel" | openssl enc -e -rc4 -a
    enter rc4 encryption password:
    Verifying - enter rc4 encryption password:
    U2FsdGVkX1+/19xWWHObEzgY8tNP8MCQUrqOO83ylzzy
    
    echo "U2FsdGVkX1+/19xWWHObEzgY8tNP8MCQUrqOO83ylzzy" \
      | openssl enc -d -rc4 -a  
    

Beispiel: symmetrische Verschlüsselung mit OpenSSL: AES

% echo "Hallo LinuxHotel" | openssl enc -e -aes256 -a
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX186OZf2oJrGRtSOHtSusHEZSapzohhY2JtlbDAdBXSYUlAVFX1UFtnM

echo "U2FsdGVkX186OZf2oJrGRtSOHtSusHEZSapzohhY2JtlbDAdBXSYUlAVFX1UFtnM" \
    | openssl enc -d -aes256 -a

Asymmetrische Verschlüsselung

  • Bei der asymmetrischen Verschlüsselung kommen Schlüsselpaare, bestehend aus öffendlichen und privaten Schlüsseln zum Einsatz.
  • Daten, welche mit dem privaten Schlüssel verschlüsselt wurden, können nur mit dem öffentlichen Schlüssel wieder entschlüsselt werden (Digitale Signatur).
  • Daten, welche mit dem öffendlichen Schlüssel verschlüsselt wurden, können nur mit dem privaten Schlüssel entschlüsselt werden.

Asymmetrische Verschlüsselung-salgorithmen

  • RSA
  • Elliptische Kurven
  • Elgamal
  • McEliece (Post-Quantum-Safe)

Asymmetrische Verschlüsselung

Orange_blue_public_private_keygeneration_de.png

Asymmetrische Verschlüsselung

Orange_blue_public_key_cryptography_de.png

Asymmetrische Digitale Signatur

Orange_blue_digital_signature_de.png

Beispiel asymmetrische Verschlüsselung mit OpenSSL (1/3)

# einen neuen privaten RSA Schlüssel erstellen
openssl genpkey -algorithm RSA -out key.pem
# den privaten Schlüssel mit AES 256bit verschlüsseln
openssl pkey -in key.pem -aes256 -out keyaes.pem
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
rm key.pem  

Beispiel asymmetrische Verschlüsselung mit OpenSSL (2/3)

# den öffentlichen Schlüssel erzeugen
openssl pkey -in keyaes.pem -pubout -out pubkey.pem
# Daten mit dem öffentlichen Schlüssel verschlüsseln
echo "Hallo LinuxHotel" > plain.txt 
openssl pkeyutl -in plain.txt -out cipher.txt -encrypt \
    -pubin -inkey pubkey.pem
cat cipher.txt | od -x -a  

Beispiel asymmetrische Verschlüsselung mit OpenSSL (2/3)

# Daten mit dem privaten Schlüssel entschlüsseln
openssl pkeyutl -in cipher.txt -out plain2.txt \
  -decrypt -inkey keyaes.pem
Enter pass phrase for keyaes.pem: 
cat plain2.txt
Hallo LinuxHotel  

Schlüsselaustausch-Protokolle

  • In verschlüsselten Kommunikationsverbindungen müssen die Kommunikationsparter oft einen gemeinsamen, geheimen Schlüssel aushandeln.
  • Das Diffie-Hellman-Verfahren erlaubt es, einen gemeinsamen geheimen Schlüssel zu errechnen, ohne das ein Angreifer mit Zugriff auf die Kommunikation diesen Schlüssel auch errechnen kann.
    • Diffie-Hellman-Schlüsselaustausch
    • Ephemeral Diffie-Hellman (Forward-Secrecy)
    • Elliptic Curve Diffie-Hellman (ECDH)
  • Achtung: Schlechte DH-Parameter vermeiden: https://weakdh.org/

Diffie-Hellmann-Schlüsselaustausch

Diffie-Hellman_Key_Exchange.png

Zufallszahlen und Linux

  • Einige kryptografische Protokolle benötigen qualitativ hochwertige (== statistisch zufällige) Zufallszahlen.
  • Die Erzeugung von echtem Zufall in einem Computersystem ist schwierig.
  • In Linux werden Zufallszahlen im Kernel per Software Cryptographically secure pseudorandom number generator (CSPRNG) erzeugt
  • Quelle für den CSPRNG sind dabei Ereignisse aus der echten Welt (Tastatur-Anschlägen des Benutzers, Interrupts der Netzwerkkarte etc)

Zufallszahlen und Linux

  • Der Linux-Kernel bietet zwei Geräte-Schnittstellen als Quelle für Zufallszahlen:
    • /dev/random - liefert Zufallsereignisse aus dem CSPRNG und kann blockieren
    • /dev/urandom - liefert Zufall aus dem CSPRNG und blockiert nicht

Zufallszahlen und Linux

linux-random-pools.png

random vs. urandom (1/2)

  • /dev/random versucht die Qualität des Zufalls im Kernel-Pool zu ermitteln und blockiert, wenn die Qualität des Zufalls zu schlecht ist. Dieses Verfahren ist unter Krypto-Experten sehr umstritten.
  • /dev/urandom liefert immer Zufallsdaten.
    • Vor Kernel 4.9 war der Pseudo-Zufallszahlen-Generator hinter /dev/urandom nicht optimal und konnte schlechten Zufall liefern
    • Ab Kernel 4.9 wird empfohlen, /dev/urandom für alle Anwendungen zu benutzen, die Zufall benötigen

random vs. urandom (2/2)

  • Linux-Software benutzt in der Standardeinstellung oft /dev/random
  • auf modernen Linux-Systemen ab Kernel 4.9 sollte, wenn möglich, die Quelle für Zufall per Konfiguration auf /dev/urandom umgestellt werden

Zufallszahlen, Virtuelle Maschinen und Linux (1/2)

  • In virtuellen Maschinen, aber auch auf echter Hardware (embedded Systemen, Raspberry-Pi, günstigen Routern), kann es vorkommen, das nicht genügend Entropie (Zufall) im Linux-System vorhanden ist.
  • Effekt ist, das Programme mit kryptografischen Funktionen (z.B. RSA-Schlüsselerzeugung) sehr lange laufen.

Zufallszahlen, Virtuelle Maschinen und Linux (2/2)

  • In solchen Situationen muss für mehr Entropie im System gesorgt werden (in absteigender Reihenfolge):
    • Einen Hardware Zufallszahlen-Generator benutzen
    • Eine CPU mit Zufallszahlen-Generator verwenden (Intel RDRAND)
    • Bei KVM/QEmu /dev/random oder /dev/urandom per VirtIO Gerät in die VM durchreichen
    • In der VM einen Entropie-Gathering-Daemon (EGD) benutzen Ein bekannter EGD für Mehr-Kern-CPU-Systeme is haveged. Der Nutzen und die Sicherheit von EGD ist umstritten.

Pseudo-Zufallszahlen per OpenSSL erzeugen (1/2)

  • Auch OpenSSL kann Zufallszahlen erzeugen.
  • Ein Zufallszahlengenerator welcher ausserhalb des Kernels läuft kann jedoch von Angreifern einfacher manipuliert werden und sollte nur in Aussnahmefällen benutzt werden (z.B. wenn die Benutzung von /dev/urandom nicht möglich ist)

Pseudo-Zufallszahlen per OpenSSL erzeugen (2/2)

  • Der nachfolgende Befehl gibt 10 Pseudo-Zufallszahlen im hexadezimaler Format aus. Der Pseudo-Zufallszahlen-Genertator wird hierbei aus der Datei ~/.rnd und /dev/urandom initialisiert ("seeding"):
openssl rand -rand /dev/urandom -hex 10
% ls -l ~/.rnd
-rw-------. 1 nutzer nutzer 1024 Nov 22 22:12 /home/cas/.rnd
  • OpenSSL legt in der Datei ~/.rnd Entropie für spätere Aufrufe ab.