FHEM/TcpServerUtils.pm: Featurewunsch stärkere TLS Verschlüsselung Webfrontend

Begonnen von Patrik.S, 13 März 2015, 22:11:32

Vorheriges Thema - Nächstes Thema

Patrik.S

Hallo,

Bedingt durch die vielen doch relativ sensiblen Daten, die in einer fhem.cfg hinerlegt sind (z.B. Enigma Plugin mit Klartext Zugangsdaten oder alleine vom Inhalt Rückschlüsse auf die verbauten Komponenten im Haus), ist mir schon lange trotz der SSL Verschlüsselung des Webfrontend unwohl.
Da sicher eine Menge an Leuten ihr Fhem auch übers Internet erreichbar gemacht haben, wäre dieser Änderungswunsch im Sinne von allen.

Durch mittlerweile CRIME, BEAST, POODLE und nun auch der FREAK Attack und nun auch RC4 auf der no-go Liste ist die von FHEM benutzte SSL Verschlüsselung nicht mehr Zeitgemäß.
Es muss mind. TLSv1 her und die Cipher Suiten die als unsicher gelten müssen auch ausgeschaltet werden.

Das Perl Modul IO::Socket::SSL bringt eine sehr geringe Stufe der Absicherung mit.
Siehe auch http://search.cpan.org/~sullr/IO-Socket-SSL-2.012/lib/IO/Socket/SSL.pod Teil "Set 'SSL_version' or 'SSL_cipher_list' to a "better" value."

Wer ein start_SSL($Server) ohne weitere Optionen macht, bekommt den Default des Moduls
/usr/share/perl5/IO/Socket/SSL.pm
use constant DEFAULT_CIPHER_LIST => 'ALL:!LOW';   --> also auch alle Medium und aNULL und eNULL
use constant DEFAULT_VERSION     => 'SSLv23:!SSLv2';   --> Wenn der Client vorgibt, nur SSLv3 zu können ist hiermit ein Fallback von TLSv1.2 runter auf SSLv3 möglich.

Ein Test mit Firefox und geänderter about:config Einstellungen zeigt das es sehr einfach ist auf SSLv3 runterzugehen
security.tls.version.min = 0
security.tls.version.max = 0
Client Hello SSL 3.0 ---->
<---- Server Hello SSL 3.0

FREAK Attack: Cipher Suiten mit RSA_EXPORT sind dann auch möglich (z.B. TLS_RSA_EXPORT_WITH_DES40_CBC_SHA (0x0008)), weil das zugrundeliegende OpenSSL auf meinem System einfach zu alt ist und nicht ohne weiteres hochgezogen werden kann.

In der FHEM/TcpServerUtils.pm müssen dazu in der sub TcpServer_Accept($$) zwei Zeilen in die start_SSL eingefügt werden, SSL_version und SSL_cipher_list.

    my $ret = IO::Socket::SSL->start_SSL($clientinfo[0], {
      SSL_version => 'TLSv12:!SSLv3',
      SSL_cipher_list => 'HIGH:!RC4:!eNULL:!aNULL',

      SSL_server    => 1,
      SSL_key_file  => "$mp/certs/server-key.pem",
      SSL_cert_file => "$mp/certs/server-cert.pem",
      Timeout       => 4,
      });


Gruß  Patrik

Loredo

Meine Empfehlung, um dies besser abzusichern: Nutze einen Reverse Proxy, auf dem die SSL Verschlüsselung terminiert. Dort kannst du alle Finessen einsetzen, die du so im Netz findest.
Ich persönlich bin ein sehr großer Fan von HAproxy für diesen Zweck. All diese Funktionen in FHEM erneut zu implementieren macht IMHO keinen wirklichen Sinn. Ich bin ein Fan von Funktionstrennung - FHEM hat seine Stärken, die man perfekt mit anderer OpenSource Software bei der Systemintegration ergänzen kann.


Meine HAproxy Config inkl. TLS Optimierungen kannst du in Github einsehen (wird im Hoanoho Image verwendet):
https://github.com/Hoanoho/HSE/tree/master/lib/cfg/any/stat/etc/haproxy
https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/dyn/etc/haproxy


Die Konfig ist etwas gepimpt, um statt HTTP-Auth auch über eine PHP Webapplikation (bzw. deren Cookie) authentifiziert werden zu können.
Du kannst in HAproxy aber auch per SSL-Zertifikat authentifizieren.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

betateilchen

Zitat von: Patrik.S am 13 März 2015, 22:11:32
Da sicher eine Menge an Leuten ihr Fhem auch übers Internet erreichbar gemacht haben,

DA liegt das eigentliche Problem - sowas tut man einfach nicht. Basta.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Habe die Vorschlaege eingebaut, mit FireFox (FHEMWEB) und socat (telnet) getestet, und eingecheckt.

Tion

FHEM@CT||RFXTRX,CUL868@MAX,HM-Usb,JeeLink
Jee:TX29DTH-IT||Max:Thermostat,ShutterContact,
HM:SEC-MDIR,LC-SW1-PL2,LC-Dim1TPBU-FM,PB-2-WM55
RFX:FA20RF/2, HE501EU,ITL-230,OWL Intuition-lc,YCT-100,div Brennstuhl,IT 1500
FS20:IRU,KSE||FbDect 200,EG-PM2-LAN

Patrik.S

Danke für das einbauen.

Damit werden auch die 80% User abgeholt, die unbedarft ihr Fhem betreiben und von den potentiellen Sicherheitslücken der mitbenutzten 3rd Party Produkte gar nichts wissen oder nicht wissen wie sie es lösen sollen.

Trotzdem noch ein Hinweis wegen der anderen Antworten. Denn was man alles nicht machen sollte und die meisten aber machen sind leider zwei paar Schuhe.
Fhem nur auf Localhost laufen zu lassen ist keine Option, sobald es ein entfernter Rechner ist, speziell bei der Fritz.Box Variante.
define WEB FHEMWEB 8083
Ein RPi oder andere Systeme könnten das machen, dann muss da aber extra ein Monitor&Tastatur ran, nur um das Frontend sehen zu können.
Ober es muss ein TLS Entpunkt installiert werden, der zwischen der bösen Internetwelt und Local Host vermittelt.
Das ist für die meisten einfach zu viel. Das ist wie in den Anfängen von WLAN. Erstmal ohne Verschlüsselung und weils dann funktioniert hat, belässt man es so. Kopfschüttel.....

Also doch wieder mit define mit global
define WEB FHEMWEB 8083 global

Und Anwender nutzen meist den Weg des geringsten Widerstandes und stetzen aus gutem Glauben vielleicht noch die mitgelieferten Attribute und dann haben wir eine SSL geschütztes im Heimnetzwerk erreichbares Frontend, welche Pwasswort geschützt ist.
define WEB FHEMWEB 8083 global
attr WEB HTTPS 1
attr WEB basicAuth .........


HolyMoly

Ich weiß nicht ob sich die letzten Tage was an IO::Socket::SSL geändert hat aber mit Safari 9.0.2 komme ich neuerdings nicht mehr auf fhem. Mit Firefox und Chrome geht es weiterhin. Nachdem ich fest SSLv23 gesetzt habe geht es wieder.  >:(
Wenn ich TLSv12:!SSLv3:!SSLv23 setze geht es wieder nicht, d.h. der Fallback geht nicht.


DEBUG: .../IO/Socket/SSL.pm:2688: new ctx 10615088
DEBUG: .../IO/Socket/SSL.pm:1432: start handshake
DEBUG: .../IO/Socket/SSL.pm:901: starting sslifying
DEBUG: .../IO/Socket/SSL.pm:948: Net::SSLeay::accept -> -1
DEBUG: .../IO/Socket/SSL.pm:951: SSL accept attempt failed

DEBUG: .../IO/Socket/SSL.pm:951: local error: SSL accept attempt failed error:1408A10B:SSL routines:SSL3_GET_CLIENT_HELLO:wrong version number
DEBUG: .../IO/Socket/SSL.pm:2721: free ctx 10615088 open=10639544 10615088
DEBUG: .../IO/Socket/SSL.pm:2733: OK free ctx 10615088
2015.12.21 10:43:00 1: FHEMWEB SSL/HTTPS error:

Das riecht irgendwie nach einem Fehler in IO::Socket::SSL, aber bevor ich den Paketautor nerve:
Hat hier jemand Safari, aktuelles IO::Socket::SSL und TLSv12:!SSLv3 am laufen?
FHEM auf Raspi2 & Radxa Rock

Niko_K

Zitat von: HolyMoly am 21 Dezember 2015, 11:00:36
Ich weiß nicht ob sich die letzten Tage was an IO::Socket::SSL geändert hat aber mit Safari 9.0.2 komme ich neuerdings nicht mehr auf fhem. Mit Firefox und Chrome geht es weiterhin. Nachdem ich fest SSLv23 gesetzt habe geht es wieder.  >:(
Wenn ich TLSv12:!SSLv3:!SSLv23 setze geht es wieder nicht, d.h. der Fallback geht nicht.


DEBUG: .../IO/Socket/SSL.pm:2688: new ctx 10615088
DEBUG: .../IO/Socket/SSL.pm:1432: start handshake
DEBUG: .../IO/Socket/SSL.pm:901: starting sslifying
DEBUG: .../IO/Socket/SSL.pm:948: Net::SSLeay::accept -> -1
DEBUG: .../IO/Socket/SSL.pm:951: SSL accept attempt failed

DEBUG: .../IO/Socket/SSL.pm:951: local error: SSL accept attempt failed error:1408A10B:SSL routines:SSL3_GET_CLIENT_HELLO:wrong version number
DEBUG: .../IO/Socket/SSL.pm:2721: free ctx 10615088 open=10639544 10615088
DEBUG: .../IO/Socket/SSL.pm:2733: OK free ctx 10615088
2015.12.21 10:43:00 1: FHEMWEB SSL/HTTPS error:

Das riecht irgendwie nach einem Fehler in IO::Socket::SSL, aber bevor ich den Paketautor nerve:
Hat hier jemand Safari, aktuelles IO::Socket::SSL und TLSv12:!SSLv3 am laufen?
Ich kämpfe gerade mit ähnlichen Problemen... (gerade mit der wrong version number zu SSL im Log).
Gibts dazu schon Neuigkeiten (ist ja doch schon wieder sieben Monate her)??

LG,
Niko