Atacama

Einleitende Worte zum Projekt ATACAMA

Das Internet of Things (dt. Internet der Dinge) umfasst alle eingebetteten Geräte, die Daten, welche z.B. über Sensoren ausgelesen wurden, mit anderen Geräten über das Internet austauschen. Die Sicherheit in IoT Geräten ist heutzutage ein relevantes Thema, weil sich Sensoren mittlerweile fast überall im Alltag wieder finden. Aber die Software, die auf diesen Geräten läuft, ist oftmals in C/C++ geschrieben. Das kann zu ungewünschten Seiteneffekten in der Laufzeit führen, weil der Speicher in C/C++ selbst verwaltet werden muss und der Programmierer i.d.R. mehr Fehler macht als eine automatische Speicherverwaltung. Zu den resultierenden Seiteneffekten gehört z.B. der Buffer Overflow. Es gibt zwar Möglichkeiten, diese Probleme in C/C++ -Code zu beheben und den Code somit sicher zu gestalten. Eine Möglichkeit, um die Sicherheit zu gewährleisten wäre z.B. die Nutzung von Funktionen, die die Eingabe überprüfen. Denn in der Programmiersprache C gibt es Funktionen, die bei einer ungültigen Eingabe auf einen ungültigen Speicherplatz zugreifen. Aber dennoch kann C/C++ nicht mit der Programmiersprache Rust verglichen werden, weil die Fehler, die bei anderen Programmiersprachen zur Laufzeit entstehen, in Rust schon vor der Laufzeit des Programms überprüft werden. Wodurch sich eine Migration zu Rust selbst mit gut geschriebenem und somit sicherem C-Code lohnt. Genau daran wurde im Projekt ATACAMA gearbeitet.

Um die Migration von C zu Rust zu gewährleisten, ohne den C-Code in Rust neu zu schreiben, muss eine Möglichkeit gefunden werden, mit der die C-Funktionen in Rust aufgerufen werden können. Hierfür haben sich die sog. Bindings angeboten, also die Generierung von Rust-Code, der mit den C-Funktionen übereinstimmt. Diese Bindings konnten durch den bereits existierenden Code in rust-riot-sys generiert werden.

Im nächsten Schritt wurden die Bindings in Rust Funktionen gepackt, die die Eingabe umkodieren und die umkodierte Eingabe an die unterliegende C-Funktion weitergeben. Diese Rust Funktionen heißen auch Rust Wrapper, weil sie die unterliegende (C-)Funktion umhüllen.

IoT Geräte

Zu den Eigenschaften der IoT Geräte gehört ihre begrenzte Rechenleistung und ihr kleiner Speicher. Des Weiteren werden die Geräte meist nur mit einer Batterie betrieben und sind infolgedessen nur selten aktiv, damit die Geräte möglichst lange laufen. Dadurch bringt die Arbeit mit diesen Geräten verschiedene Herausforderungen mit sich. Eine dieser Herausforderungen ist es, die zu versendenden Daten kompakt zu kodieren, um sicherzustellen, dass sie von den IoT-Geräten verarbeitet werden können. Hierfür haben wir uns mit CBOR (Concise Binary Object Representation) befasst, weil CBOR die Daten kompakt und binär kodiert. CBOR ist vergleichbar mit der JSON Formatierung. Der entscheidende Unterschied ist, dass die Kodierung der Daten in CBOR deutlich kompakter ist als die von JSON und deswegen von IoT-Geräten unterstützt wird.

Eine weitere Besonderheit im Kontext von IoT sind die speziellen Protokolle, welche mit den eingeschränkten Ressourcen der Geräte umgehen können. Während unseres Projekts haben wir uns für das Kommunikationsprotokoll CoAP (Constrained Application Protocol) und für DTLS (Datagram Transport Layer Security) zur Sicherung der Kommunikation entschieden. CoAP ist vergleichbar mit HTTP (Hypertext Transfer Protocol), weil beide Protokolle die Basis für die Kommunikation in Client-Server-Anwendungen liefern können. Allerdings ist CoAP deutlich kompakter und deswegen besser auf IoT Geräte zugeschnitten als HTTP. DTLS ist vergleichbar mit SSL (Secure Sockets Layer)/TLS (Transport Layer Security), setzt aber auf eine sog. verbindungslose Übertragung von Daten. Eine verbindungslose Übertragung ist vergleichbar mit einer Paketversendung, von der nicht bekannt ist, ob das Paket beim Empfänger ankommt. Dies eignet sich bei der beschränkten Rechenkapazität besonders gut. Denn bei einer verbindungsorientierten Übertragung braucht es noch mehr sog. Steuerinformationen, die die Paketgröße erhöht. Dies wirkt sich auf die Rechenkapazität aus, weil die Steuerinformationen zusätzlich zu den eigentlichen Daten verarbeitet werden müssen.

Sowohl CoAP als auch DTLS gab es schon in RIOT. RIOT ist ein Betriebssystem für IoT Geräte, das in C geschrieben ist. Aber die Rust Unterstützung hat da z.T. noch gefehlt. Dies liegt daran, dass Rust noch eine vergleichsweise neue Programmiersprache ist. Deshalb wurde sie im Laufe des Projekts mittels unserer Beiträge ergänzt.

Der Demonstrator

Zur Demonstration unserer Ergebnisse haben wir uns für ein Gewächshaus entschieden, weil sich die Anzahl an Sensoren und Techniken zur Darstellung der Messwerte gut skalieren lässt. Wodurch die unterschiedlichsten Daten (wie bspw. Temperatur, Feuchtigkeit und Helligkeit) ermittelt werden können.