Mój setup do nauki IoT security — co i dlaczego?
W ostatnim artykule opisałem, jaki będzie mój początkowy setup do nauki. Dzisiaj chciałbym krótko wyjaśnić, czym są Arduino Uno i ESP32-DevKitC oraz jaką rolę będą pełniły w tym systemie. Gdy przyjdzie czas na wykorzystywanie czujników, wyświetlacza LCD czy podstawowych elementów elektronicznych, pojawią się wyjaśnienia na ich temat. Na początku krótko przypomnę, jak miał wyglądać zestaw:
Arduino Uno Rev3
2x płytka ESP32-DevKitC
Raspberry Pi Zero 2 WH 512 MB RAM - WiFi + BT 4.2
Czujniki (BMP280, DHT11, LM35, fotorezystor)
Podstawowe komponenty elektroniczne (płytka stykowa, diody LED, rezystory, tranzystory, potencjometry, przyciski tact-switch)
Moduły wspomagające - wyświetlacz LCD, sterownik silnika L293D, ekspander PCF8574, rejestr przesuwny 74HC595
Komplet przewodów połączeniowych

W zestawie nastąpiły pewne modyfikacje, o których piszę pod koniec artykułu.
Chciałbym zaznaczyć, że w kolejnych artykułach będą się pojawiać różne nieznane określenia. Sukcesywnie wraz z posuwaniem się projektu naprzód będę wyjaśniał wszystkie niezrozumiałe pojęcia, a z czasem na stronie pojawi się też słowniczek pojęć.
Arduino Uno Rev3

Jeśli nie mieliście z nim do czynienia - krótko mówiąc, Arduino Uno Rev3 to płytka rozwojowa zawierająca wszystko, co potrzebne do zbudowania własnego urządzenia bez projektowania elektroniki od podstaw. Służy do szybkiego tworzenia prototypów urządzeń. Najważniejszym elementem jest mikrokontroler ATmega328P taktowany zegarem 16 MHz, który integruje 32 kB pamięci Flash, 2 kB pamięci SRAM i 1 kB pamięci EEPROM. Na płytce mamy do dyspozycji interfejsy UART, I2C, SPI. Komunikację z komputerem zapewnia konwerter USB ↔ UART. Zasilanie wejściowe 7–12 V, napięcie operacyjne 5 V. Płytka wystawia 14 uniwersalnych pinów GPIO (wejść/wyjść), w tym 6 ma możliwość generowania sygnału PWM. Dodatkowo mamy jeszcze 6 pinów działających jako wejścia analogowe, które można też wykorzystać jako wejścia/wyjścia cyfrowe.
ESP32-DevKitC z wbudowanym modułem ESP-WROOM-32

ESP32-DevKitC to także płytka rozwojowa. Zawiera moduł ESP-WROOM-32, w którym pracuje układ ESP32 - z dwurdzeniowym procesorem Xtensa LX6 (taktowanym do 240 MHz) i 520 kB pamięci SRAM - a obok niego siedzi osobna kość 4 MB pamięci Flash. Najważniejsza różnica względem Arduino Uno to wbudowane radio: WiFi 802.11 b/g/n (tylko pasmo 2,4 GHz) oraz Bluetooth 4.2 (Classic i BLE). To właśnie ono pozwoli nam stworzyć system IoT komunikujący się ze światem zewnętrznym. To także ono dodaje największą nową powierzchnię ataku — dlatego ESP32 będzie głównym bohaterem części poświęconej bezpieczeństwu. Układ umożliwia komunikację przez interfejsy UART, SPI, I2C. Mamy także ok. 25 użytecznych pinów GPIO, wśród których znajdziemy 12-bitowe wejścia analogowe (ADC), dwa wyjścia analogowe (DAC). Zasilanie wejściowe 5 V przez USB, napięcie operacyjne 3,3 V. Całość działa pod kontrolą systemu operacyjnego czasu rzeczywistego FreeRTOS.
Co z tego wszystkiego zrobimy
Z wymienionego sprzętu chciałbym stworzyć projekt, który w dłuższej perspektywie pozwoli poznać podstawy embedded i IoT. Najpierw zbudujemy samo urządzenie bez patrzenia na kwestie bezpieczeństwa, a potem zobaczymy, które elementy są narażone na ataki i jak je zabezpieczyć.
Projekt wyobrażam sobie jako stację pogodową składającą się z dwóch modułów - pierwszy to ESP32 z różnego rodzaju czujnikami oraz baterią ładowaną z ogniwa fotowoltaicznego. Zbyt niski poziom naładowania będzie od razu sygnalizowany odpowiednim kolorem diody LED. Początkowo takie ładowanie uprościmy do zasilania z wymiennych baterii, żeby skoncentrować się na zbudowaniu działającego systemu, a nie na jego zasilaniu. W późniejszych etapach zbudujemy również opisane wyżej rozwiązanie.
Drugim modułem będzie bramka z ESP32 umożliwiająca przesyłanie danych z czujników do serwera - fizycznej maszyny z usługą brokera MQTT oraz bazą danych. Moduły będą komunikować się bezprzewodowo. Bramka będzie przekazywać dane bezprzewodowo na serwer (gdzie informacje będą gromadzone i przetwarzane) oraz przewodowo do innego urządzenia (Arduino), które będzie te informacje pokazywało na wyświetlaczu LCD. W module drugim będzie też parę przycisków, które pozwolą na wybór informacji pojawiających się na wyświetlaczu.
Oprócz danych w czasie rzeczywistym ekran LCD będzie mógł pokazywać również prognozę pogody z serwisów informacyjnych. Z czasem być może nawet zamienimy ekran LCD na bardziej zaawansowany lub tablet z Androidem, z ładniejszą warstwą prezentacji danych.
Zbudowanie całego urządzenia pozwoli zapoznać się z niezbędnymi podstawami elektroniki, embedded, programowania, a także komunikacji przewodowej i bezprzewodowej oraz łączności sieciowej. Żeby zbudować takie urządzenie, trzeba będzie nauczyć się czytać schematy elektroniczne przynajmniej w podstawowym zakresie. Kiedy urządzenie będzie już gotowe i podłączone do sieci, spróbujemy je atakować i szukać luk w zabezpieczeniach oraz wyciągać wnioski, jakie elementy systemu są narażone i w jaki sposób można je chronić.
Cały projekt będzie dostępny w repozytorium secure-weather-station na GitHubie, gdzie będzie można regularnie sprawdzać, jak wyglądają postępy. Projekt na GitHubie będzie prowadzony wyłącznie po angielsku, ale wszystkie wymagające wyjaśnienia tematy opiszę w powiązanych artykułach, nazywanych według schematu „Stacja pogodowa: temat”, np. „Stacja pogodowa: pierwsze uruchomienie ESP32”.
W liście podzespołów na początku były podane elementy: sterownik silnika L293D, ekspander PCF8574 i rejestr przesuwny 74HC595. Na razie nie będę ich wykorzystywał, dlatego zostaną usunięte z listy elementów w projekcie.
Pierwsze problemy oraz ich wpływ na projekt
Już na samym początku zetknąłem się z pierwszymi problemami, których nie przewidziałem. Pierwszy to dostępność urządzeń. Pierwotnie planowałem, że na Raspberry Pi uruchomię usługę brokera MQTT, ale okazało się, że w sklepach internetowych, w których szukałem, jest problem z dostępnością urządzenia. Oficjalna cena katalogowa wersji bez goldpinów to 15 $. Wariant WH jest kilka dolarów droższy — a w Polsce dostępne od ręki egzemplarze sięgają 400 zł. Postanowiłem więc zamówić urządzenie w przyzwoitej cenie i poczekać na dostawę przewidywaną w okolicach lutego 2027 r. W związku z tym opóźnieniem usługę brokera MQTT uruchomię na laptopie, na którym mam postawiony serwer Ubuntu, a gdy przyjdzie Raspberry Pi, wrócimy do pierwotnej koncepcji (baza danych zostanie na laptopie).
Drugi problem: w gotowym zestawie komponentów pod Arduino, który zakupiłem, wyświetlacz LCD jest dość mały. Żeby nie zwiększać kosztów projektu, na razie nie będę kupował innego.
Trzeci to różnica napięć operacyjnych urządzeń. Arduino to 5 V, a ESP32 to 3,3 V. Jeśli podamy sygnał z Arduino bezpośrednio na ESP32, może on uszkodzić układ, dlatego będzie potrzebny konwerter poziomów logicznych (level shifter), którego zakupu nie przewidziałem. Na szczęście taki układ jest dość tani, ale to oznacza kolejne zamówienie.
Czwarty: płytka stykowa jest za mała, żeby wygodnie umieścić na niej ESP32. Żeby to zrobić wygodnie, będę potrzebował jeszcze dwóch szerszych płytek stykowych - tak więc koszty projektu nieznacznie wzrosną również z tego powodu. Reszta elementów jest już w porządku i powinna w zupełności wystarczyć do budowy stacji.
W kolejnym artykule spróbujemy uruchomić jedno z urządzeń i w jakiś sposób je ożywić.

