Certstream HOWTO

Do czego można wykorzystać dane pochodzące z certstream można zobaczyć choćby na prezentacji z konferencji z BSides Warsaw z 2019 roku. Ponieważ każdy ma certstream, mam i ja. Nie jest to zbyt zasobożerne, a można popatrzeć pod kątem security i phishingu, co w sieci piszczy.

Problem

Niestety, zauważyłem korzystanie z certstream jak w przykładach, z użyciem biblioteki Pythona nie jest idealne. Problem objawia się tym, że co jakiś czas następuje zerwanie połączenia z serwerem widoczne jako:

[ERROR:certstream] 2021-11-22 17:18:01,171 - Error connecting to CertStream - Connection to remote host was lost. - Sleeping for a few seconds and trying again…
[INFO:certstream] 2021-11-22 17:18:06,564 - Connection established to CertStream! Listening for events…
[ERROR:certstream] 2021-11-22 17:18:51,893 - Error connecting to CertStream - Connection to remote host was lost. - Sleeping for a few seconds and trying again…
[INFO:certstream] 2021-11-22 17:18:57,213 - Connection established to CertStream! Listening for events…

Początkowo nie wydawało się to dramatem. Kilka sekund przerwy, co parę minut nie powinno mocno wpływać na wyniki. Niestety, pominięte certyfikaty okazały się zauważalne, więc zacząłem szukać przyczyny i rozwiązania tego problemu.

Debug

Na pierwszy ogień poszła wyszukiwarka. Okazało się, że ludzie mają ten problem w różnych warunkach. Jedni sugerowali, że zależne jest to od wersji Pythona. Inni nie potwierdzali i sugerowali problem z serwerem certstream.calidog.io. Podejrzewałem także zbyt niską wydajność serwera VPS na którym działa skrypt, ale ten pomysł szybko odrzuciłem – na mocniejszym VPS nie było wielkiej różnicy. Problem nie był palący i przeleżał trochę czasu. Dopiero na którejś konferencji zaczepiłem Adama L., który również korzysta z certstream i zdarza mu się wspominać w prezentacjach o tym. Zasugerował problem z biblioteką, jej debug i zrobienie po swojemu, na wzór.

Zainspirowało mnie to do bliższych oględzin. Nie jest to trudne – biblioteka jest niewielka i prosta. Na pierwszy ogień poszła złożoność operacji wykonywanych w skrypcie podczas sprawdzania domen. Szybko jednak okazało się, że nawet nie wykonując jakichkolwiek operacji, nawet nie wyświetlając domen, nadal obserwuję rozłączenia. Postanowiłem spróbować skorzystać z innego serwera certstream, tym bardziej, że biblioteka wprost przewiduje zmianę URLa. Tyle, że miałem problem ze znalezieniem takowego.

Na szczęście CaliDog udostępnia także kod źródłowy serwera napisany w… Eliksirze. Nie ukrywam, że była to dla mnie nowość. Instalacja na Debianie była pewnym wyzwaniem. Dla leniwych jest dostępny obraz dockera, ale z pewnych względów stwierdziłem, że wolę zainstalować w systemie.

Instalacja serwera certstream na Debianie

Instalacja na Debianie Bullseye jest w zasadzie zgodna z tym, co napisano w instrukcji repo i na stronie Elixir. Czyli nie jest zgodna. Pierwsza sprawa, to brak pakietów dla Bullseye[1]. Bez problemu można jednak skorzystać z pakietów przygotowanych dla starszej wersji, czyli Buster. W pliku /etc/apt/sources.list.d/erlang-solutions.list powinno pojawić się zatem:

deb http://binaries.erlang-solutions.com/debian buster contrib

Kolejna rzecz powodująca problemy z uruchomieniem serwera certstream to konieczność doinstalowania pakietu erlang-dev:

apt-get install erlang-dev

Po tych zabiegach serwer powinien się bez problemu uruchomić. Domyślnie działa bez szyfrowania na porcie 4000, więc jeśli nie postawimy frontu z certyfikatem SSL, to URL serwera certstream zmieni się z domyślnego wss://certstream.calidog.io na ws://NASZ.ADRES:4000 – trzeba podać port i usunąć jedno s.

Po uruchomieniu własnego serwera i podłączeniu tego samego skryptu, z tego samego VPSa, okazało się, że rozłączenia prawie nie występują. Zaś porównując ilość zgubionych domen okazało się, że jest ich znacznie więcej, niż przypuszczałem. Nawet średnie kilkadziesiąt procent.

Serwis

Do pełni szczęścia brakuje tylko, aby wszystko działało automatycznie. Można to uzyskać tworząc serwis. Można np. utworzyć plik:

/etc/systemd/system/certstream-server.service

o zawartości

[Unit]
Description=Certstream server service
After=network.target
StartLimitIntervalSec=3


[Service]
Type=simple
Restart=always
RestartSec=1
User=certstream
WorkingDirectory=/opt/certstream-server
ExecStart=/usr/bin/mix run --no-halt

[Install]
WantedBy=multi-user.target

Następnie należy zarejestrować serwis i można cieszyć się serwisem uruchamiającym się automatycznie podczas startu systemu. A także po ew. awarii. Ścieżki i user do dokonfigurowania we własnym zakresie.

[1] UPDATE: Część o braku pakietów dla Bullseye jest nieaktualna. Ze sporym opóźnieniem, ale się pojawiły. Warto zatem korzystać z wersji dedykowanej dla używanej dystrybucji.

Bullseye

Zakończyłem aktualizację ostatniej[1] maszyny do Debiana 11 czyli Bullseye, pora na tradycyjne podsumowanie.

Najpierw zaktualizowałem kontenery. Operacja totalnie bezproblemowa przy pomocy apt. Czyli wariant zalecany. Z większych zmian warto jedynie odnotować zmianę wpisu dla repozytorium security w sources.list.

Główny host jedynie odrobinę gorzej. Coś mu nie poszło przy zależnościach i odinstalował mariadb. Konfiguracje i dane zostały, więc przywrócenie trwało moment. Niemniej miał prawo się pogubić, korzystam z dodatkowych repozytoriów w tym systemie.

Desktopy również niemal bezproblemowo, w tym przejście z unstable na stable przy okazji upgrade. Jedyne z czym był problem to WiFi i wicd. Z uwagi na zależność od Pythona 2.x pakiet jest usuwany i… skończyłem bez sieci na pierwszym systemie. Rozwiązanie jest proste: wystarczy przeprosić się z network managerem i zainstalować go zamiast wicd przed aktualizacją. Po takim zabiegu aktualizacja bezproblemowa.

Ostatnie było Raspberry Pi robiące za router GSM. Tam co prawda jest Raspbian, nie Debian, ale można powiedzieć, że także była to aktualizacja do Bustera z uwagi na zmiany wpisów w sources.list. Nieco się pospieszyłem i instalowałem jako wersję niestabilną. Niemniej – bez problemu. Choć przygotowałem się na reinstalację systemu i operację przeprowadzałem nie zdalnie, a z fizycznym dostępem do sprzętu.

Ogólnie wygląda na brak większych zmian i chyba najbardziej bezproblemową aktualizację w historii. Jedyne co zauważyłem, to nieco większe zużycie miejsca na dysku. Generalnie tak to już bywa, że nowszy soft jest większy niż stary, ale w przypadku maszyny z kontenerami lxc zabolało to nieco bardziej. Dobiłem do granicy wolnego miejsca na dysku przy wykonywaniu się backupów. IIRC nie skończyło się zupełnie, ale było dosłownie na styk.

Zrobiłem porządki zarówno w logach, zbędnych rzeczach, jak i pakietach. Okazało się bowiem, że w kontenerach mam trochę nadmiarowych rzeczy. Przy tej ostatniej operacji okazało się, że na jednym z kontenerów apt działa wolno. Pobieranie działało normalnie, przeliczanie zależności także. Natomiast każde dodanie lub usunięcie pakietu zaczynało się od przestoju, podczas którego nic się na oko nie działo. Szybki strace ujawnił, że chodzi o okolice dbus. Usunięcie pakietu – kolejnego zbędnego, zresztą – rozwiązało problem.

[1] Tak naprawdę jeden kontener został na Buster i póki co zostanie – soft do generowania Planety Joggera zniknął z Bullseye. I raczej nie wróci, więc trzeba pomyśleć nad przesiadką na inny soft. Niemniej, nic związanego z samym systemem.

Odmładzanie szrotu komputerowego

Jest taki komputer, z którego korzystam w domu rodziców. Poleasingowy desktop, z monitorem CRT 17″, czyli zabytek. Służy do przeglądania WWW, jako terminal oraz jako dodatkowy storage na backupy zdjęć na starych, niewielkich dyskach 3,5″. Korzystam z niego sumarycznie tydzień, może dwa w roku. Kiedyś niewiele więcej. Wyposażony w Intel(R) Core(TM)2 Duo CPU E4600 @ 2.40GHz i 2 GB RAM, w zasadzie spełniał swoje zadanie.

Niestety, 2 GB RAM powodowały, że z niektórymi rzeczami nie dawał rady. I pół biedy, jeśli było to kilka zakładek WWW. Gorzej, że zaczął mieć problem z otwarciem co większych zdjęć z poczty. Korzystam z niego na tyle rzadko, że wymiana sprzętu nie miała sensu. Z drugiej strony wyprzedaję trochę starych podzespołów, więc wiem, jak niskie są ceny. Postanowiłem sprawdzić, czy da się dołożyć pamięci RAM.

Płyta główna

Okazało się, że płyta to DQ35JO i obsługuje wg dmidecode maksymalnie do 8 GB RAM DDR2. Co więcej, ma cztery sloty. Rozważałem dokupienie 2×2 GB, co pozwoliłoby rozbudować pamięć do 4 GB, a przy odrobinie szczęścia do 6 GB. Ceny do zakupu od ręki były nieadekwatne (ok. 40 zł za ww. konfigurację), ale temat nie był pilny. Trochę policytowałem i kupiłem 2×1 GB RAM za… 1 zł. Plus wysyłka.

Procesor

Trochę się rozochociłem, więc sprawdziłem, jakie jeszcze procesory obsługuje płyta. Znowu pozytywne zaskoczenie, bo można włożyć całkiem sporo modeli procesorów, w tym Core 2 Quad. Ceny tych ostatnich znowu były nieadekwatne, ale znalazłem dostępne od ręki Intel Core 2 Duo E8400 3.0 GHz za… 5 zł. Specyfikacja tutaj. Jak widać TDP bez zmian, taktowanie 25% większe, cache L2 trzy razy (sic!) większy. Grzech nie wymienić, znaczy, bo procesor szybszy. Oczywiście to sztuka dla sztuki, pewnie nie odczuję w praktyce różnicy, ale chodzi głównie of fun z grzebania w sprzęcie.

Zakupy

Szczęśliwie sprzedawca miał w ofercie pastę termoprzewodzącą na procesor. Zrobiło się całe 11 zł plus wysyłka, która niemal podwajała cenę. Jak szaleć to szaleć, z miejscem na dyskach też było słabo, więc dorzuciłem dysk 500 GB za 35 zł dzięki czemu wysyłka załapała się na Smart! Dysk się przyda, bo w maszynie był stary, mały dysk IDE oraz niewiele większy SATA. Istotniejsze dane tzn. backupy leżą sobie na softraid RAID1, pozostała część to system i śmieci. Jedyne o czym zapomniałem i musiałem dokupić później, już gdzie indziej, to przejściówka do zasilania dysku SATA za 7 zł z wysyłką.

Wymiana odbyła się błyskawicznie. Najpierw wymieniony RAM i sprawdzenie przy pomocy memtest86+, potem procesor. Cieszę się, że nie skusiłem się na mocniejszy procesor, bo radiator jest… taki sobie. Jakiś stockowy zapewne, mało metalu, nie wygląda na coś potrafiącego odprowadzać większą ilość ciepła.

Ekonomia

Oczywiście z ekonomicznego punktu widzenia sens jest żaden, bo chodziło o fun. Zamiast rozbudowywać stary sprzęt, pewnie bardziej opłaca się kupić gotowy, kompletny zestaw z 4 GB RAM i dyskiem. Sprawdziłem i używany stacjonarny komputer z Core 2 Quad można kupić już za 170 zł. A Core 2 Duo za 130 zł. I to biorąc tylko pod uwagę oferty od Super Sprzedawców.

Oczywiście kupując takiego szrota „do WWW” warto zwrócić uwagę na procesor i rozmiar dysku. Dopłacając symboliczne kwoty można kupić znacznie lepszy sprzęt. Do sporadycznego korzystania pobór prądu nie robi różnicy. Jeśli jednak komputer miałby być włączony codziennie, przez dłuższy czas, warto przeliczyć kalkulatorem, czy nie lepiej zainwestować w coś bardziej energooszczędnego.