IT security, FreeBSD, Linux, mail server hardening, post-quantum crypto, DNS, retro computing & hands-on hardware hacks. Privater Tech-Blog seit 2003.

Schlagwort: InfoSec (Seite 8 von 14)

2048 bit Elliptic Curve Diffie-Hellman (ECDH) – Java 8 und Openfire

Kleinere Schlüssel als 2048bit sollte man mit Elliptic Curve Diffie-Hellman (ECDH) ja nicht mehr nutzen. Seit Java Version 1.8 ist dieses auch unterstützt. Wer also seinem Openfire xmpp/jabber Server diese Möglichkeit unterschieben möchte, sollte auf ein Oracle Java 1.8 setzen!

Wie also nun Java 8 dazu überreden? Auf einem Debian 8 (jessi) oder ähnlichem klappt es, wie folgt:

Möglichkeit Nummer 1. Zentral für alle Java Prozesse:

$ vim /usr/lib/jvm/java-8-oracle/jre/lib/security/java.security
jdk.tls.ephemeralDHKeySize=2048

Möglichkeit Nummer 2. Nur für den Openfire, einfach beim Start mit übergeben:

$ vim /etc/default/openfire
# Additional options that are passed to the Daemon.
DAEMON_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"

Um zu prüfen ob alles auch sauber umgesetzt ist hilft wie immer xmpp.net:

https://xmpp.net/result.php?id=7146

https://xmpp.net/result.php?id=7134

Oh ja, über Openfire AES 256 und JCE Unlimited Strength Jurisdiction Policy Files  müssen wir jetzt nicht mehr sprechen, oder? Ebenfalls nicht darüber, wie bei Openfire unsichere Cipher und Protokolle deaktivieren, oder?

Puhh… das was angenehm einfach oder? Bei Fragen, fragen.

Fragen? Einfach melden.

Ein Blick auf die Apache Header

TLS allein reicht nicht. Auch mit einem A+ bei Qualys SSL Labs fehlt ein wichtiger Teil: die HTTP-Security-Header. Sie schützen vor Cross-Site-Scripting, Clickjacking und MIME-Sniffing. Trotzdem setzen die wenigsten Webserver sie. Einen schnellen Überblick gibt securityheaders.com.

Modul aktivieren

Apache braucht das Headers-Modul. Unter Debian/Ubuntu:

a2enmod headers
service apache2 restart

Für spätere Konfigurationsänderungen reicht ein Reload (service apache2 reload).

Header setzen

Die Header können global in /etc/apache2/conf-enabled/security.conf oder pro vHost in der jeweiligen Konfigurationsdatei gesetzt werden:

ServerTokens Prod
ServerSignature Off
TraceEnable Off

Header set X-Content-Type-Options: "nosniff"
Header set X-Frame-Options: "sameorigin"
Header set X-Permitted-Cross-Domain-Policies: "master-only"
Header set X-XSS-Protection: "1; mode=block"
Header unset X-Powered-By

Was die einzelnen Einstellungen bewirken

ServerSignature Off entfernt die Serverversion aus Fehlerseiten. ServerTokens Prod reduziert den Server-Header auf das Wort „Apache“, ohne Versionsnummer. Komplett entfernen lässt sich der Header im Standard-Apache nicht. Es gibt dazu einen Bug-Report mit WONTFIX. Manche Distributionen patchen das, sonst muss man selbst kompilieren oder damit leben.

TraceEnable Off deaktiviert die HTTP-TRACE-Methode serverweit.

X-Frame-Options: sameorigin verhindert, dass die Seite in fremde iframes eingebettet wird. Wer Einbettungen braucht, sollte diesen Header weglassen oder auf Content-Security-Policy: frame-ancestors umsteigen.

X-Content-Type-Options: nosniff verhindert MIME-Type-Sniffing im Browser. X-XSS-Protection aktiviert den XSS-Filter in älteren Browsern. Moderne Browser setzen stattdessen auf Content Security Policy (CSP).

Header unset X-Powered-By entfernt den PHP-Versionsheader, sofern vorhanden.

Ergebnis prüfen

Nach dem Reload die eigene Domain auf securityheaders.com scannen. Die Bewertung sollte sich deutlich verbessert haben.

Fragen? Einfach melden.

Firefox OCSP-Stapling Fehler bei StartSSL beheben

Veraltet: StartSSL wurde 2017 von allen Browsern als nicht mehr vertrauenswürdig eingestuft und hat den Betrieb eingestellt. OCSP Stapling ist weiterhin relevant, aber die hier beschriebene Fehlerursache (StartSSL OCSP-Responder) existiert nicht mehr.

Natürlich ist bei mir OCSP Stapling am Apache 2.4 aktiviert…. Doch plötzlich zeigt mir meine Webseite beim Besuch mit dem Mozilla Firefox folgende Fehlermeldung:

Secure Connection Failed

An error occurred during a connection to www.kernel-error.de. The OCSP server suggests trying again later. (Error code: sec_error_ocsp_try_server_later)

    The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.
    Please contact the website owners to inform them of this problem.

Im Error Log des Webservers finden sich zur gleichen Zeit Logmeldungen wie:

[Mon Aug 10 07:06:28.572899 2015] [ssl:error] [pid 23648] (70007)The timeout specified has expired: [client 1.2.3.4:23726] AH01977: failed reading line from OCSP server
[Mon Aug 10 07:06:28.572924 2015] [ssl:error] [pid 23648] [client 1.2.3.4:23726] AH01980: bad response from OCSP server: (none)
[Mon Aug 10 07:06:28.572950 2015] [ssl:error] [pid 23648] AH01941: stapling_renew_response: responder error

Ahja… bad response from OCSP Server…. Habe ich nun irgendwo Mist konfiguriert oder hat wirklich der OCSP Server meiner CA StartSSL / StartCOM ein Problem? Mein Verdacht ist natürlich, dass es an der CA liegen muss. ;-P

Am schnellsten Teste ich es einmal von Hand auf meinem Client. Ist hier das gleiche Problem, liegt es sicher an der CA. Wie also manuell per openssl testen ob der OCSP Server tut was er will? Ganz einfach, so:

Als erstes einmal den öffentlichen Teil meines Zertifikates herunterladen und in einer Datei speichern:

# openssl s_client -connect www.kernel-error.de:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > www.kernel-error.de.pem

Jetzt das Intermediate besorgen. Dieses sollte ja ebenfalls mein Server senden, also hole ich es von dort. Dabei ist hier nun etwas copy & paste Arbeit nötig. Folgendes wirft mir einiges um die Ohren:

# openssl s_client -connect www.kernel-error.de:443 -showcerts 2>&1 < /dev/null

Hier ist kopiere ich mir nun das Intermediate Zertifikat heraus in das File interm.pem. Spannend ist dabei das Zertifikat zu:

 1 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
   i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
-----BEGIN CERTIFICATE-----
MIIGNDCCBBygAwIBAgIBGzANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW

Dabei alles ab —–BEGIN CERTIFICATE—– bis einschließlich —–END CERTIFICATE—–

In meinem Zertifikat sollte der OCSP Server meiner CA hinterlegt sein. Diesen lasse ich mir nun mit folgendem Befehl ausgeben:

# openssl x509 -noout -ocsp_uri -in www.kernel-error.de.pem
http://ocsp.startssl.com/sub/class2/server/ca

Perfekt… Nun habe ich alle Informationen zusammen um einen manuellen Test gegen den OCSP Server meiner CA zu fahren:

# openssl ocsp -issuer interm.pem -cert www.kernel-error.de.pem -text -url http://ocsp.startssl.com/sub/class2/server/ca
OCSP Request Data:
    Version: 1 (0x0)
    Requestor List:
        Certificate ID:
          Hash Algorithm: sha1
          Issuer Name Hash: B9B2D56DB021B36E42F627245806C4A9A6979AEB
          Issuer Key Hash: 11DB2345FD54CC6A716F848A03D7BEF7012F2686
          Serial Number: 06D8F968657B18
    Request Extensions:
        OCSP Nonce: 
            04109228F685EAF4211B1A6D6CCF67AD9CC9
Error querying OCSP responder
34379249832:error:27076072:OCSP routines:PARSE_HTTP_LINE1:server response error:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/ocsp/ocsp_ht.c:255:Code=400,Reason=Bad Request

Hm… Sehr eindeutig, oder? Es scheint also wirklich ein Problem am Server der CA zu geben. Eine kurze E-Mail an die CA später habe ich, auf die Frage ob es ein Problem mit dem OCSP Server gibt, die folgende Antwort in meinem Postfach:

Yes. It would be fixed asap.

-- 
Regards
 
Signer:  	Kirill Ivanov, VO
  	StartCom Ltd.

Na wunderbar… Damit schalte ich also OCSP Stapling mal wieder aus, bis meine CA wieder korrekt arbeitet!

SSLUseStapling Off

Bis spööööter 😀

Certificate Transparency Support – StartSSL

Veraltet: StartSSL wurde 2017 von allen Browsern als nicht vertrauenswürdig eingestuft. Certificate Transparency ist heute bei allen CAs Pflicht und erfordert keine gesonderte Konfiguration mehr.

Google hatte 2014 eine weitere Idee um Zertifikate „vertrauenswürdiger“ zu gestalten. Alles unter dem Namen: „Google’s Certificate Transparency project“ http://www.certificate-transparency.org/ Hat man eine CA „geknackt“ oder entsprechenden Einfluss (z.B.: als Staat), kann man sich für beliebige Domains gültige Zertifikate ausstellen. Der jeweilige User rutscht also auf einer Webseite herum, die Verbindung ist verschlüsselt und das Zertifikat ist sauber. Ihm fällt also erst einmal nichts auf und somit fühlt sich der User sicher…. Genau diesen Punkt möchte Googles Idee verbessern! Die jeweilige CA „veröffentlicht“ das erstellte Zertifikat. So können die Clients/Browser diese „Logs“ absuchen und somit herausfinden, welches Zertifikat für welche Domain wohl das gültige ist. So lassen sich untergeschobene Zertifikate finden. OK, es gibt da schon Wege: – DNSsec – TLSA/DANE – Public Key Pinning (HPKP) Warum also etwas neues? Tja…. Dieses sind alles Techniken, welche der Admin selbst nutzen muss. Der Admin muss aktiv etwas tun. Bei Googles CT übernimmt diese Arbeit im Grunde die CA selbst. Maximal muss man noch einen kleinen Hacken setzten, fertig. Zertifikatsproblem Über Sinn und Unsinn kann man sich nun streiten. Ändert aber nichts, da Google dieses einfach in ihren Browser fest eingebaut hat. Möchte man nun also kein gelbes Ausrufezeichen in der Adresszeile vom Chrome haben, muss die eigene CA CT unterstützen und das Zertifikat veröffentlichen. StartSSL/StartCOM tut dieses bisher noch nicht. Ich habe aber folgende Info bekommen: There will be support shortly for submitting to the CT logs and installing the response for CT aware web servers (TLS extension). Support for the latter is lacking for a large part, but it should get better over time, most likely Apache first. Wenn ich mehr habe, gibt es mehr.
U-P-D-A-T-E Ich habe mal nach einem Zeitplan gefragt: I’m not sure about that, but the minute it’s supported there will be a new tool at the StartSSL Tool Box of your account. Tja… Na dann! -_-

Apache 2.4 und Diffie-Hellman DHE mit 4096bit

Kaum geht mein Artikel zur erweiterten Sicherheit meiner Webseite online >>TLS Sicherheit weiter verschärft….<< schon kommen Fragen. Eine habe ich nun schon vier mal bekomme, daher hier direkt die Antwort. Ach ja, die Frage:

Wie habe ich meinen Apache dazu überredet DHE-Keys mit 4096bit zu benutzen?

Also… Der Apache beherrscht seit Version 2.4 Diffie Hellman mit mehr als 1024bit. Um dieses nutzen zu können, muss der Apache die passenden dh-params haben. Der Apache nutzt dabei automatisch die ihm gegebene Key stärke.

Ich generiere den DH Teil gerne direkt mit dem jeweiligen Zertifikat und verbinde dieses. Beschrieben habe ich es hier: >>Sicheres SSL / TLS Zertifikat<<

Wer gerne nachträglich generieren möchte macht es mir:

$ openssl gendh 4096 > dh_4096.pem

Dieses lässt sich nun einfach wie ein normales Zertifikat mit in die Konfiguration des Apachen einbinden. Im Grunde nichts besonders und nachdem man es gelesen und absolut einleuchtend, man sucht aber dann doch zuerst etwas.

Viele andere Dienste (Postfix usw…) bringen ja meist einen eigenen Konfigurationspunkt dafür mit. Im Apache liegt es ohne große Konfiguration in Zertifikatsnähe.

easy

So long….

Fragen? Einfach melden.

TLS Sicherheit weiter verschärft….

Moin moin, nach meiner letzten Anhebung der TLS Sicherheit im Blog hat sich niemand beklagt. Ein gutes Zeichen… Meine Leser und Besucher scheinen alle recht aktuelle Systeme im Einsatz zu haben. Auch die Graphen verzeichnen keinen nennenswerten Einbruch. Gut gut… Also legen wir mal eine Schüppe drauf, oder? Wenn jetzt keiner Probleme bekommt, fällt mir auch nicht mehr viel ein. TLS Bewertung qualys In diesem Sinne….

Fragen? Einfach melden.

FreeBSD: Verschlüsseltes ZFS-Backup auf USB-Platte mit geli

Ein Notebook mit Full-Disk-Encryption verdient auch ein verschlüsseltes Backup. Plan: ZFS-Snapshots per zfs send auf eine USB-Platte schieben, die komplett mit geli verschlüsselt ist. Schlüssel und Passphrase sicher aufbewahren — fertig.

Hinweis: Seit OpenZFS 2.0 (FreeBSD 13+) gibt es native ZFS-Verschlüsselung (zfs create -o encryption=aes-256-gcm). Damit entfällt geli als Zwischenschicht. Auf älteren Systemen oder wenn man die gesamte Platte unabhängig vom Dateisystem verschlüsseln will, bleibt geli die richtige Wahl.

USB-Platte verschlüsseln

Platte einstecken und per dmesg das Device identifizieren — in diesem Fall da0. Dann mit gpart eine neue GPT-Partitionstabelle anlegen und eine Partition erstellen.

geli braucht einen Schlüssel aus Zufallsdaten:

dd if=/dev/random of=./backup-key bs=256 count=1

Mit diesem Schlüssel die verschlüsselte Partition einrichten:

geli init -s 4096 -K ./backup-key -l 256 /dev/da0s1
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/da0s1.eli and
can be restored with the following command:

    # geli restore /var/backups/da0s1.eli /dev/da0s1

Partition öffnen:

geli attach -k ./backup-key /dev/da0s1
Enter passphrase:

ZFS-Pool anlegen

Auf der geöffneten geli-Partition (da0s1.eli) den ZFS-Pool erstellen:

zpool create usb-backup /dev/da0s1.eli

zpool list
NAME         SIZE  ALLOC   FREE  CAP  HEALTH
zroot        460G   184G   276G  40%  ONLINE
usb-backup   928G   296K   928G   0%  ONLINE

Backup starten

Initiales Vollbackup per zfs send -R (rekursiv, alle Datasets und Snapshots):

zfs send -R zroot@auto-2015-05-23-21-00-00 | zfs recv -u usb-backup/notebook

Die Option -R sendet alles rekursiv. Die Option -u beim Empfänger verhindert, dass die Datasets auf der USB-Platte gemountet werden. Bei allen folgenden Backups muss nur noch die Differenz zwischen zwei Snapshots übertragen werden.

Platte sicher aushängen

Drei Schritte in der richtigen Reihenfolge:

  • Sync erzwingen — alle Daten sicher auf die Platte schreiben
  • ZFS-Pool exportieren
  • geli-Partition schließen
sync
zpool export usb-backup
geli detach /dev/da0s1

Wichtig: Den Schlüssel (backup-key) an einem dritten Ort aufbewahren — weder auf dem Notebook noch auf der Backup-Platte. Ohne Schlüssel und Passphrase sind die Daten nicht wiederherstellbar.

Mehr zu ZFS-Backups: Automatische ZFS-Snapshots und ZFS send/recv Fehler beheben. Fragen? Einfach melden.

Neues StartSSL S/MIME Zertifikat

Veraltet: StartSSL wurde 2017 von allen Browsern als nicht vertrauenswürdig eingestuft und eingestellt. Kostenlose S/MIME-Zertifikate gibt es bei Actalis.

Zwei Jahre sind schon wieder um. Das bedeutet es gibt ein neues S/MIME Zertifikat, da mein altes bald ungültig wird. Hier nun die Daten für interessierte zum Abgleich!

So long

ALT
Zertifikat-Fingerabdruck
SHA1:	7F 8B 92 19 FF 07 BF EB 8E E0 18 D4 98 B8 48 DF E3 0E 4A 85
Läuft ab: 16.05.2015
Signatur-Algorithmus:	SHA1 mit RSA 2048 Bit

 

NEU
Zertifikat-Fingerabdruck
SHA1:	F6 00 F9 B0 DB BF B9 C5 C1 58 03 B2 78 11 84 A7 F1 E8 96 6D
Läuft ab: 08.05.2017
Signatur-Algorithmus:	SHA256 mit RSA 4096 Bit

 

Fragen? Einfach melden.

Neues Zertifikat

Einige haben es ja schon gesehen, ich habe nun doch vorzeitig mein Zertifikat von SHA1 auf SHA2 (SHA256) gehoben. Nein, ich habe nicht für das Widerrufen bezahlt. Wer ins Zertifikat schaut, wird schon sehen wie ich es gemacht habe. Damit bin ich dann wohl erst einmal wieder A+…. Fragt sich für wie lange. OCSP stört mich noch etwas, nicht unbedingt nötig, denn noch finde ich es ~unschön~! Jetzt nicht so unschön, dass ich es unbedingt sofort angehen muss; dennoch ist es irgendwie unschön!

 

So long.

Fragen? Einfach melden.

Openfire: Unsichere TLS-Cipher und Protokolle über Java deaktivieren

Openfire bringt in der Stable-Version keine Möglichkeit mit, schwache TLS-Cipher oder veraltete Protokolle wie SSLv3 zu deaktivieren. Die Nightly Builds haben das bereits im Default behoben, die Stable hinkt hinterher. Da Openfire auf Java läuft, lässt sich das Problem über die Java-Security-Konfiguration lösen.

Openfire Logo

java.security anpassen

Die Datei /usr/lib/jvm/java-8-oracle/jre/lib/security/java.security (Pfad je nach Distribution und Java-Version) enthält zwei relevante Einstellungen. Beide dürfen nur einmal in der Datei vorkommen.

Schwache Algorithmen für Zertifikatsketten deaktivieren:

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024

Unsichere TLS-Cipher und Protokolle deaktivieren. Die Liste verbietet SSLv3, alle RC4-Cipher, alle Export-Cipher, alle anonymen DH-Cipher und veraltete 3DES-Varianten:

jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, DESede, \
  SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA, \
  SSL_DH_anon_EXPORT_WITH_RC4_40_MD5, \
  SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, \
  SSL_DH_anon_WITH_DES_CBC_SHA, \
  SSL_DH_anon_WITH_RC4_128_MD5, \
  SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, \
  SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, \
  SSL_RSA_EXPORT_WITH_RC4_40_MD5, \
  SSL_RSA_WITH_NULL_MD5, \
  SSL_RSA_WITH_NULL_SHA, \
  TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, \
  TLS_ECDH_anon_WITH_RC4_128_SHA

Das ist eine gekürzte Liste der wichtigsten Einträge. Je nach Sicherheitsanforderung kann man weitere Cipher hinzufügen. Oracle dokumentiert die Optionen unter den Stichworten "Java Algorithm restrictions for SSL/TLS" und "certification path processing".

JCE Unlimited Strength

Standardmäßig begrenzt Java die Schlüssellänge auf 128 Bit. Für AES-256 braucht man die JCE Unlimited Strength Jurisdiction Policy Files. Bei neueren Java-Versionen (ab 8u161) ist das per Default aktiv, bei älteren müssen die Policy-Dateien manuell installiert werden.

Aktivieren

Openfire neu starten. Die Änderungen in java.security wirken sofort beim nächsten Java-Start. Danach sollte ein TLS-Test nur noch aktuelle Cipher und Protokolle zeigen.

XMPP IM Observatory Score A

Wer zusätzlich Probleme mit S2S-Verbindungen hat: Im Beitrag zum 404 Remote Server Not Found ist das Thema fehlende Intermediate-Zertifikate beschrieben.

Fragen? Einfach melden.

« Ältere Beiträge Neuere Beiträge »

© 2026 -=Kernel-Error=-RSS

Theme von Anders NorénHoch ↑