Skocz do zawartości
kosa351

ESP8266 + DS18B20 pomiar czujników + historia danych

Pomocna odpowiedź

1 godzinę temu, ethanak napisał:

I ów "prosty" backend będzie taki superbezpieczny? Rozumiem, że zamiast brzydkim i niedopracowanym protokołem (MySQL, PostgreSQL) ESP będzie się łączył superbezpiecznym HTTP? A ów "prosty" backend będzie dużo lepiej zabezpieczony niż potrafią to zrobić np. chłopaki z Oracle?

Jeśli dobrze zrozumiałem post @Harnas to prawdopodobnie chodziło mu o to, że mało bezpieczne jest, gdy nasze urządzenie "loguje się" bezpośrednio do bazy danych i zyskuje do niej pełne uprawnienia, bo nie ma co ukrywać, że w większości amatorskich projektów IoT tak właśnie jest. Więc te same dane do połączenia z bazą, które służą do dodania nowego rekordu na temat pomiaru temperatury równie dobrze mogłyby zostać wykorzystane do skasowania całej bazy. Jeśli urządzenie IoT łączy się z bazą przez "jakiegoś pośrednika" to łatwiej o zapewnienie bezpieczeństwa - jeśli punkt, z którym łączy się urządzenie IoT potrafi tylko wpisać coś do bazy to po złamaniu zabezpieczeń urządzenia "nasz haker" najwyżej zaspamuje bazę, ale nie nabroi nic więcej. Oczywiście podkreślam, że chodzi tu o sam fakt bezpieczeństwa systemu po złamaniu zabezpieczeń urządzenia IoT, bo w tym przypadku trzeba jeszcze zabezpieczyć "pośrednika" - jednak to wydaje się łatwiejsze, bo stworzenie bezpiecznego skryptu w PHP,  który będzie odpowiadał za komunikację z bazą (i tylko dodawanie rekordów) jest w zasięgu osoby początkującej 🙂

W każdym razie, niezależnie od tego jak potoczy się ta dyskusja, to z góry przypominam Wszystkim o Polityce Przyjaznego Forum, szczególnie o poniższych punktach:

Cytat

Żadnych ataków personalnych. Skup się na omawianym zagadnieniu, a nie na osobach. Nie oceniaj innych, zostaw dla siebie złośliwe zwroty, które generują nerwową atmosferę.
Krytykuj z klasą. Wytykanie błędów też jest potrzebne. Wskaż zauważony błąd i kulturalnie wytłumacz, jak można go rozwiązać. Wykaż się wiedzą i udziel wartościowej porady.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
22 minuty temu, Treker napisał:

mało bezpieczne jest, gdy nasze urządzenie "loguje się" bezpośrednio do bazy danych i zyskuje do niej pełne uprawnienia, bo nie ma co ukrywać, że w większości amatorskich projektów IoT tak właśnie jest.

I po to są właśnie uprawnienia - np. dane ustrojstwo może mieć dostęp wyłącznie do insertów do konkretnej tabeli (to by było tyle w temacie "dość prymitywnego zarządzania użytkownikami i uprawnieniami"). To, że ktoś[1] nie potrafi skonfigurować uprawnień w bazie nie znaczy, że jest to niemożliwe; i nie odsyłałbym tu do artykułów na stacku tylko do dokumentacji konkretnej bazy danych.

22 minuty temu, Treker napisał:

po złamaniu zabezpieczeń urządzenia "nasz haker" najwyżej zaspamuje bazę, ale nie nabroi nic więcej.

Bardzo ładna bajka... niestety to tylko urban legend. Znasz określenie "SQL injection"? Jeśli backend ma błąd, to odpowiednio spreparowanymi danymi można bardzo dużo nabroić. W przypadku porządnego skonfigurowania uprawnień można - jak sam pisałeś - co najwyżej zaspamować bazę. A dużo bardziej prawdopodobne jest, żę błąd będzie w backendzie niż w serwerze bazy danych.

Poza tym trochę trudno się łamie zabezpieczenia na urządzeniu, do którego nie ma się dostępu... ale to znów kwestia prawidłowo zaprojektowanej infrastruktury.

22 minuty temu, Treker napisał:

stworzenie bezpiecznego skryptu w PHP,  który będzie odpowiadał za komunikację z bazą (i tylko dodawanie rekordów) jest w zasięgu osoby początkującej 

Powiedz to autorom różnej maści wtyczek do WordPressa, które albo dwa razy w miesiącu trzeba upgrade'ować albo w ogóle wyciepać bo to co autor popełnił to nie błąd ale wielbłąd. A i sam WordPress nie jest pozbawiony dziur - tylko te są bardzo szybko łatane. Przy okazji - na SQL Injection najbardziej wrażliwy jest właśnie PHP.

---

[1] Mówię tu o autorach konkretnych rozwiązań, a nie o moim szanownym interlokutorze.

 

 

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

Widzę panowie, że rozgorzała mocno dyskusja 🙂 Wydaje mi się, że wyszła trochę poza temat. 

Sieć jest wewnętrzna. Mam postawioną specjalną mini maszynę wirtualną gdzie jest postawiona baza danych mysql właśnie pod takie rzeczy. Nigdy nie będzie to udostępniane na zewnątrz. Z zabezpieczaniem bazy, uprawnieniami i innymi tymi rzeczami sobie poradzę, ważne aby dane zasilały bazę. Jeżeli łatwiejszą wersją jest odpowiednio przygotowany plik na serwerze lokalnym. Niestety nie dysponuję tak dużą ilością czasu żebym teraz szkolił się od zera z Arduino stąd korzystam z gotowych rozwiązań. 

Napiszę dokładniej o co chodzi. Jest sobie 14 silosów. W każdym jest po 9 czujników DS18B20. Do każdego zainstalowany jest slot na czytnik i lab co 4 godziny wpina czytnik i spisuje temp. z każdego silosa i czujnika. Producent nie przewidział tutaj żadnej automatyzacji stąd pomysł, aby wykorzystać ESP8266 i spiąć do niego wszystkie czujniki. Teraz lab bez ruszania "tyłka" sprawdzi sobie zdalnie odczyt z każdego czujnika + historia pomiarów. 

Nie trzeba lecieć tutaj w kosmos, chodzi tutaj myślę o prosty kod. Jeżeli ktoś chętny możemy dogadać się na priv co do ceny za wykonanie zlecenia. 

Udostępnij ten post


Link to post
Share on other sites

No to spokojnie wystarczy mysql_connector z linku który podałem (do bazy wędruje 10 wartości - numer czujnika i dziewięć wartości, kolumna czas jest z automatu na timenow). Sam nie mam czasu ale ktoś tu się powinien znaleźć 🙂

Rozumiem, że wszystkie silosy są w zasięgu WiFi (ESP8266 lubi silny sygnał).

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@ethanak chciałem jedynie wspomnieć o tym co w dzisiejszych czasach jest uważane za dobre praktyki a co za złe. Jak kto sobie zrobi projekt to już jego wybór.

Udostępnij ten post


Link to post
Share on other sites

@HarnasPowiedz, gdzie jest dziura w proponowanym przeze mnie rozwiązaniu i w jaki sposób jakiś "backend" ma spowodować zniknięcie owej dziury. Bo na razie widzę jedynie, że masz niewielkie pojęcie o bezpieczeństwie rozwiązań sieciowych... no ale ja przyślepawy jestem i mogę źle widzieć 😞

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Łączenie się bezpośrednio z bazą danych będzie oczywiście działać - jest to nazywane architekturą 2-warstwową, gdzie mamy aplikację oraz serwer bazy danych. Takie rozwiązanie od dawna nie jest zalecane, chociaż nadal czasem używane.

O ile rozumiem z backendem chodziło o dodatkową warstwę, czyli architekturę 3 lub więcej warstwową, gdzie mamy klienta, aplikację sieciową i bazę danych. Takie rozwiązanie jest o wiele popularniejsze i ma mnóstwo zalet, chociaż oczywiście też pewne wady.

Pierwsza zaleta to niezależność od technologii, czyli wybranego typu i wersji bazy danych. W rozwiązaniu 2-warstwowym, gdzie aplikacja bezpośrednio łączy się z bazą nie można zmienić bazy bez modyfikacji aplikacji. Co więcej aktualizacje bazy mogą pociągać konieczność aktualizacji aplikacji. Z własnego doświadczenia wiem, że w przypadku MySQL serwera wystarczyło zmienić procesor z 32-bitowego na 64-bitowy żeby sterowniki ODBC nie chciały się poprawnie łączyć. To już prehistoria, ale nadal aktualna nauczka jest taka, że lepiej nie wiązać się z konkretnymi wersjami oprogramowania, czy też sprzętu.

Druga zaleta to łatwa możliwość zwiększenia poziomu zabezpieczeń, albo jak kto woli zmniejszenie wektora ataku. Jeśli bazujemy tylko na bezpieczeństwie bazy to mamy co najmniej dwa poważne wyzwania. Pierwszy to luki w zabezpieczeniach - co jakiś czas pojawia się informacja o krytycznym błędzie w każdej bazie danych, niezależnie od profesjonalizmu jej twórców. Jeśli wystawiliśmy interfejs do takiej bazy publicznie, to do momentu załatania luki jesteśmy w pełni podatni na atak. Natomiast mając dodatkową warstwę jest chociaż szansa, że ten błąd nie będzie dla atakującego dostępny - udostępniamy tylko niezbędne w naszej aplikacji funkcje, więc wektor ataku jest mniejszy. Tym bardziej, że często błędy dotyczą dość egzotycznych i mało popularnych funkcjonalności.

Następna różnica to możliwość zwiększenia bezpieczeństwa dodając logikę charakterystyczną dla aplikacji. W przypadku bazy danych możemy oczywiście dodać możliwość odczytu tylko dla zalogowanych użytkowników, albo zapisu tylko dla nich. Ale jak ograniczyć zapis danego wierszta tylko do wybranego użytkownika (np. zmiana hasła)? Albo jak pozwolić odczytać niektóre dane tylko użytkownikom z działu kadr (bo inaczej złamiemy RODO)? Jest na to metoda, czyli wyzwalacze - ale to o wiele bardziej skomplikowane, niż podstawowy kurs SQL-a, może zawierać błędy, ale co najważniejsze jest bardzo silnie zależne od bazy, czyli wracamy do pkt.1, zmiana bazy może wymagać przepisania wszystkiego od nowa.

Dlatego obecnie popularniejsze są rozwiązania wielowarstwowe, gdzie klient, czyli w tym przypadku esp8266 wysyła dane używając MQTT lub innego protokołu i jest zupełnie niezależny od typu, czy wersji bazy danych. Czujnik ma wiedzieć gdzie dane wysłać, a nie czy na serwerze ktoś nie zmienił płyty głównej.

Edytowano przez Elvis

Udostępnij ten post


Link to post
Share on other sites

Tu się nie zgodzę.

To że sterowniki ODBC mają jakieś babole to jakaś historyczna zaszłość. Protokół MySQL jest bardzo dobrze udokumentowany, i wystarczy trzymać się dokumentacji a nie amatorskich rozwiązań ze stacka. To samo dotyczy PostgreSQL-a, MSSQL, Oracle, Firebirda czy co sobie tam jeszcze wpiszesz.

To, że pani z księgowości ma mieć dostęp do konkretnych rzeczy, to sprawa admina (grant select on baza.tabela for user@ip). A wyzwalacze w MySQL-u to faktycznie urban legend. Co do ograniczenia zapisu dla konkretnego usera - vide above.

Zmiana bazy danych z MySQL na np. Postgresa czy Oracla to raczej zagadnienie teoretyczne (nikt przy zdriwych zmysłach tego nie robi). A nawet gdyby - kwerenda będzie taka sama. Kwestia zmiany biblioteki i przekompilowania programu.

Co do ataku... atak na backend jest równie prawdopodobny jak na bazę. 

Szczególnie świetnie się te ataki udają na izolowanej sieci (jak w przypadku o którym mówimy).

A tak przy okazji: jeśli jedyną możliwością jest zrobienie inserta do bazy, to po kiego grzyba tam jakieś proxy? Przecież jeśli ten nieszczęsny ESP może zrobić tylko inserta - to niech robi. Jeśli jakiś pośrednik będzie miał tylko te uprawnienia - to jest niepotrzebny. Jeśli będzie miał większe - no to już mamy materiał na dziurę.

A to, że jakieś rozwiązania są popularne... popularne jest pisanie aplikacji w pewnym języku który był przewidziany do czegoś innego. Sam zdecyduj, czy mówię o Pascalu czy PHP;)

Dalej nie wiem, dlaczego rozwiązanie klient - baza jest gorsze niż klient -HGWco - baza.

 

 

 

Udostępnij ten post


Link to post
Share on other sites

Możliwe że przykłady z ODBC nie były dobrze dobrane, ale nie chodziło o konkretną technologię - to się zmienia i w każdej są błędy.

Na czym polega różnica między wystawieniem łącza do MySQL, a własną aplikacją, najlepiej zrozumieć na przykładzie Forbota. Nie wiem, na czym działa forum, ale przez te 10+ lat mogło dziłać na różnych wersjach MySQL-a, Postrgres-a, czy czegokolwiek innego. Loguję się przez przeglądarkę, piszę posty i nadal działa. Ja nie muszę wiedzieć co jest "pod spodem". Zmiana bazy nie jest zagadnieniem teoretycznym. Może się z tym nie spotkałeś, ale na pewno na forum znajdziemy osoby z takim doświadczeniem.

A jak chodzi o ataki, to mamy XXI wiek, mało kto robi je ręcznie. Są od tego gotowe skrypty - i jeśli będziesz miał dziurawy MySQL serwer, automat włamie się na Twój serwer i wykorzysta według uznania. Natomiast mając nawet prostą aplikację - jak chociażby to forum, wymaga to pewnego wysiłku. Na tym polega zmniejszewnie wektora ataku - będzie to wymagało więcej pracy, a jeśli tej pracy będzie więcej niż warte są dane, to mamy bezpieczny system.

 

Udostępnij ten post


Link to post
Share on other sites

Przypominam: mówimy o izolowanym systemie.

Przy okazji - podejrzewam że jest więcej skryptów do naszego forum, niż do baz danych.  Nie zauważyłeś ostatnio pomieniatczyków?

Akurat znam bardzo dobrze black SEO, wiem jak się przed tym szajsem zabezpieczyć, ale uwierz mi: to forum jest podatne na ataki, w przeciwieństwie do izolowanej sieci kilkunastu czujników.

A przecież tu nie ma bezpośredniego dostępu do bazy...

Udostępnij ten post


Link to post
Share on other sites

Nie jestem pentestem i nie robiłem testów forbota, to był znowu przykład i chyba ponownie nie zadziałał. W każdym razie mając izolowana sieć można użyć czegokolwiek, ale ogólnie bezpośredni dostęp do MySQL to proszenie się o kłopoty i raczej niezbyt dobre świadectwo o znajomości zagadnień bezpieczeństwa sieci. Ale nie twierdzę że tak się nie da - to jak z pracą jako root, też można

Udostępnij ten post


Link to post
Share on other sites

To wszystko to kwesta jakichś uprawnień, kwestia tej nieszczęsnej pośredniczącej aplikacji, a w końcu kwestia gościa, który opracuje minimalny sposób. Nie istnieje sposób bezpieczny w każdych warunkach... ale o ile wiem do Fort Knox jeszcze nikt się nie włamał... mimo nieistnienia jakichś aplikacji 🙂

Co do bezpośredniego dostępu... da się. Trzeba wiedzieć co robisz i MySQL stanie się bardziej pancerny niż Abrams. Problem z tym "trzeba wiedzieć".

A tak przy okazji - jedynym (i zupełnie przypadkowym) testem forbota było dostanie bana za napisanie paru słów cyrylicą (odpowiadałem Białorusinowi). Zadziałało... ale na autentycznych pomieniatczyków ni czorta 😞

Udostępnij ten post


Link to post
Share on other sites

@ethanak można się kłócić przez tydzień czy temu projektowi bliżej do apki z wkompilowanym SQLite czy normalnej webapki.

Taki backend to 20 linijek kodu w PHP/Pythonie/JS i przykładów tego w internecie jest masa. Do ogarnięcia w 1-2h. Uczymy się przy okazji dobrych praktyk i poszerzamy horyzonty. A i nie jest projekt na zaliczenia na studiach a coś co ma działać w przedsiębiorstwie , więc warto aby był drobiony porządnie.

 

Udostępnij ten post


Link to post
Share on other sites

@kosa351 Jestem cienki programista ale być może podpowiem  coś przyziemnego w porównaniu do pozostałych dyskutantów. Miałem podobny problem z najprostszym archiwizowaniem danych z czujników podpiętych do ESP32. Niespodziewana pomoc przyszła ze strony biblioteki ESP32_FTPClient.h. Mamy tam taki fragment 

//Append an string to a file (it does not need to exist)

  ftp.InitFile("Type A");

  ftp.AppendFile("hello_world_append.txt");

  ftp.Write("Hello World");

  ftp.CloseFile();

i to w zupełności mi wystarczyło by na FTP tworzyć sobie plik tekstowy sformatowany w postaci kolumn z kolejnymi czujnikami a kolejnych wierszach pojawiały się pomiary w odstępach czasu. Klasyczny zbiór danych zarówno dla podglądu wzrokowego jak i dla importu do programów celem obróbki matematycznej.

Rozwiązanie jest banalne, choć pewnie nie satysfakcjonujące dla bardziej profesjonalnego zastosowania z jakim Ty masz do czynienia.

 

Udostępnij ten post


Link to post
Share on other sites

robienie pośrednika ma pewien plus poza bezpieczeństwem - pozwala dodać funkcjonalności w jednym miejscu. Mowa jest tu o prostym zbieraniu danych ale zaraz pojawić się może pytanie - skoro jest już dużo danych to co można z nimi zrobić ? Może jakaś analiza ? Może wykresy ? Może badanie trendów ? Wyzwalacze uruchamiające akcje w zależności od parametrów ? W ramach prac domowych na własne potrzeby dłubię sobie coś podobnego czyli ESP + czujniki + zbieranie danych, mam backend który tworze w Javie a na zapleczu stoi baza SQL. samo ESP korzysta z pośrednika do zapisywania danych, ale infrastruktura pośrednika dba o analizę danych, dodaje dane z internetu, obsługuje pocztę elektroniczną, zarządza uprawnieniami i do tego przydaje się pośrednik. 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...