Crypto-Policies

Siehe auch

Verwandte Artikel
Offizielle Dokumentation
Linuxfabrik

RHEL 8+ unterstützt systemweite Crypto-Policies: einmal festgelegt, werden die gewählten Verschlüsselungsalgorithmen, Ciphers, MACs usw. von einer steigenden Zahl an Bibliotheken und damit Programmen verwendet. Die Einrichtung ist zudem denkbar einfach und ohne Spezial-KnowHow mit nur einem Kommando machbar. Damit entfällt in vielen Teilen die unterschiedliche Crypto-Konfiguration einzelner Server-Prozesse. Steigen die Anforderungen an die Sicherheit, bringt ein Kommando das gesamte System auf einen neuen Stand.

Der Befehl dafür lautet update-crypto-policies. Er generiert Konfigurations-Snippets in /etc/crypto-policies/back-ends, die unter anderem von diesen Bibliotheken gelesen werden:

  • BIND

  • GnuTLS

  • Java (OpenJDK)

  • Kerberos (libkrb5)

  • Libreswan

  • NSS

  • OpenSSH

  • OpenSSL

Anwendungen und Sprachen, die eine dieser Bibliotheken verwenden, folgen damit automatisch der System-Policy. Beispiele dafür sind Apache httpd, nginx und PHP.

Begriffe

Back-End

Konfigurations-Snippet in /etc/crypto-policies/back-ends/ für eine konkrete Bibliothek (OpenSSL, OpenSSH, GnuTLS etc.). Wird beim Aufruf von update-crypto-policies aus der aktiven Policy generiert.

Bit-Security

Konservative Schätzung, wie teuer ein Brute-Force-Angriff auf einen Schlüssel in Bits wäre. LEGACY liefert mindestens 80 Bit, DEFAULT und FIPS mindestens 112 Bit, FUTURE mindestens 128 Bit.

Policy

Vollständige Definition aller erlaubten Algorithmen, Protokolle und Schlüssellängen. Dateiendung .pol. Wird in /usr/share/crypto-policies/policies/ (Distributions-Policies) oder /etc/crypto-policies/policies/ (eigene Policies) abgelegt. Der Dateiname muss in Grossbuchstaben geschrieben sein.

Sub-Policy

Modifier, der eine Policy ergänzt oder einschränkt. Dateiendung .pmod. Wird an die Hauptpolicy mit Doppelpunkten angehängt, z.B. DEFAULT:NO-SHA1:NO-SSHCBC. Auch hier müssen Dateinamen in Grossbuchstaben vorliegen.

Vordefinierte Policies

Unter RHEL 8+ sind vier Policies vordefiniert:

LEGACY

Maximale Kompatibilität zu Altsystemen. Erlaubt TLS 1.2 und 1.3, IKEv2, SSH2, RSA und Diffie-Hellman ab 2048 Bit, DSA ist deaktiviert. Liefert mindestens 80 Bit Sicherheit. Für produktive Systeme nicht mehr empfehlenswert, da aus Kompatibilitätsgründen auch in RFC 7457 dokumentierte Schwächen mitschleppt.

DEFAULT

Kompromiss zwischen Sicherheit und Kompatibilität. SHA-1 in Signaturalgorithmen ist abgeschaltet, Diffie-Hellman-Parameter müssen mindestens 2048 Bit haben. Liefert mindestens 112 Bit Sicherheit.

FIPS

Compliant zu FIPS 140. Wird automatisch aktiviert, wenn der Kernel mit fips=1 bootet. Liefert mindestens 112 Bit Sicherheit.

FUTURE

Aktuell höchste Sicherheitsstufe und enthält eine Vorbereitung auf Post-Quantum-Kryptografie in Form von 256-Bit-Symmetric-Encryption. RSA und Diffie-Hellman verlangen mindestens 3072 Bit. Liefert mindestens 128 Bit Sicherheit. Ältere Clients werden sich unter Umständen nicht mehr verbinden können.

Diese Policies sind „one-size-fits-all“. Eine feinere Anpassung ist über Sub-Policies möglich, alternativ lässt sich eine eigene Policy auf der grünen Wiese erstellen.

Folgende Ciphersuites und Protokolle sind grundsätzlich nicht mehr verfügbar:

  • 3DES (in FUTURE, DEFAULT und FIPS entfernt)

  • All binary field ECC curves (seit RHEL 6)

  • All ECC curves < 224 bits (seit RHEL 6)

  • All export grade cipher suites (seit RHEL 7)

  • DES (seit RHEL 7)

  • MD5 in signatures (seit RHEL 7)

  • SSLv2 (seit RHEL 7)

  • SSLv3 (seit RHEL 8)

Noch möglich, aber in allen Policies abgeschaltet:

  • AES-CCM8

  • All ECC curves incompatible with TLS 1.3, including secp256k1

  • ARIA

  • Camellia

  • DH with parameters < 1024 bits

  • IDEA

  • IKEv1 (seit RHEL 8)

  • Integrity-only cipher suites

  • RSA with key size < 1024 bits

  • SEED

  • TLS CBC mode cipher suites using SHA-384 HMAC

Tipp

Crypto-Policies für SSH werden durch ein Include-File bereitgestellt. Bei der Konfiguration des SSH-Daemons ist dies zwecks Reihenfolge der Parameter zu berücksichtigen.

Crypto-Policies im Vergleich

LEGACY

DEFAULT

FIPS

FUTURE

3DES

yes

no

no

no

CBC mode ciphers

yes

yes

yes

no

DH

min. 1024-bit

min. 2048-bit

min. 2048-bit

min. 3072-bit

DSA

yes

no

no

no

IKEv1

no

no

no

no

RC4

yes

no

no

no

RSA

min. 1024-bit

min. 2048-bit

min. 2048-bit

min. 3072-bit

SHA-1 and SHA-224 signatures in certificates

yes

yes

yes

no

SHA-1 in digital signatures

yes

yes

no

no

Symmetric ciphers with keys < 256 bits

yes

yes

yes

no

TLS v1.0

yes

no

no

no

TLS v1.1

yes

no

no

no

Crypto-Policy setzen

Welche Crypto-Policy wird gerade verwendet?

update-crypto-policies --show

Crypto-Policy auf FUTURE setzen:

update-crypto-policies --set FUTURE
reboot
update-crypto-policies --show

Crypto-Policy auf FIPS setzen:

fips-mode-setup --enable
# Kernel initramdisks are being regenerated. This might take some time.
reboot
fips-mode-setup --check

Achtung

Das EPEL-Repository funktioniert Stand 2020-12 unter der FUTURE Crypto-Policy nicht. Fehlermeldung: SSL certificate problem: CA certificate key too weak. Das Problem ist, dass RSA-Keys > 3072 Bit verlangt werden. Das Zertifikat auf https://download.fedoraproject.org erfüllt dies, dessen Intermediate-Zertifikate von digicert jedoch nicht (diese sind bei 2048 Bit).

Die einzelnen Crypto-Settings lassen sich in den Policy-Dateien einsehen:

cat /usr/share/crypto-policies/policies/FUTURE.pol

Crypto-Policy anpassen

Um eine bestehende Crypto-Policy anzupassen, werden sogenannte Modifier-Dateien mit der Endung .pmod und einem Dateinamen in Grossbuchstaben in /etc/crypto-policies/policies/modules abgelegt. Zum Deaktivieren von Einstellungen wird ein Minuszeichen (-), zum Aktivieren/Hinzufügen ein Pluszeichen (+) vorangestellt.

Im Beispiel sollen in der DEFAULT-Policy die Key-Exchange-Mechanismen RSA und PSK abgeschaltet werden, da sie keine Perfect-Forward-Secrecy unterstützen. Zusätzlich werden noch weitere Veränderungen an der Crypto-Policy vorgenommen:

/etc/crypto-policies/policies/modules/NO-PFS-KEX.pmod
key_exchange = -RSA -PSK
/etc/crypto-policies/policies/modules/MYCRYPTO1.pmod
sha1_in_certs = 0
min_rsa_size = 3072
/etc/crypto-policies/policies/modules/NO-CAMELLIA-CIPHER.pmod
cipher = -CAMELLIA-256-GCM -CAMELLIA-256-CBC -CAMELLIA-128-GCM -CAMELLIA-128-CBC
update-crypto-policies --show
# DEFAULT
update-crypto-policies --set DEFAULT:NO-PFS-KEX:MYCRYPTO1:NO-CAMELLIA-CIPHER
reboot

update-crypto-policies --show

Tipp

Am nachvollziehbarsten ist es, beispielsweise /usr/share/crypto-policies/policies/FUTURE.pol nach /etc/crypto-policies/policies/modules/LINUXFABRIK-FUTURE.pmod zu kopieren, anzupassen und diese per update-crypto-policies --set FUTURE:LINUXFABRIK-FUTURE zu verwenden.

Härtung gemäss CIS-Benchmark

Der CIS-Benchmark für RHEL 10 empfiehlt auf Basis der DEFAULT-Policy mehrere Sub-Policies zu kombinieren, um typische Schwachstellen flächendeckend abzudecken:

NO-SHA1

Schaltet SHA-1 in Hash- und Signaturalgorithmen sowie in Zertifikaten ab (hash = -SHA1, sign = -*-SHA1, sha1_in_certs = 0). HMAC-SHA1 bleibt bewusst aktiv, da HMAC nicht auf Kollisionsresistenz angewiesen ist.

NO-WEAKMAC

Entfernt schwache Message-Authentication-Codes mit 128-Bit Output (mac = -*-128).

NO-SSHCBC

Deaktiviert CBC-Ciphers speziell für SSH (cipher@SSH = -*-CBC). Adressiert die in CVE-2008-5161 dokumentierte Schwachstelle, bei der aus einem CBC-Chiffratblock unter Umständen bis zu 32 Bit Klartext rekonstruiert werden können.

Eine typische Kombination lautet damit:

update-crypto-policies --set DEFAULT:NO-SHA1:NO-WEAKMAC:NO-SSHCBC
reboot

Weitere vom CIS-Benchmark empfohlene Sub-Policies ausschliesslich für SSH:

NO-SSHCHACHA20

Deaktiviert ChaCha20-Poly1305 für SSH.

NO-SSHETM

Deaktiviert Encrypt-then-MAC-Varianten älterer MACs für SSH.

NO-SSHWEAKCIPHERS

Deaktiviert 3DES-CBC und AES-CBC-Varianten für SSH.

NO-SSHWEAKMACS

Deaktiviert HMAC-MD5 und UMAC-64/128 für SSH.

Die Sub-Policies werden mit Doppelpunkten aneinandergereiht. Die Reihenfolge der Modifier ist relevant: ein späterer --Eintrag überschreibt einen früheren +-Eintrag. Nicht referenzierte .pmod-Dateien werden ignoriert.

Best Practices

  • Eigene Policies und Sub-Policies ausschliesslich unter /etc/crypto-policies/policies/ bzw. /etc/crypto-policies/policies/modules/ ablegen, nie unter /usr/share/crypto-policies/. Letzteres wird durch Paket-Updates überschrieben.

  • .pol- und .pmod-Dateinamen immer in Grossbuchstaben (NO-SHA1.pmod, nicht no-sha1.pmod). update-crypto-policies wandelt den übergebenen Namen vor dem Suchen auf dem Filesystem um.

  • Nach dem Wechsel der Policy ist ein Reboot (oder zumindest ein Neustart sämtlicher betroffenen Dienste) notwendig, damit bereits laufende Prozesse die neue Konfiguration übernehmen.

  • Wer eine eigene Policy zusammenstellt, kopiert am besten eine vorhandene .pol aus /usr/share/crypto-policies/policies/ nach /etc/…/ und passt sie dort an, statt auf der grünen Wiese zu starten. Das Ergebnis lässt sich mit cat /etc/crypto-policies/state/CURRENT.pol jederzeit verifizieren.

  • Das Deployment über die LFOps-Rolle linuxfabrik.lfops.crypto_policy sorgt dafür, dass Policy und Sub-Policies konsistent über alle Systeme hinweg gesetzt werden.

Unterschiede RHEL / Debian

  • Systemweite Crypto-Policies sind eine RHEL-Eigenschaft. Debian und Ubuntu liefern das Paket crypto-policies derzeit nicht mit.

  • Unter Debian und Ubuntu erfolgt die Konfiguration weiterhin pro Dienst, etwa über /etc/ssl/openssl.cnf (OpenSSL 3 [provider_sect]/MinProtocol) und dienstspezifische Konfigurationsdateien (sshd_config, Apache SSLProtocol/SSLCipherSuite, nginx ssl_protocols/ssl_ciphers).

  • Für FIPS-Betrieb unterstützt Debian 12+ ein separates, kommerziell betreutes FIPS-Paketset; Ubuntu bietet dies über Ubuntu Pro an.