Wprowadzenie do projektu - deikare/iot-system GitHub Wiki
Use case
Załóżmy, że pojedyńczy użytkownik ma $N$ domów, w których podpiętych ma $N_2$ czujników oraz $N_3$ urządzeń wykonawczych pod hub. Chciałby móc zdalnie, z poziomu przeglądarki podglądać stan czujników z wszystkich domów i sterować urządzeniami wykonawczymi, jednocześnie będąc odpornym na włamania z zewnątrz. Użytkownik chce dodatkowo zarządzać konfiguracją urządzeń.
Założenia projektowe
- on-premise - oprogramowanie jest instalowane bezpośrednio u użytkownika,
- single tenant - dla każdego kolejnego użytkownika tworzona jest nowa sieć, wymagana jest też w takiej sytuacji instalacja nowych certyfikatów CA na każdym z serwerów
- rozwiązanie do zastosowań domowych
- proporcjonalne formy uwierzytelniania do wymagań środowiska wdrożenia:
- podejście zaufania do środowisko wewnętrznego
- podejście skrajnego braku zaufania do środowiska zewnętrznego – niektóre elementy dostępne w sieci Internet
- w celu skutecznego, wiarygodnego i audytowalnego uwierzytelniania wybrano powszechnie akceptowane rynkowo rozwiązania oparte o mTLS oraz o lokalne centrum certyfikacji (CA)
- gwarantuje to uwierzytelniania każdego serwera i każdego klienta przyłączonego do systemu pochodzącego z środowiska zewnętrznego (Internetu)
- wykorzystanie mTLS gwarantuje także pełną poufność i integralność treści transmisji, co jest szczególnie istotne w przypadku transmisji w sieci Internet
- wykorzystano klasyczne mechanizmy, więc podatności zostały zidentyfikowane i opisane, a wszelkie ewentualne niepoprawności naprawione
- dzięki temu użytkownik nie musi logować się do usługi (przy założeniu, że używa przeglądarki z kluczem podpisanym przez CA)
- dla instancji systemu dla jednego użytkownika wymagana jest tylko jednorazowa certyfikacja wszystkich serwerów
- każdorazowe stworzenie huba wymaga od CA jedynie stworzenia nowego certyfikatu dla tego huba
- w przypadku wykradzenia danego huba wystarczy, że stworzymy nowe CA, które następnie wygeneruje ponowne certyfikaty dla wszystkich serwerów oraz hubów
Funkcjonalności
- przechowywanie odczytów z czujników w bazie influxdb - baza dostaje odczyty z czujników podpiętych pod hub
- przechowywanie komunikatów z urządzeń wykonawczych w bazie influxdb (na przykład stan bramy - zamknięta / otwarta)
- każdy hub ma oddzielną konfigurację przechowywaną w bazie sqlite-device-configs
- wyświetlanie danych z bazy w aplikacji webowej
- zarządzanie czujnikami i urządzeniami wykonawczymi z poziomu aplikacji webowej
- sterowanie czujnikami - modyfikacja listy dostępnych czujników, włączanie ich i wyłączanie, modyfikacja częstości generowania przez nie danych
- sterowanie urządzeniami wykonawczynymi - modyfikacja listy urządzeń oraz możliwych komunikatów, włączanie ich i wyłączanie, wysyłanie zdefiniowanych przez użytkownika poleceń, obserwowanie odpowiedzi zwrotnej urządzenia wykonawczego
- tworzenie nowych hubów i podpinanie ich pod sieć
- w przypadku zerwania połączenia pomiędzy hubem a influxdb dane z czujników oraz komunikaty urządzeń wykonawczych będą buforowane do czasu przywrócenia połączenia