Go Down

Topic: Authentifizierung via Ethernet/HTTP (Read 1 time) previous topic - next topic

senden9

Hallo, Ich bin dabei mir eine Alarmanlage mit Webinterface zu bauen. Die Struktur ist im Blockschaltbild erklärt. Die Kommunikation mit den Usern übernimmt dabei ein Server. Der Server soll sich dem Arduino gegenüber authentifizieren. Ansonsten könnte jeder den Status überwachen. Ich dachte an einen Hash aus der aktuellen Zeit & einem Passwort.
Pseudocode für Arduino:
Code: [Select]
$auth = md5($time + $passwort);
Ist das eine gute Idee oder wäre MD5 für den Arduino zu Rechenintensiv? Auf dem Server sollen dann die Codes für +/- 5 Sekunden berechnet werden. Wenn einer passt ist der Arduino authentifiziert.
Welche schnellen Hashfunktion kann ich verwenden?

Udo Klein

Wieso denn das? Ich würde den Arduino seriell an den Server anbinden. Die Frage ist dann die Authentifizierung gegenüber dem Server. So wie Du fragst machst Du Dir ja schon Gedanken in die richtige Richtung. Nur ist im Sicherheitsbereich alles viel schwieriger als man oberflächlich meint. Gute Lektüre gibt es hier: http://www.cl.cam.ac.uk/~rja14/book.html. Ja das Buch ist dick, aber man kann es kostenlos runterladen. So lange man das nicht durch hat wird man mit einer Hashfunktion hier oder da nicht viel zusätzlich Sicherheit gewinnen. Die erste Frage ist: wie sind Deine Bedrohungsszenarien / Angreifermodelle. Wenn Du das nicht weisst kannst Du die Authentifizierung auch gleich weglassen.

Ich würde sowas gar nicht erst ans Internet hängen.
Check out my experiments http://blog.blinkenlight.net

sui

An sowas ähnlichem arbeite ich auch gerade :)

Meine Erfahrung: Nicht gebenchmarked, aber die Rechenzeit ist zumindest bei md5 kein Problem solange du nicht mehrere Hashes pro Sekunde berechnen willst... Hashfunktionen fressen ziemlich viel RAM, auf einem Duemilanove/Uno kann das mit dem restlichen Code ziemlich eng werden, aber dann hilft ein Arduino Mega weiter.

Wenn du Serverzeit und Authstring überträgst, brauchst du auch nur einen Hash zu berechnen und zu schauen ob die Zeit um +-5 sekunden abweicht. Pseudocode:

Code: [Select]

if ($serverzeit > $arduinozeit-5 && $serverzeit < $arduinozeit+5 && md5($serverzeit . $secret) == $auth) {
// ok
}


Regelmäßige Zeitsynchronisation auf Server und Arduino nicht vergessen :)

Code und so:
http://www.ardumote.com
http://code.google.com/p/ardumote/source/browse/trunk/MD5.h
http://code.google.com/p/ardumote/source/browse/trunk/MD5.c

sui


Wieso denn das? Ich würde den Arduino seriell an den Server anbinden.


Ich schätze der Server steht weit ab vom Arduino in einem Rechenzentrum ;)

Udo Klein

Wenn der Server in einem RZ steht und der Arduino der Client ist, dann würde ich einen Pushkanal Arduino --> Server aufbauen. D.h. der Arduino muss sich beim Server authentifizieren. Da am Ende aber der Datenstrom das Interessante ist muß man eh alles verschlüsseln --> keine Notwendigkeit für Hashes sondern Notwendigkeit für AES oder etwas ähnliches. X500 würde ich nicht nehmen. Für sowas sind "shared keys" wohl die einfachste Lösung.
Check out my experiments http://blog.blinkenlight.net

mkl0815

Ich denke für starke Verschlüsselung ist der Arduino zu schwach. Wenn das wirklich notwendig ist, würde ich eher eine VPN-Verbindung zwischen "Arduino-Netz" und dem RZ aufbauen. Irgendeinen Router muss es ja eh geben, über den der Datenverkehr läuft. Server und Arduino-Netz teilen sich dann ein privates Netz. Das kann je nach Sicherheitsanforderung sogar vom restlichen Netz getrennt sein, das kann man beliebig kompliziert machen  :)
Der Arduino überträgt dann seine Daten per "push" auf den Server. Ruft also als Client eine bestimmte URL auf dem Server auf, die dann ein eingetretenes Ereignis mitteilt. (z.B. http://server-ip/alarm/fenster/1/open) Das kann der Server dann auswerten, loggen und evtl. Alarm per SMS, Mail etc. schlagen.
Praktischerweise baut man gleich noch eine Totmann Funktion mit ein. D.h. der Arduino meldet sich alle 5 Minuten per http://server-ip/i-am-alive. Sollte diese Meldung länger als 5 Minuten ausbleiben, kann der Server auch Alarm schlagen. Im güsntigsten Fall ist nur die Netzwerkverbindung weg, oder aber die bösen Buben haben den Strom gekappt :-)

Udo Klein

Dann würde ich den Arduino aber nur als Schnittstelle nutzen und die Verbindung mit irgendeinem "Plug PC" oder ähnlichem herstellen.
Check out my experiments http://blog.blinkenlight.net

sui

Hängt davon ab, wie sensibel die Daten sind... gerade im DIY Bereich ist für einen potentiellen Angreifer ein Blick über den Gartenzaun wohl einfacher und informativer als gezielt den Internetverkehr mitzulauschen und zu analysieren.

Udo Klein

Solange der OP uns nicht verrät was er wirklich vorhat können wir sowieso nur spekulieren. Echte Sicherheitsmaßnahmen braucht er vermutlich eh nicht sonst würde er das einen Experten machen lassen.

Der vorgeschlagene Sicherheitsmechanismus ist sehr leicht auszuhebeln. Der Mechanismus bricht schon bei einer einfachen "replay" Attacke zusammen.

Check out my experiments http://blog.blinkenlight.net

sui

Der vorgeschlagene Sicherheitsmechanismus ist sehr leicht auszuhebeln. Der Mechanismus bricht schon bei einer einfachen "replay" Attacke zusammen.


Naja, zunächsteinmal muss ein Angreifer überhaupt den Datenverkehr mitlesen können und wenn er dann einen Request in einem Zeitraum von 5 bis maximal 10 Sekunden erfolgreich wiederholen kann ist das ein durchaus locker vertretbares Risiko. Bei einer Statusabfrage bekommt er dann den Status den er vorher schon mitlesen konnte und der sich innerhalb von 5 Sekunden wohl kaum geändert haben dürfte und ein wiederholter Schaltbefehl bewirkt in aller Regel (ok, toggle Mechanismus wäre doof) auch keinen neuen Zustand.

senden9

Hallo,
die Kommunikation Arduino --> Server wollte ich eh via Push machen. Der Server steht auch bei mir zuhause. Ich wollte das ganze eben wiederverwendbar machen. Da kann der Server auch mal im Internet stehen. Ich denke für meine Ansprüche reicht die Methode mit dem erstellen eines "Auth-Keys". Gibt es den überhaupt eine zeitgemäße Verschlüsselung die auf einem Duemilanove läuft? Und warnt mich der Compiler / die IDE falls zu wenig RAM zur Verfügung steht?

Udo Klein

Ein Angreifer der in der Lage ist zu Lauschen wird mit geringfügig höherem Aufwand auch einen Replay hinbekommen. Ein Angreifer der nicht Lauschen kann ist schon vor dem Mechanismus gestoppt.

Klar gibt es zeitgemässe Verschlüsselung. Aber soweit ich das Überblicke würde DES für die aktuelle Anwendung völlig ausreichen und das können die AVRs in Hardware.

Was das Ram angeht: wie soll der Compiler das wissen? Ram kann ja auch zur Laufzeit allokiert werden, z.B. durch Unterprogrammaufrufe.
Check out my experiments http://blog.blinkenlight.net

sui


Ein Angreifer der in der Lage ist zu Lauschen wird mit geringfügig höherem Aufwand auch einen Replay hinbekommen. Ein Angreifer der nicht Lauschen kann ist schon vor dem Mechanismus gestoppt.


Nein, das hat alles schon seinen Sinn. Das ist ein Authentifizierungsmechanismus, bei dem es darum geht einen unberechtigten Zugriff zu verhindern. Nur weil ein Angreifer nicht mitlauschen kann, kann er doch ggf. trotzdem unberechtigt auf die Schnittstelle zugreifen - schlechter Vergleich: ich muss nicht wissen wie Dein Haustürschlüssel aussieht um zu versuchen Deine Haustür mit einem Dietrich zu öffnen bzw. lediglich die Türklinke runterzudrücken weil da gar kein Schloss vorhanden ist. Der Replay Angriff ist insofern nicht schlimm, weil der Angreifer innerhalb von 5 Sekunden weder einen Zustand ändern (ja, hier ist noch ein Knackpunkt: man sollte neben der Uhrzeit eigentlich auch den Befehl mit im Hash verarbeiten, sonst kann er sehr wohl innerhalb von 5 Sekunden einen anderen Befehl absetzen) noch neue Informationen bekommen kann.

Sofern die (falls man sie für notwendig erachtet) Verschlüsselung sich nicht auf Applikationsebene sondern auf Transportebene (also bei VPN) abspielt ist so eine Authentifizierung zudem zwingend angesagt, da sie einem Angreifer den Zugriff versagt, wenn dieser es irgendwie in's private Netz geschaft haben sollte. Wieder schlechter Vergleich: Man sollte den Tresor nicht unbedingt offen stehen lassen, nur weil die Haustür verschlossen ist.

Udo Klein

Du erklärst mir irgendwie gerade wie "Security by Obscurity" funktioniert.
Check out my experiments http://blog.blinkenlight.net

Go Up