Šifrovaná komunikácia medzi programami a mobilnými zariadeniami

O potrebe šifrovanej komunikácie a šifrovaných komunikátoroch som už písal. Zameriaval som sa však na komunikáciu medzi ľuďmi – či už písomnú, hlasovú, video alebo skupinovú. Pre mňa zaujímavou témou je však aj komunikácia medzi počítačom a človekom – konkrétne mnou. Už kedysi, keď som sa venoval správe systémov som potreboval dostávať upozornenia o tom, že sa niečo pokazilo.

Teraz na to používam jednoduchý systém, ktorý je optimalizovaný na to, aby bežal aj na malých zariadeniach (routroch, NAS) a nepotreboval zložitú infraštruktúru. Vytvoril som si systém signal-monitoring, ktorý túto úlohu zvláda pre mňa dostatočne.

Ostáva doriešiť otázku ako jednoducho a spoľahlivo doručiť notifikácie, keď skript príde na to, že niečo vypadlo.

Okrem toho často riešim problém, že spustím nejaký dlhší proces (často lokálna inferencia pomocou AI) a idem robiť niečo iné. Rád by som sa buď dozvedel, že proces skončil alebo ideálne rovno získal výstup (napríklad vo formáte markdown).

Na riešenie oboch týchto problémov máme viacero možností.

Signal

Signal vieme používať pomocou nástroja signal-cli. Ten som pôvodne aj používal v monitorovacom skripte, preto sa volá signal-monitoring. Má však viacero praktických problémov.

Prvým problémom je, že signal-cli je v Jave a aj napriek snom autorov Javy táto jednoducho nebeží všade. Aspoň nie až tak ľahko. Nakoniec sa mi ale signal-cli podarilo rozbehať všade, vrátane OpenWRT routra, takže tento problém som nejak prekonal.

Druhým problémom je nutnosť vytvárať účty a teda nutnosť existencie telefónneho čísla. To som vyriešil tiež, ale teraz sa musím starať o anonymné predplatené SIM karty, ktoré by ideálne nemali expirovať, čo predplatené SIMky väčšinou robia ak ich pravidelne nedobíjame.

Tretím problémom, kvôli ktorému som sa začal pozerať po alternatívach je, že anti-spam riešenie Signalu je CAPTCHA – a na to sa z pohľadu skriptu nemôžem spoľahnúť. Je pravda, že na notifikácie som CAPTCHA zatiaľ nepotreboval, ale túto situáciu by som nevedel automatizovane vyriešiť.

Matrix / Element / matrix-commander

Ďalšou možnosťou, ktorú som skúsil, je použiť matrix-commander a komunikačnú sieť Matrix. Nevýhodou je nutnosť vytvárať účty na Matrix serveroch a prípadne potreba bežať vlastný server. Infraštruktúra taktiež závisí od konkrétnych Matrix serverov.

Aj napriek tomu táto možnosť prakticky funguje veľmi dobre. Len vytváranie účtov je nepohodlné. Ak mám len jeden router, NAS, server, notebook, tak musím mať štyri rôzne účty, ktoré musia mať nejaké heslá, niekde sa registrovať, mať kľúče a komunikovať s mojimi zariadeniami.

Matrix má svoje problémy so synchronizáciou šifrovacích kľúčov, aj keď v tomto konkrétnom use-case sa zatiaľ neprejavili.

Nevýhoda je potreba Pythonu, ale ten mám všade, aj na routri, takže sa prakticky neprejavila.

Telegram

Lol

LXMF

LXMF je šifrovaný komunikačný protokol siete Reticulum. Pridal som ho najmä ako proof of concept, ale napríklad notifikácia o tom, že mi vypadol internet mi vie prísť po lokálnej sieti (vďaka mesh vlastnostiam siete Reticulum). Na notifikácie napríklad o teplote, stave stodoly a podobne je fajn aj to, že správu dokážem poslať cez LoRA rádio na pomerne veľkú vzdialenosť.

Jeden z fun projektov, ktorý som chcel týmto protokolom zrealizovať je notifikátor o tom, že mi prišla do schránky fyzická pošta. Mikro zariadenie na baterke s Lora modulom a detektorom pohybu a prípadne malou kamerkou.

Správy prichádzajú do komunikačného nástroja ako Meshchat alebo Sideband na mobile. Ak mám cestou dobre poprepájané nody, tak si správa nájde cestičku aj pri výpadku infraštruktúry.

Nevýhoda je potreba Pythonu, ale ten mám všade, aj na routri, takže sa prakticky neprejavila. A nemám pre to až taký use-case. Radšej by som mal nejaký messenger, ktorý používam na dennodennú komunikáciu, aby som si problém s nefunkčnosťou všimol včas – napríklad tým ako LXMF funguje je potrebné appku spustiť, keďže push notifikácie nemusia prísť.

Správy posielam jednoduchým Python skriptom.

Nostr

Nostr je na toto použitie relatívne fajn, aj keď stále je otázna spoľahlivosť a stabilita relays. Push notifikácie zatiaľ nie sú až také spoľahlivé. Na druhej strane nie je potrebné až tak vytvárať účty (stačí kľúčový pár), správy môžete redundantne doručiť na pár relays.

Nevýhoda je absencia súkromia, metadáta (kto, kedy a komu písal) sú viditeľné každému na relayoch. Sú novšie štandardy na správy, ale tie nie sú až také voľne rozšírené.

Čisto prakticky – Nostr správy si väčšinou nájdem keď sa pozriem do záložky so správami, nie ako notifikáciu.

O Reticulum a Nostr som nahral aj dva podcasty: Internet je pokazený, opravme ho – obchod s pozornosťou, nešifrovanie, centralizácia, identita, Internet je pokazený, opravme ho – Nostr, sieťové identity, aplikácie, value4value

SimpleX

Na posielanie správ cez SimpleX existuje CLI klient. Výhodou je, že nie je nutné vytvárať žiadne účty. Spustíte klienta, napíšete “meno” a pripojíte sa do skupiny pomocou invite odkazu. Správy posielam priamo do skupiny, kde mám moje mobilné zariadenia aj laptop.

Nevýhodou je, že ak sa správa nepošle do času, kým program skončí, SimpleX negarantuje doručenie. Beh programu sa dá predĺžiť (parametrom -t), ale ani doručenie za 10 sekúnd nemusí stačiť, obzvlášť ak sa jedná o súbor. Preto je možno dobré nechať program bežať dlhšie (aj minútu) a len ho poslať do pozadia.

Ak sa správa nestihne odoslať, odošle sa pri opätovnom spustení klienta, keďže sa pred odoslaním ukladá do lokálnej databázy.

Keďže pre komunikáciu je vždy potrebné vytvoriť obvod a explicitne prijať každú žiadosť o pripojenie, SimpleX nerieši nijak spam, teda nehrozí ani CAPTCHA. Nie je zároveň nutné sa starať o kľúče, e-mailové adresy a účty. Toto je nakoniec riešenie, ktoré som si vybral (so zálohou cez Matrix pre naozaj dôležité notifikácie).

Na svojich mašinách mám aj aliasy simplex-msg a simplex-file:

export SIMPLEX_DESTINATION="#monitoring"

function simplex-msg { (simplex-chat -t 20 -e "${SIMPLEX_DESTINATION} $*" >/dev/null &) ; }
function simplex-file { (simplex-chat -t 20 -e "/f ${SIMPLEX_DESTINATION} $*" > /dev/null &) ; }

Tieto mi dovolia poslať zo skriptu správu alebo súbor, bez ohľadu na to, na ktorom serveri alebo počítači som. Nemusím riešiť adresáta (alebo názov skupiny), toto mám všetko už prednastavené.

Simplex-chat u mňa vyhral po tom, ako začali publikovať skompilované binárky pre command-line rozhranie. Nevýhodou totiž je, že nie je až také jednoduché tento nástroj skompilovať. A bohužiaľ sa nenechádza v homebrew, takže ho z času na čas bude treba manuálne updatnuť (áno, homebrew používam ako používateľ – nie pod rootom – aj na Linuxe).

Na zálohy používam mimochodom restic, ktorý je tiež jedna samostatne stojaca binárka (aj keď ju používam občas aj s rclone, ktorý podporuje pcloud backend).

Záver

Hľadal som jednoduchý portabilný messenger, ktorý funguje z command-line, čo najjednoduchšie a bez potreby vytvárania účtov, registrácie, či prípadnej CAPTCHA. A ideálne bez toho, aby som musel bežať akúkoľvek server infraštruktúru, či inštalovať nejaké krkolomné frameworky (cieľ je, aby to fungovalo aj na čo najmenej výkonnom zariadení).

Simplex má svoje muchy, preto sa naň zatiaľ stopercentne nespolieham, ale ako balanc jednoduchosti používania (bez registrácií, jedna jednoduchá binárka, nie je potrebné bežať infraštruktúru, …), bezpečnosti a súkromia (šifrovanie, ochrana metadát).

Možnosť je aj používať ntfy, čo je nástroj presne určený na to, čo chcem. Má ale niekoľko nevýhod, napríklad horšie súkromie (prípadne nutnosť self-hostovať backend – čo keď vypadne ten?). Vadí mi však aj to, že je to samostatná aplikácia, chcel by som používať messenger, ktorý už aj tak na niečo používam, aby sa mi nestalo, že ho niekde zabudnem nainštalovať alebo spustiť.