6.1 Server IoT a Snap
Samotný názov tohoto kurzu „Internet vecí“ hovorí, že jednotlivé zariadenia potrebujú sieťové spojenie, či dokonca aj internet. Sieť však má zmysel až vtedy, keď poskytuje služby. A aby na nej mohli byť služby, musíme mať servery, ktoré ich poskytujú. Nemusí vždy nutne ísť o internet a servery v cloude, často je v rámci „smart“ systémov (napríklad inteligentná domácnosť) vhodnejší lokálny komunikačný systém, teda je potrebný nejaký „IoT server“.
Už v 1. kapitole sme spoznali hotové riešenia, integrujúce viaceré služby v jednom balíku - napríklad Home Assistant. A tiež sme si spomínali, že takýto balík môžeme nainštalovať pokojne aj na malý SBC, typicky na obľúbený Raspberry Pi - svojím výkonom bude postačovať a nebude míňať zbytočne veľa energie.
Ak však chceme mať všetko plne pod kontrolou, minimalizovať systémové nároky a aj riziko útoku cez chyby v nepotrebných komponentoch, môžeme si všetko nainštalovať sami v minimalistickej forme - bez grafického rozhrania a bez nepotrebných aplikácií a balíkov. Na našom IoT serveri budeme v úvode potrebovať:
- komunikačnú službu MQTT: Mosquitto;
- nástroj pre blokové programovanie: Node-RED.
Inštalácia IoT servera
Pre takýto server je ideálnym operačným systémom Linux, napríklad Ubuntu Server LTS alebo Debian, využiť môžeme aj Raspberry Pi OS Lite. Ak to zvolená distribúcia umožňuje, inštalujeme ju v minimalistickej verzii. Zoznam predinštalovaných balíkov získame príkazom apt list --installed.
Hneď po inštalácii OS je vhodné zaktualizovať softvér a nastaviť časovú zónu (pokiaľ to nebolo súčasťou inštalačného dialógu). Pre rôzne „inštalačné aktivity“ sú potrebné root oprávnenia, preto je vhodné najskôr vojsť do root režimu príkazom sudo -i (prípadne v OS Debian príkazom su -). Na úvod by sme teda mali spustiť napríklad takúto postupnosť príkazov:
sudo -i # prepnutie na root práva, prípadne v Debiane: su -
timedatectl set-timezone Europe/Bratislava # nastavenie časovej zóny
apt update # aktualizácia repozitárov
apt full-upgrade # úplná aktualizácia softvéru
apt install iputils-ping iputils-tracepath traceroute dnsutils mc nano # inštalácia základných nástrojov
apt autoremove # odstránenie nadbytočných súborov
Tieto príkazy po nastavení časovej zóny kompletne zaktualizujú operačný systém (treba myslieť na to, že inštalačné médium bolo zostavené v nejakom čase a odvtedy vyšli nové verzie softvéru) a nainštalujú tieto základné nástroje, ktoré sa určite oplatí mať:
- iputils-ping: klasický príkaz
pingpre základnú diagnostiku siete; - iputils-tracepath: modernejší príkaz
tracepathpre diagnostiku sieťového spojenia; - traceroute: klasický príkaz
traceroutepre diagnostiku sieťového spojenia; - dnsutils: nástroje diagnostiky prekladu doménových mien, ako je napr.
nslookup,dig; - mc: súborový manažér pre textový režim - neoceniteľný pomocník;
- nano: editor textových súborov, často používaných v rôznych návodoch.
Názov servera a heslo používateľa obvykle nastavujeme už v procese inštalácie, no nie je problém vykonať dodatočnú zmenu:
hostnamectl set-hostname {názov}
passwd # zadáme nové heslo
Problém časovej zóny
Operačný systém Linux predpokladá, že čas v RTC čipe je v neutrálnej časovej zóne (UTC / GMT) a podľa toho k nemu aj pristupuje. Overiť to môžeme príkazom timedatectl - položka RTC in local TZ je nastavená na hodnotu no. Toto nie je problém a možno to pokladať za správny prístup.
Pozor treba dať v prípade dual-boot - teda keď v jednom počítači máme aj Windows, aj Linux. OS Windows očakáva, že čas RTC je už v lokálnej časovej zóne. Vždy po zmene OS bude čas o hodinu alebo o dve popredu alebo pozadu. Mohli by sme síce zmeniť správanie Linux (príkaz timedatectl set-local-rtc 1 --adjust-system-clock), no pri zmene z letného času na zimný a naopak, by oba systémy čas posúvali a opäť by bol chaos. Lepšie riešenie teda je presvedčiť Windows, aby používal UTC čas: v registroch HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ TimeZoneInformation je treba vytvoriť DWORD položku RealTimeIsUniversal a nastaviť na hodnotu 1.
Aktualizácia systému a aplikácií
Pre zachovanie bezpečnosti a stability IoT servera je nevyhnutné systém pravidelne aktualizovať. Na rozdiel od bežného domáceho počítača, na serveri vykonávame aktualizáciu manuálne cez terminál, čo nám dáva plnú kontrolu nad procesom.
Správny postup aktualizácie
Aktualizáciu vykonávame vždy v dvoch krokoch:
- Aktualizácia zoznamu balíkov: Systém si stiahne informácie o tom, aké nové verzie softvéru sú dostupné.
- Samotná inštalácia: Systém postupne stiahne a nainštaluje nové verzie softvéru a prípadne odinštaluje staré, nepotrebné.
apt update
apt full-upgrade
Prečo „full-upgrade“ a nie iba „upgrade“?
Príkaz apt upgrade je veľmi konzervatívny. Ak nová verzia nejakej služby (napríklad databázy) vyžaduje doinštalovanie novej systémovej knižnice alebo dôjde k zmene názvu potrebného balíka, klasický upgrade takúto aktualizáciu odmietne vykonať. V termináli vtedy uvidíme hlásenie: „The following packages have been kept back“. To znamená, že systém odmietol urobiť zmenu v závislostiach.
Príkaz apt full-upgrade má povolenie tieto zložitejšie zmeny vykonať (nainštalovať nové knižnice alebo odstrániť staré), čím zabezpečí, že server nezostane neaktualizovaný a bez bezpečnostných záplat.
Čistenie systému
Po viacerých aktualizáciách kernelu (jadra) a systémových knižníc v systéme zostávajú staré, už nepotrebné súbory, ktoré zbytočne zaberajú miesto na disku. Na ich odstránenie slúži príkaz:
apt autoremove
Po spustení tohto príkazu nám systém napíše presný zoznam toho, čo ide zmazať a môžeme sa rozhodnúť, či s tým súhlasíme. Konfiguračné súbory sa však zachovajú.
Pokiaľ si želáme prečistenie aj so zmazaním konfiguračných súborov (a to aj z tých „zabudnutých“ aplikácií, ktoré už sú odinštalované), dosiahneme to príkazom:
apt autoremove --purge
Prečo sa staré verzie systémových súborov nezmažú hneď?
Jadro: Ak by sa po aktualizácii jadra nepodarilo spustiť OS, počítač by zostal „mŕtvy“. Preto si Linux uchováva aj staré jadrá a je ich možné zvoliť v štartovacej GRUB ponuke. Až keď sa uistíme, že nové jadro nám funguje bez problémov, je správny čas staré jadro zmazať.
Knižnice: Ak aplikácia potrebovala k behu nejaké knižnice, tie sa nainštalovali tiež. Po odinštalovaní aplikácie však v systéme tieto knižnice zostanú - možno sú potrebné pre inú aplikáciu, nainštalovanú neskôr. Funkcia autoremove zisťuje, či je niektorá knižnica nepotrebná a ak áno, zmaže ju. Takto má správca systému situáciu viac pod kontrolou a možnosť všímať si, čo sa kedy odinštaluje.
Pre úplnosť dodajme, že softvérové balíky je možné aj odinštalovať, a to príkazom:
apt remove {názov balíka}
Opäť platí, že konfiguračné súbory sa zachovajú a že pokiaľ chceme zmazať aj tie, použijeme parameter --purge.
Sprístupnenie servera cez názov (mDNS)
Aby sme si nemuseli pamätať IP adresu servera, je vhodné priradiť mu doménové meno cez DNS server a zariadiť, aby sa IP adresa nemenila. Toto všetko samozrejme ovládame z kurzu Počítačové siete 1, no pokiaľ k serveru pristupujeme z LAN, dá sa to riešiť oveľa jednoduchšie - využitím mDNS (pozri kapitolu 10.7 Systém doménových mien, DNS, DoH a mDNS v kurze Počítačové siete 2).
Realizácia je úplne jednoduchá: stačí nainštalovať službu Avahi:
apt install avahi-daemon
Hneď po inštalácii začne fungovať mDNS meno v tvare {meno servera}.local, teda napríklad server-vyucba.local.
Pridanie ďalších doménových mien
Hoci sa to zatiaľ môže zdať zbytočné, v budúcnosti (hlavne, keď sa v ďalších kapitolách zoznámime s reverzným proxy serverom), nám môže prísť vhod pridelenie ďalších doménových mien. Veď prečo by sme na jedinom serveri nemohli mať viaceré služby a každú volať svojím vlastným menom? V takejto situácii je už vhodnejšie upustiť od mDNS a riešiť klasické DNS mená na DNS serveri.
Ak by však niekto predsa len chcel použiť alternatívne mDNS mená, je možné ich jednoducho zapísať do súboru /etc/avahi/hosts v samostatných riadkoch v tvare „IP_adresa meno.local“ (je možné definovať zvlášť riadok s IPv4 a zvlášť s IPv6) a následne reštartovať službu príkazom systemctl restart avahi-daemon. Pozor však na skutočnosť, že pokiaľ server obdrží inú adresu z DHCP, záznam prestane fungovať - preto treba zariadiť, aby sa IP adresa nemenila.
Snap
Inštaláciu potrebného softvéru môžeme vykonať štandardným spôsobom cez APT, no existujú aj flexibilnejšie a bezpečnejšie možnosti. Najjednoduchšiu správu ponúka systém Snap, ktorý je v Ubuntu Server preferovaný. Ten inštaluje služby v izolovanom prostredí (sandboxe). V praxi to znamená, že aplikácia nemôže pristupovať k súborom mimo svojho vyhradeného priestoru, pričom k nevyhnutným systémovým súborom má prístup obmedzený len na čítanie. Bez špeciálneho povolenia nemôže pristupovať ani k hardvéru (GPIO). Tieto privilégiá jej však môžeme v prípade potreby selektívne udeliť, čím si zachovávame plnú kontrolu nad bezpečnosťou servera.
Inštalácia cez Snap je pomerne kontroverzná téma. Nájdu sa ľudia, ktorí si jednoduchosť systému Snap pochvaľujú a nájdu sa zarytí odporcovia - niektorí presadzujú len „klasické“ inštalácie a niektorí zase len robustnejší Docker, s ktorým sa zoznámime v ďalších kapitolách. My sa budeme snažiť o neutrálny prístup, ktorý z každého sveta využije to najlepšie pre danú situáciu.
Inštalácia Snap
V prvom rade by sme mali zistiť, či je systém Snap nainštalovaný - overiť to môžeme prehľadom všetkých nainštalovaných boxov - služieb alebo aj bežných aplikácií:
snap services # vypíše len služby
snap list # vypíše aj aplikácie
V inštalácii Ubuntu Server je Snap predinštalovaný a pokiaľ pri inštalácii zvolíme aj inštaláciu niektorých služieb (napríklad Mosquitto, Docker), tie sa tiež nainštalujú cez Snap. V opačnom prípade je potrebné Snap najskôr nainštalovať a následne systém reštartovať alebo sa aspoň odhlásiť a znovu prihlásiť:
apt install snapd
snap install core
Inštalácia aplikácií a služieb cez Snap
Snap umožňuje vypísať informácie o balíku (popis, verzie v jednotlivých kanáloch a ich veľkosti) aj pred jeho inštaláciou, prípadne môžeme vyhľadať balíky, obsahujúce zadaný text:
snap info {názov balíka}
snap find {hľadaný názov}
Snap boxy s požadovanými serverovými službami nainštalujeme veľmi jednoducho, vhod príde aj bežná systémová aplikácia btop (zobrazuje vyťaženie CPU, pamäte, disku, siete a zoznam procesov):
snap install mosquitto
snap install node-red
snap install btop
Snap nainštalované služby automaticky spúšťa (aj po reštarte systému) a nebráni prístupu k ich otvoreným sieťovým portom. Inštaláciu Node-RED je teda možné hneď overiť na porte 1880 cez webový prehliadač.
Ovládanie služieb cez Snap
Jednotlivé služby môžeme manuálne vypínať a zapínať príkazmi:
snap stop {služba}
snap start {služba}
Rovnako jednoduché je aj odstránenie služby:
snap remove {služba}
Pozor, odstránením služby sa vymažú aj všetky nastavenia a ostatné údaje, predtým je vhodné si ich zálohovať z priečinku /var/snap/{služba} - odkaz current smeruje do priečinka aktuálnej verzie služby, priečinok common je spoločný.
Sledovať štandardný výstup danej služby (napríklad hlásenia protokolu) je možné príkazom:
snap logs -f {služba}
Tento príkaz „naživo“ zobrazuje protokol, teda nielen hlásenia z minulosti, ale priebežne dopĺňa aj aktuálne. Zo zobrazovania odídeme klasickou konzolovou klávesovou skratkou Ctrl + C.
Aktualizácia služieb cez Snap
Snap sa stará aj o automatické aktualizovanie služieb, pričom údaje sa zachovajú. Toto je azda najviac diskutovaná téma v súvislosti so Snap, ktorá má svoje plus a mínus:
- Výhoda je jasná - server je vždy v bezpečí, má najnovšie záplaty i funkcie a netreba sa o to starať.
- Nevýhoda sa môže ukázať v situácii, ak po niektorej aktualizácii (napríklad po rokoch od pôvodnej inštalácie a konfigurácie) prestane služba fungovať. Ak sa zmení konfiguračný formát alebo zásadne zmení fungovanie, či sa ukáže nejaká skrytá chyba, systém „sám od seba“ prestane fungovať.
V predvolenom stave sa aplikácie automaticky aktualizujú 4× denne, a to kedykoľvek. Čas aktualizácie je však možné obmedziť - napríklad aby prebiehali v noci, keď sa služby nevyužívajú:
# nastavenie aktualizácií na noc
snap set system refresh.timer=02:00-04:00
# overenie nastavenia
snap get system refresh.timer
Hoci to z hľadiska bezpečnosti nemožno odporúčať, vývojári podľahli tlaku komunity a pridali možnosť pozdržania aktualizácií, pričom toto pozdržanie môže byť aj trvalé (do odvolania):
snap refresh --hold={čas} {služba}
Čas môžeme zadať v hodinách (napríklad „720h“) alebo použiť hodnotu „forever“. Ak neuvedieme názov služby, pozdrží sa aktualizácia všetkých. Pozdržanie je možné zrušiť parametrom --unhold.