Entropia w Linuksie – HOWTO

Dawno temu pojawił się mit, że w Linuksie /dev/random jest źródłem prawdziwej entropii, a /dev/urandom jest gorszy. Pokutuje on do dziś i część softu za źródło danych przyjmuje właśnie /dev/random, niezależnie od realnych potrzeb. Ilość losowych danych w systemie nie jest nieskończona i zależy od dostępnych źródeł i zdarzeń zewnętrznych. Dopóki komputery były głównie fizyczne, często obsługiwane przez ludzi, problem był nieco mniejszy. W epoce wirtualek systemy i ruch są coraz bardziej powtarzalne, więc z „prawdziwą” entropią są problemy. A entropia nadal jest w systemach aplikacjom potrzebna – słusznie lub nie, chyba nawet bardziej niż kiedyś, bo szyfrowanie wszystkiego jest coraz bardziej popularne i wykorzystywane są coraz silniejsze algorytmy.

Od pewnego czasu (okolice wersji 3.7) kernel Linuksa potrafi co prawda korzystać ze sprzętowych modułów (TPM) zapewniających źródła losowych danych, o ile takie są obecne. Nie każdy sprzęt jest jednak w to wyposażony, nie każda wirtualka posiada dostęp do danych z hypervisora i obecność modułu nie oznacza jeszcze, że dane będą dostępne dla programów, więc problem nadal pozostaje.

Sprawdzenie dostępnej entropii

Jeśli nie wiemy, czy faktycznie system ma problem z dostępną entropią, możemy to w prosty sposób sprawdzić. Aktualną ilość można odczytać przez wydanie polecenia:

cat /proc/sys/kernel/random/entropy_avail

Oczywiście jest to wartość chwilowa, zmieniająca się w czasie, żeby z całą pewnością stwierdzić, jak system stoi z entropią, trzeba by poobserwować w dłuższym czasie, a najlepiej monitorować ją, np. przy pomocy Zabbiksa. Wartość powyżej 1000 oznacza, że na pewno problemu nie ma, wartości poniżej 300 oznaczają, że prawie na pewno są niedobory, mogące wpływać na pracę usług.

rngd

Istnieją dwa rozwiązania, które pomogą zwiększyć ilość dostępnych danych losowych w systemie. Pierwsze z nich, to rngd z pakietu rng-tools. Jego zadanie jest proste – dostarczać dane do napełniania /dev/random korzystając ze wskazanego źródła.

Jeśli platforma posiada sprzętowy moduł dostarczający dane losowe, rngd warto skonfigurować, by z niego korzystał. W tym celu w pliku

/etc/default/rng-tools

należy umieścić linię

HRNGDEVICE=/dev/hwrng

Natomiast w przypadku braku takiego modułu, sugerowane jest dodanie linii

HRNGDEVICE=/dev/urandom

 

Kontrowersje korzystania z /dev/urandom

Korzystanie z /dev/urandom jako źródła danych dla /dev/random powoduje kontrowersje. Główne zarzuty to niegwarantowana losowość danych w /dev/urandom (ale patrz mit), oraz powstawanie sprzężenia zwrotnego, co łącznie może powodować okresowość, a zatem teoretyczną możliwość przewidzenia stanu generatora liczb pseudolosowych. Podkreślam, że jest to możliwość czysto teoretyczna, nie wykazana w praktyce.

Alternatywa dla rngd

Istnieje drugie popularne rozwiązanie programowe, które pozwala na zwiększenie dostępnej w systemie entropii. Jest to demon haveged z pakietu o tej samej nazwie. Korzysta on z faktu, że czas wykonania kodu przez procesor jest mało powtarzalny i zależy od wielu czynników. Jest to rozwiązanie obecne w dystrybucjach od wielu lat, proste w użyciu.

Wybór rozwiązania

Jeśli system posiada moduł sprzętowy, to bym z niego korzysał, za pośrednictwem rngd. Czy haveged jest lepszy od rngd zasilanego z /dev/urandom? Nie podejmuję się odpowiedzi na to pytanie. Oba zapewniają najważniejszą sprawę, czyli dostępność danych losowych. Oba rozwiązania spełniają proste testy badające losowość danych. Osobiście uważam, że w większości przypadków rozwiązanie korzystające z rngd jest wystarczające. Tam gdzie do losowości danych przykładana jest duża waga, nie jest nie powinno być problemu z dostępem do sprzętowych generatorów, a niedobory entropii zawsze są bardziej szkodliwe, niż jej teoretycznie niższa jakość.

Linki

Na koniec zbiór linków, zarówno źródła jak i dalsza lektura, czyli ciekawe linki (kolejność losowa):

Jak włączyć SSH w Raspbian?

Sytuacja zmusiła mnie do odkopania RPi. Szybko potrzebowałem przetestować jedną rzecz, więc wybrałem Raspbian Jessie Lite. Główna zaleta to niewielki rozmiar i kernel w wersji 4.4. Po włączeniu i pobraniu IP przez RPi okazało się jednak, że nie sposób się zalogować – nic nie słuchało na porcie.

Instrukcje, które znalazłem, są dobre, jeśli ktoś ma monitor i klawiaturę. Ja nic takiego pod ręką nie miałem, więc zacząłem przyglądać się skryptom startowym, ale w międzyczasie zapytałem na IRCu i dostałem linka, który podaje prosty przepis na włączenie SSH – wystarczy utworzyć plik ssh o dowolnej zawartości w katalogu /boot na karcie SD z Rasbianem:

touch /boot/ssh

Oczywiście powyższe zadziałałoby, gdyby było wykonywane bezpośrednio z Raspberry Pi, trzeba wziąć poprawkę na punkt montowania, ale wiadomo o co chodzi. 😉

Po tym zabiegu SSH jest dostępne po uruchomieniu systemu, zalogować się można tradycyjnie przy pomocy użytkownika pi i hasła raspberry.

Wyłączenie SSH w domyślnej wersji podyktowane było względami bezpieczeństwa (tu link).

Z kronikarskiego obowiązku: w Raspbianie bazujązym na Jessie wiele się nie zmieniło. Swap nadal domyślnie włączony i zarządzany w dziwny sposób (nie /etc/fstab), journal na FS obecny, sterowanie LED i odczyt temperatury bez zmian.

Ubuntu 14.04 LTS, apt-dater i restart usług

Jakiś czas temu zachwalałem apt-dater jako narzędzie do aktualizacji większej ilości systemów. Jak pisałem w późniejszych uwagach, apt-dater nieźle integruje się z programem needrestart. Tyle teorii…

Niestety, o ile na Debianie Jessie wyglądało to naprawdę dobrze i sprawdzenie przez checkrestart (inne polecenie realizujące podobne zadanie) dawało spójne wyniki z needrestart, o tyle na Ubuntu 14.04 LTS needrestart pokazywał często, że do restartu nic nie ma, o tyle checkrestart był zupełnie innego zdania... I – co gorsza – miał rację.

Przyczyną okazała się różnica w wersji needrestart. W Jessie jest to 1.2, w Ubuntu 14.04 LTS – 0.5. Ponieważ to skrypt perlowy, to dałem szansę i wrzuciłem wersję z Debiana (stable). Instaluje się czysto, działa bardzo dobrze – w połączeniu z apt-dater wykrywa więcej usług do restartu i także tu wyniki needrestart są teraz spójne z checkrestart.

Nawiasem, checkrestart w Jessie ma problem z mysql i zawsze pokazuje, że należy go zrestartować. Jest na to zgłoszony bug. Ale to tak nawiasem, kto korzysta, ten wie, zresztą można dopisać mysql do wyjątków w konfigu.

Docker.io Debian Jessie HOWTO

Parę dni temu pojawiła się nowa wersja Debiana o nazwie Jessie. O upgrade i drobnych i niedrobnych perypetiach napiszę innym razem, dziś krótkie rozwiązanie problemu, który pojawia się dość często na IRCu. Chodzi o to, że pakiet docker.io nie jest dostępny w Jessie. A ludzie chcą dockera używać. Widzę trzy rozwiązania:

1. Pobranie pakietu docker.io w wersji dla Debiana unstable.

Rozwiązanie najprostsze, ale potencjalnie najbardziej problematyczne. Wchodzimy na https://packages.debian.org/sid/docker.io wybieramy architekturę, następnie mirror, pobieramy paczkę deb (akualnie jest to docker.io_1.3.3~dfsg1-2_amd64.deb). Instalujemy ją w systemie, mniej lub bardziej ręcznie spełniając zależności.

2. Dodanie repozytoriów unstable w systemie oraz odpowiedni pinning pakietów.

Po pierwsze czytamy dokładnie i ze zrozumieniem jak działa pinning pakietów (man apt_preferences), żeby nagle nie zaktualizowało systemu do unstable, albo nie pomieszało pakietów ze stable i unstable przy spełnianiu zależności. Następnie dodajemy wpisy dla unstable w sources.list. Aktualizujemy listę pakietów i docker.io powinien być dostępny do instalacji.

3. Samodzielnie robimy backport pakietu docker.io dla Jessie.

Wersja najdoskonalsza, bo nie robi bałaganu związanego z mieszaniem wersji stable i unstable w systemie. Po pierwsze zaopatrujemy się w debianowe źródła pakietu. Można dodać wpisy deb-src dla unstable w sources.list, zaktualizować listę pakietów. Następnie:

cd /usr/srcwajig source docker.iocd docker.io-1.3.3~dfsg1/wajig builddepends docker.iodpkg-buildpackage
cd ..
wajig install docker.io_1.3.3~dfsg1-2_amd64.deb

W tym momencie powinniśmy mieć zainstalowanego dockera w systemie. Nie sprawdzałem, czy działa, ale zarówno metoda druga jak i trzecia powodują, że pakiet instaluje się czysto, więc raczej będzie działać. Przykłady dla wersji 1.3.3, być może z czasem może się coś zmienić.

Mój uptime

Już od jakiegoś czasu zastanawiałem się nad włączeniem monitoringu dla rosnącej liczby moich gratów w sieci. Do tej pory korzystałem z premedytacją głównie z gotowych serwisów typu Blox czy Jogger, ale ostatnio coraz więcej rzeczy jest zależnych tylko ode mnie. Niby niekrytyczne, ale… lubię, jak działa. A zdarzyło mi się, że po restarcie serwera nie wszystkie usługi działały – niby drobiazg, nie wstał varnish[1], ale efekty opłakane – statystyki nie działały.

Oczywiście mogłem podpiąć się pod monitoring w firmie (Zabbix), ale mało eleganckie, i ogólnie nie lubię mieszania gratów służbowych z prywatnymi. Mogłem też odpalić coś prostego swojego (nawet ze sprawdzaniem na krzyż, albo i w trójkącie), ale… trochę overkill, podobnie jak stawianie własnego Zabbiksa. Poza tym, na pewno nie miałoby to ładnego frontendu (chyba, że Zabbix). W ogóle pewnie nie miałoby frontendu. 😉

Stwierdziłem, że poszukam, bo na pewno są gotowe serwisy. Wymagania były proste:

  • darmowe
  • obsługa min. 5 hostów w darmowej wersji
  • prosta rejestracja i używanie
  • wsparcie dla IPv6
  • monitoring hostów (ping) oraz stron WWW

Owszem, są gotowe serwisy. Nawet sporo. Na tyle sporo, że miałem problem z decyzją. Prawie się zdecydowałem na monitor.us, ale zapytałem znajomych i… nikt nic nie umiał powiedzieć. Temat umarł śmiercią naturalną.

Przynajmniej na jakiś czas, bo niedawno zobaczyłem ten wpis i… dałem szansę serwisowi Uptime Robot. W sumie polecany na zestawieniu 10 darmowych serwisów do monitoringu stron WWW, więc pewnie go widziałem, ale jakoś nie zwróciłem uwagi. Ma wszystko co wyżej, na tle konkurencji wyróżnia się dużą liczbą sprawdzanych hostów/usług w wariancie darmowym (50) oraz stosunkowo wysoką częstotliwością sprawdzeń (co 5 minut), więc nada się nawet do więcej niż czysto amatorskich/prywatnych zastosowań.

Dashboard wygląda tak:

Uptime Robot dashboard

Kolejna wyróżniająca cecha to bycie darmowym jako podstawa, nie jako doklejka – serwis powstał jako darmowy z założenia, wersja płatna została dorobiona później, dla tych, którzy jednak potrzebują więcej. Wygląda więc, że nie zniknie nagle, nie zacznie proponować nachalnie płatnej wersji czy wymagać klikania linków co miesiąc…

A tak wygląda wykres dla pojedynczego hosta (ten z przerwą):

Uptime Robot wykres dla hosta

Uptime Robot umie powiadamiać o awarii mailem (tak właśnie korzystam, w końcu to prywatne graty) oraz dodatkowo przez IM (Twitter) oraz SMS (z tych metod nie korzystam). Metodę powiadomień ustawia się dla każdego hosta indywidualnie, więc można mieć ważne i ważniejsze, pilne i pilniejsze. Sprawdzać można działanie strony, obecność zadanej treści na stronie, odpowiedź hosta na ping oraz status otwarcia portu. Jak na serwis darmowy – więcej niż wystarczające. Do tego całość jest schludna i prosta. Polecam.

[1] Zachciało mi się usprawnień i optymalizacji… W top wyglądało OK – mysql był, lighttpd był…

Iptables TARPIT, czyli spowolnij boty

Jak wiadomo, nie jestem fanem malware i raczej staram się uprzykrzać życie botom i spamerom. Nic wielkiego: a to zrobię miejsce, gdzie boty mogą znaleźć wiele adresów email, a to zwykły spam do SpamCopa wyślę, a to boty próbujące zgadnąć hasła SSH metodą bruteforce zgłoszę do blocklist.de. No i właśnie o botach atakujących SSH tym razem będzie.

Poprzedni wpis był o dziwnych wpisach w auth.log i choć już prawdopodobnie sama konfiguracja serwera powodowała zaangażowanie botów, z którego nie miały pożytku, to, jak zapowiedziałem w komentarzach,  postanowiłem pójść o krok dalej.

Otóż iptables pozwala nie tylko na odrzucenie połączenia (DROP, REJECT), ale – co prawda nie w podstawowej wersji – także na udawanie nawiązania połączenia przy pomocy TARPIT. Jeśli chodzi o szczegóły, to odsyłam do tego artykułu, a w skrócie: połączenie przychodzące do serwera jest nawiązane, dane nie są przesyłane, nie jest honorowane zakończenie połączenia, musi dojść do timeoutu po stronie klienta (bota). Czyli bot traci zasoby na komunikację, która się nie odbywa. Zużywa ich więcej, niż gdyby po stronie serwera był w iptables REJECT czy DROP.

Aby zainstalować TARPIT w Debianie, potrzebujemy źródeł kernela oraz pakietu xtables-addons-dkms. Pierwsze możemy zainstalować przez:

apt-get install linux-headers-`uname -r`

Przy okazji powinny doinstalować gadżety typu GCC, które za moment będą potrzebne. Natomiast właściwy pakiet instalujemy oczywiście przez:

apt-get install xtables-addons-dkms

Jeśli wszystko poszło OK, to zostaną zbudowane stosowne moduły dla aktualnie uruchomionego kernela i można korzystać w iptables z -j TARPIT.

Oczywiście to nie wszystko, co można zrobić z TARPIT. Inne, związane z utrudnieniem skanowania itp. można znaleźć na stronie projektu LaBrea. Polecam lekturę.

Proste rozwiązanie dla tych, którzy przenieśli SSH na inny port, niż standardowy, to utworzenie reguły:

iptables -A INPUT -p tcp -m tcp --dport 22 -j TARPIT

Wszystkie boty próbujące bruteforce na standardowym porcie 22 ugrzęzną tu na chwilkę. 😉

Linki:

  1. Slow Down Internet Worms With Tarpits
  2. LaBrea: „Sticky” Honeypot and IDS
  3. Debian TARPIT iptables How To

Dziwne wpisy w auth.log, czyli coś nowego na SSH

Jedną z maszynek mam wystawioną do netu z SSH na standardowym, 22 porcie[1]. Głównie w celu zbierania śmieci (i zgłaszania ich do blocklist.de). Zerknąłem na /var/log/auth.log i zobaczyłem masę nietypowych wpisów typu:

Jan  8 19:41:28 xxx sshd[32002]: Connection closed by 195.130.253.159 [preauth]Jan  8 19:46:52 xxx sshd[32298]: Connection closed by 195.130.253.159 [preauth]Jan  8 19:52:16 xxx sshd[32645]: Connection closed by 195.130.253.159 [preauth]

Są to jedyne wpisy w logach dotyczące tych IP. IP jest stosunkowo niewiele, połączenia zwykle co kilka minut. Brak śladów po próbie logowania. Wydaje mi się, że wcześniej tego nie było, przynajmniej nie aż tyle. Logi mam od 7 grudnia, wygląda, że zjawisko zaczęło się w okolicy 11 grudnia, a apogeum miało miejsce na przełomie roku:

zegrep -h "Connection closed by .*preauth" /var/log/auth.log* | awk '{print $1" "$2}' | sort | uniq -c | sort -n      1 Dec 11      1 Dec 12      1 Dec 21      1 Dec 8      2 Dec 18      4 Dec 17     10 Dec 26     19 Dec 16     43 Dec 14     75 Dec 22    150 Jan 4    155 Jan 8    159 Dec 24    209 Dec 15    214 Dec 27    267 Jan 5    303 Jan 7    360 Dec 28    381 Jan 3    445 Dec 29    446 Jan 6    717 Dec 30    905 Jan 2   1041 Jan 1   1132 Dec 31

Jeśli chodzi o rozkład IP, to na moim serwerze wygląda to następująco (tylko ponad 100 wystąpień prezentuję):

zegrep -h "Connection closed by .*preauth" /var/log/auth.log* | awk '{print $9}' | sort | uniq -c | sort -n | egrep "[0-9][0-9][0-9]    113 128.199.252.25    147 121.78.147.217    159 195.154.226.100    358 195.130.253.159    416 118.98.43.33    684 37.187.119.89   1378 76.74.157.51   1416 112.216.92.44   1883 112.107.2.154

Kolejnych 13 IP ma powyżej 10 wystąpień.

Jeśli chodzi o kraje, to raczej malware’owy standard (dla >10 wystąpień):

zegrep -h "Connection closed by .*preauth" /var/log/auth.log* | awk '{print $9}' | sort | uniq -c | sort -n | egrep "[0-9][0-9] " | awk '{print $2}' | xargs -L1 geoiplookup | sort | uniq -c | sort -n      1 GeoIP Country Edition: AR, Argentina      1 GeoIP Country Edition: AT, Austria      1 GeoIP Country Edition: GB, United Kingdom      1 GeoIP Country Edition: ID, Indonesia      1 GeoIP Country Edition: IT, Italy      1 GeoIP Country Edition: NL, Netherlands      1 GeoIP Country Edition: RU, Russian Federation      2 GeoIP Country Edition: FR, France      2 GeoIP Country Edition: IP Address not found      3 GeoIP Country Edition: CN, China      3 GeoIP Country Edition: KR, Korea, Republic of      5 GeoIP Country Edition: US, United States

Ktoś się orientuje o co chodzi? Jakiś nowy atak? Błąd w skryptach od bruteforce w którymś botnecie?

UPDATE Dzięki pomocy ludzi z #z3s udało się ustalić, że tego typu wpisy w logach pojawią się, jeśli nawiąże się połączenie tylko w celu pobrania obsługiwanych sposobów szyfrowania (i rozłączy się po ich otrzymaniu). Nie tłumaczy to oczywiście, czemu połączenia się powtarzają. Padła sugestia, że może jakiś głupi bot wykłada się na nietypowej konfiguracji – host nie ma domyślnego konfiga SSH, tylko wdrożone zalecenia z bettercrypto.org (polecam, swoją drogą).

[1] Ponieważ było to pierwsze pytanie, jakie dostałem, to dopiszę: tak, celowo, tak nie mam tu innego portu/fail2ban/knockd, choć każda z tych metod pewnie eliminuje 99% skanów. Jestem świadomy możliwości nie oglądania tego typu rzeczy, ale tu chcę je widzieć.

Shutter, czyli Linux i screenshoty

Przyznaję, że jeśli chodzi o zrzuty ekranu pod Linuksem, to nie znałem do tej pory dobrego narzędzia. Znaczy jest scrot[1], który jest prosty, bardzo mały, lekki i wywoływany z CLI, i którego użycie w wersji podstawowej, czyli cd /tmp && scrot -d 8 było proste do zapamiętania, ale… jak lubię CLI, tak w przypadku grafiki to zdecydowanie nie jest to, co tygrysy lubią najbardziej. Tym bardziej, że zwykle robię zrzuty przeglądarki, więc trzeba było dodatkowo przyciąć, wymazać, wykadrować… Czyli w ruch szedł GIMP.

Zrzuty ekranu robię na tyle rzadko, że nigdy nie szukałem dokładniej programu do screenshotów i przypuszczałem, że po prostu takiego nie ma. Okazuje się, że się myliłem. Kumpel z pracy pokazał mi genialny program o nazwie shutter[2]. Nie jest lekki (łącznie z zależnościami pobrał kilkadziesiąt MB danych), ale za to jest w pełni graficzny, minimalizuje się do traya, pozwala na robienie screenshotów zarówno całego pulpitu, tylko wybranego okna programu jak i wcześniej zaznaczonego obszaru (odpada konieczność kadrowania).

Po wykonaniu zrzutu ekranu, można go zapisać na dysku (wspierane wszystkie popularne formaty grafiki), wysłać na jeden z wielu dostępnych serwisów do publikowania obrazków, zapisać na zdalnym hoście przy pomocy FTP lub wysłać do innego programu do dalszej obróbki. Jeśli zajdzie potrzeba, bo sporo funkcji jest wbudowanych np. w postaci pluginów. Jest też wsparcie dla sesji screenshotów podobno z automatycznym numerowaniem, ale nie używam, więc nie testowałem.

W zasadzie, gdyby działało wszystko, co jest opisane na stronie, to nie potrzebowałbym nie potrzebuję niczego innego do robienia i obróbki screenshotów. 🙂 , niestety, w mojej wersji (0.88.3, Debian Wheezy) nie widzę narzędzia do cenzurowania/ukrywania danych, a czasami z tego korzystam. Możliwe, że pojawiło się dopiero w nowszej wersji Tak czy inaczej Polecam zapoznanie się z programem shutter każdemu, kto potrzebuje robić screenshoty pod Linuksem – zdecydowanie interesujący i dopracowany kawałek softu.

UPDATE: Aby działała edycja screenshotów (w tym cenzurowanie), konieczne jest jeszcze doinstalowanie biblioteki Perla: apt-get install libgoo-canvas-perl.

[1] Instalacja przez apt-get install scrot.

[2] Instalacja (Debian) to oczywiście apt-get install shutter.

Wybory – sytuacja, pomysły

Początkowo z wyborami było trochę śmiesznie (no dobrze, śmiech przez łzy), zrobiło się trochę strasznie (okupacja PKW, nie ma zgody na kwestionowanie wyników przez miłościwie nam panującego, wygrana PSL). Pojawiły się też głosy o konieczności stworzenia otwartego, wolnoźródłowego systemu i inicjatywy w tym temacie. Cieszy, bo oznacza, że to nie moje paranoje i pomysł ma sens.

Trochę na FB pisałem, ale to znika, więc dla pamięci (i szerszego grona). Do głowy przyszedł mi wariant minimum. Zaznaczam, że bazuje na starych procedurach ręcznych (ale cóż więcej trzeba?) i starych, sprawdzonych technologiach, choć korzystając z nowych warunków.

Wystarczyłoby, żeby komisje wysyłały proste tekstowe dokumenty o ustalonym formacie (formatkę, czyli odpowiednik protokołu powinny dostać wcześniej) przy pomocy emaila (stara sprawdzona technologia, dobrze się skalująca). W ramach ustalenia autentyczności i tajności[1] podpisanego/zaszyfrowanego GPG. Oczywiście członkowie komisji (a przynajmniej 2-3 z każdej komisji) musieli by mieć potwierdzone klucze, ale z tym nie ma problemu – i tak są na szkoleniu dla członków komisji. Maila każdy w dzisiejszych czasach ma (wystarczą 2-3 osoby z komisji, powtórzę) i wysłać umie. Czyli tak, wysyłali by wyniki podpisane GPG z dowolnych, nawet prywatnych, darmowych kont. Potwierdzenie dostarczenia jest opcjonalne (delivery notification), ale dostępne w programach pocztowych, czyli komisja wie, czy/kiedy protokół dotarł do serwera poczty PKW. Z nowoczesnych dodatków i zwiększania wiarygodności – można załączyć „skany” papierowego protokołu. Wystarczy smartfon z aparatem (znaczy: smartfon)…

Po stronie serwera email PKW nic specjalnego się nie dzieje. Jeśli chodzi o dalszą część serwerową, to program do liczenia łączy się do serwera poczty, odbiera maila, na podstawie tematu przypisuje do komisji (albo z treści formularza…). Następnie weryfikuje autentyczność podpisu GPG i w przypadku zgodności parsuje plik tekstowy.

Gdyby pliki były wysyłane w dokładnie określonym formacie, to całość jest do naklepania w Perlu w parę godzin. No ale pewnie nie będą, bo maile umożliwiają dość dużą dowolność formatu wysyłki pliku i co program, to wynalazki… (szczególne ukłony w stronę Microsoft). Można się bawić oczywiście w napisanie prostego klienta poczty dla komisji. Zaleta rozwiązania jest taka, że po wyborach PKW może udostępnić publicznie wyniki. Albo wręcz przeforwardować wyniki z danej komisji wszystkim zainteresowanym, którzy np. wcześniej zgłoszą takie zapotrzebowanie.

W kontekście wysokiego wyniku PSL i ponownie sporej ilości głosów nieważnych dla przypomnienia kawałek historii:

wybory 2010 głosy nieważne

Źródło: http://uczciwe-wybory.pl/analiza-glosow-niewaznych-wyborach-parlamentarnych-2005-2007-2011-samorzadowych-2010/

W odpowiedzi na to kolejny pomysł – kamery w komisjach i albo streaming online, albo przynajmniej rejestracja i udostępnienie obywatelom bezpośrednio po wyborach[2]. Jeśli jest podejrzenie fałszowania głosów przez członków komisji (a właśnie o dostawianiu krzyżyków mowa), to powinno to rozwiązać problem. Plus obowiązek przebywania głosów „na oczach kamer” od momentu wyjęcia ich z urny do czasu sporządzenia protokołu przez komisję.

W ten sposób obywatele mieliby możliwość prostego zweryfikowania wyborów ze swojej komisji i nadzorowania pracy (przypomnę, po zamknięciu lokali poza członkami komisji i mężami zaufania obywatele nie mają dostępu do lokali).

[1] Tajność wygląda na zbędną. Wysyłki są dokonywane już po zamknięciu lokali, więc nie ma potrzeby utajniać wyniku.

[2] Zdaję sobie sprawę, że danych jest sporo i nakłady na infrastrukturę (kamery plus streaming) nie są małe. Być może wystarczyłaby możliwość montowania kamer (z publicznym streamingiem) przez obywateli.

Porażka systemu wyborczego PKW

Jak powszechnie wiadomo, przy wyborach samorządowych zaliczyliśmy malowniczego w tym roku malowniczego faila. Nie, żeby było to trudne do przewidzenia, biorąc pod uwagę błędy w zabezpieczeniach widoczne już wcześniej. No, ale powiedzmy, że niezabezpieczenie maszyn developerskich może się zdarzyć najlepszym i nie musi rzutować na zachowanie produkcji.

Tak się składa, że w pewnym okresie mojego życia miałem regularne doświadczenia z komisjami. Pierwszy raz pracowałem w komisji dawno temu, gdy jeszcze każdy mógł się zgłaszać samodzielnie (a nie przez partię) i było losowanie wśród zgłoszonych. Miało to pewne wady, więc zmieniono sposób zgłaszania kandydatów do komisji – musiały robić to komitety wyborcze. I z tym sobie poradziłem, bo zawsze znalazł się ten czy inny komitet wyborczy, który nie wymagał bycia partyjnym aktywistą i po prostu zgłaszał studenta, który chciał sobie dorobić. Tu też mam pewne ciekawe doświadczenia i przemyślenia, ale to może przy innej okazji. Koniec końców, w młodym wieku miałem całą procedurę dobrze opanowaną, parokrotne doświadczenie, spory dystans do którejkolwiek partii politycznej… Jednym słowem, bezstronny wyborczy gun for hire.

Zwieńczeniem mojej kariery okołowyborczej było wystawienie mnie przez jeden z komitetów jako… męża zaufania. Tu akurat znajomi organizowali partii kampanię i szukali zaufanych ludzi znających się na rzeczy. Pamiętam, że już wtedy średnio się kwapiłem do pracy w komisjach ze względu na stawki. No ale jako mąż zaufania jakoś lepsze pieniądze dostałem (a pracy mniej), więc jakoś poszedłem.

Pamiętam, że były to chyba pierwsze „zinformatyzowane” wybory. Pamiętam, że samo liczenie poszło komisji, nawet sprawnie, natomiast pojawiły się „problemy z systemem”. IIRC rzecz działa się w szkole. Szkolny informatyk robił za obsługę informatyczną lokalu i rozłożył ręce przy wprowadzaniu. System „nie przyjmował” danych z karty (poprawnie wypełnionej). IIRC poszło m.in. o nieprzyjmowanie ilości kart nieważnych innej niż zero. Komisja wpadła na pomysł, że w sumie w takim razie najprościej będzie… poprawić na protokołach na zero, bo w sumie i tak nieważne. I byliby to chyba zrobili, gdybym nie uświadomił, że od razu mogą wpisać mój protest na protokole i najpewniej do rana nie wyjdą, bo centrala ich cofnie do poprawki.

Atmosfera na moment zgęstniała, ale niedługo później okazało się, że nie tylko my mamy problem (wcześniej jakoś nikt takiej informacji nie udzielił), nie działa więcej rzeczy i przyszło z centrali zarządzenie, że olać system informatyczny, przechodzimy na ręczne. Czyli, że robimy wszystko po staremu i wszystko mamy gotowe do zawiezienia. Tak czy inaczej, wtedy system zaliczył malowniczą porażkę. Swoją drogą przez tego typu akcje (robisz dobrze, siedzisz parę godzin dłużej) i brak przewidywalności czasu trwania pracy (bo w komisji jednak różni ludzie się trafiają) zniechęciłem się ostatecznie do siedzenia w komisjach.

Teraz mamy powtórkę. Znajomi z IT są bardzo rozbawieni słysząc o problemach z 3 tys. jednoczesnych połączeń. Nie dziwię się. Zaprojektowanie systemu, który przyjmie dane nie jest trudne. Dziwi mnie – i nie tylko mnie – co innego. Mianowicie, czemu co roku projektuje się i wykonuje system od zera, bez żadnego doświadczenia z lat ubiegłych? Jaki byłby problem z tym, żeby specyfikacja protokołu była prosta i jawna, część zarówno serwerowa, jak i kliencka rozwijana jako open source i używana ponownie przy każdych wyborach? Przecież format protokołu praktycznie się nie zmienia. I jest bardzo prosty. Spokojnie można studentom jako zadanie na zaliczenie semestru zadać opracowanie formatu przesyłu danych[1]. Dokumentacja systemu też na wolnej licencji, żeby łatwo można było odtworzyć – i w razie potrzeby poprawić – środowisko.

Żeby nie było, że tylko firma winna, IMHO sporą winę za sytuację ponosi PKW, która powinna być w stanie w dowolnym momencie przejść skutecznie na system ręczny. Informatyzacja wyborów to jedynie bonus, nie ich sedno. Ale u nas pokutuje wciąż – nie tylko przy wyborach – bożek systemu informatycznego, najwyższej wyroczni i zarazem wykładni. System nie pozwala i koniec, bo system to rzecz święta.

Na Niebezpieczniku jest dobry artykuł nt. wyborów, w którym jest więcej informacji nt. systemu oraz przyczyn porażki. Osobiście najbardziej przerażony jestem tym, co tam wyczytałem:

Nikt nie weryfikuje protokołów papierowych opracowanych przez GKW i wprowadzonych do kalkulatora a następnie zatwierdzonych przez TKW o ile nie pojawią się protesty wyborcze, bodajże po 30 dniach od upłynięcia czasu na zgłaszanie protestów protokoły oryginalne są utylizowane, na kolejnych szczeblach sprawdzana jest tylko suma kontrolna. (chodzi o skan kodu z protokołu papierowego i jego porównanie z sumą kontrolną danych dostarczonych elektronicznie — dop. red.)

Mam nadzieję, że suma kontrolna jest wyliczana w taki sposób, że weryfikuje jednocześnie dane nt. oddanych głosów. Tak czy inaczej spodziewałbym się, że w tak ważnym wydarzeniu nie będzie polegać się tylko na widzimisię wprowadzającego, tylko ktoś dane z papierowego protokołu wklepie dla pewności jeszcze raz. Bo prosta suma kontrolna, czy też suma kontrolna o znanym algorytmie wyliczania jak najbardziej zabezpieczy przed literówką, ale nie przed celową manipulacją (partii A dodać 50, partii B odjąć 10, partii C odjąć 40). A do komputera nie wprowadza komisja, tylko pojedynczy operator.

[1] Przynajmniej za czasów moich studiów można było, nie wiem jaki teraz jest poziom na uczelniach. Z systemem już bym nie polegał na studentach, tu się jednak trochę praktyki przydaje.

Przyspieszanie łącza internetowego

Wpis, który przeleżał jako szkic ponad rok. I bardziej go już nie skończę, więc publikuję, jak jest. Miały być testy i dokładne konfiguracje, ale z braku czasu będzie czysta teoria. Tak czy inaczej myślę, że przyda się ludziom z wolnymi łączami lub korzystającym z WWW (i nie tylko…), a chcącym zminimalizować ilość przesłanych danych do urządzenia końcowego. Do rzeczy.

Na podstawie doświadczeń z Aero2, czyli łącza zarówno wolnego (niska przepływność) jak i zlagowanego (duże opóźnienia pakietów), postanowiłem popełnić krótki poradnik, jak przyspieszyć działanie sieci na wolnym łączu internetowym. Zwykle zakładam w tym poradniku, że użytkownik korzysta z Linuksa, ale nie zawsze i część sposobów przyda się niezależnie od systemu.

Krok pierwszy – przyspieszanie zapytań DNS

Ważna sprawa, bo serwery DNS odpytywane są coraz częściej. Otwarcie pojedynczej strony internetowej to w dzisiejszych czasach często kilkanaście, a nawet kilkadziesiąt zapytań do serwerów DNS. W przypadku zlagowanego połączenia do każdego zapytania dochodzi opóźnienie łącza. Można sobie pomóc poprzez wykorzystanie lokalnego cache DNS. Z prostych w konfiguracji polecam opisany kiedyś dnsmasq lub lekki i wydajny unbound. Cache DNS działa dla całego systemu, nie tylko dla stron WWW, ale w ich przypadku różnica powinna być najbardziej widoczna. Dodatkowa zaleta to uniezależnienie się od potencjalnych problemów z serwerami DNS naszego dostawcy łącza.

Krok drugi – kompresja danych

Mechanizm kompresji danych na wolnym odcinku nie jest niczym nowym. Od dawna z powodzeniem stosuje go Opera w swojej funkcji turbo. Pierwsza obróbka strony odbywa się na ich serwerach, które dysponują szybkimi łączami. Dodatkowo może się odbywać redukcja zbędnych elementów. Zaletą rozwiązania jest łatwość uruchomienia – wystarczy kliknąć przycisk w Operze. Wadą rozwiązania jest to, że wymaga korzystania z Opery i działa tylko dla stron WWW.

Kompresja danych – DIY

ziproxy

Jeśli mamy dostęp do serwera (może być VPS) z Linuksem, możemy w prosty sposób stworzyć podobne rozwiązanie samodzielnie, korzystają z programu ziproxy. Instalujemy je na serwerze, konfigurujemy, jak bardzo mają być redukowane grafiki (60-70% wygląda znośnie), ustawiamy adres IP i port serwera jako proxy w przeglądarce i.. tyle. Od tej pory przez wolne łącze przesyłane są zredukowane (stratnie, zatem gorzej wyglądające) obrazy. Reszta danych jest przesyłana w postaci skompresowanej.

Zaleta jest taka, że działa z każdą przeglądarką i – dla paranoików – że nasze dane nie błądzą po serwerach Opery.

Wady: działa tylko dla WWW, stopień redukcji obrazów ustala się raz, nie ma możliwości dynamicznej zmiany jakości (np. obejrzenie wybranych obrazów w lepszej jakości).

sshuttle

Jeśli mamy dostęp do serwera z Linuksem i dodatkowo ma on zainstalowanego Pythona, to możemy skorzystać z VPN over SSH, czyli shuttle. Rozwiązanie powstało jako namiastka VPN i miało pierwotnie bardziej zapewniać bezpieczeństwo transmisji (szyfrowanie) w przypadku otwartych hotspotów. Można je jednak skonfigurować tak, aby ruch był kompresowany (wykorzystanie kompresji SSH).

Zaletą jest to, że działa dla całego ruchu (TCP), nie tylko dla WWW. Można określić, do których sieci ruch ma być obsługiwany przez to rozwiązanie.

Wada: działa tylko dla TCP (oraz zapytań DNS), wymaga zainstalowanego Pythona na maszynie pełniącej rolę serwera.

ssh + socks proxy

Jeśli nie chcemy instalować dodatkowego oprogramowania, a mamy dostęp do serwera z Linuksem, możemy w prosty sposób wykorzystać tunelowanie SSH oraz – podobnie jak w poprzednim przypadku – wykorzystać kompresję oferowaną przez SSH. W tym celu ustawiamy socks proxy w przeglądarce na localhost oraz port 9000, oraz uruchamiamy ssh -CND 9000 user@serwer. Od tej pory ruch WWW tunelowany jest przez SSH do serwera. Jeśli zależy nam nie tylko na wydajności, ale i na prywatności, warto sprawdzić ustawienia przeglądarki dotyczące przesyłania zapytań DNS przez proxy.

Zaleta: łatwość uruchomienia (na systemach *nix).

Wady: działa tylko dla ruchu WWW (lub jawnie przetunelowanego z innych aplikacji), wymaga przeglądarki WWW ze wsparciem dla socks proxy (praktycznie każda sensowna ma tę opcję dostępną w ten lub inny sposób).

OpenVPN

Ostatni sposób to wykorzystanie OpenVPN oraz wbudowanej kompresji. Wymaga skonfigurowanego OpenVPN zarówno po stronie klienta jak i serwera.

Zalety: działa dla wszystkich rodzajów ruchu.

Wady: wymaga zainstalowania i skonfigurowania OpenVPN. Dochodzi narzut CPU na szyfrowanie (domyślnie będzie włączone, zwł. u zewnętrznych providerów).

Oczywiście cudów nie ma i ww. sposoby pomogą jedynie dla treści, które przesyłane są jako nieskompresowane i dobrze się kompresują. Nie ma co liczyć, że filmy na YouTube zaczną działać szybciej. Osobiście idę na łatwiznę i korzystam zwykle z ssh i socks proxy.

Boot once w GRUB

Czasami jest potrzeba, żeby uruchomić maszynę z danym kernelem, ale tylko raz. W przypadku niepowodzenia chcemy mieć uruchamiany z powrotem stary, sprawdzony kernel. Zwykle taka potrzeba pojawia się, gdy testujemy nowy kernel i nie mamy fizycznego (lub zbliżonego) dostępu do maszyny, a np. mamy pod ręką kogoś, kto w razie problemów niekoniecznie pomoże z debugiem, ale chociaż wciśnie reset. Dziś pojawiła się u mnie taka potrzeba, za sprawą dedyka pod Piwika i chęci zmiany kernela z nieco starego z OVH na dystrybucyjny.

Okazało się, że wypadłem z tematu. Ostatni raz miałem potrzebę jednorazowego uruchomienia kernela chyba w okolicach LILO jako używanego bootloadera. Nie pamiętam jak to dokładnie w LILO wyglądało, ale mam wrażenie, że było proste, intuicyjne (w końcu jeden konfig) i – przede wszystkim – dobrze udokumentowane.

Poszukałem chwilę i znalazłem polecenie grub-reboot, któremu jako parametr podaje się numer wpisu w /boot/grub/grub.cfg i które ma powodować jednokrotne uruchomienie kernela o podanym wpisie. Ucieszyłem się, że pomyśleli o mnie i tak prosto. Maszynka niekrytyczna, kernel dystrybucyjny, więc raczej wstanie, wydałem więc stosowne polecenie, następnie reboot i… system wstał! Ze starym kernelem.

Nawet niezbyt się zirytowałem. Po prostu odpaliłem testowego kompa w domu i zacząłem się bawić. Ustawiam numer wpisu, który ma się włączyć, reboot i… to samo. Dłuższa chwila szukania i znalazłem opis na niezawodnym wiki Arch Linux:

This requires GRUB_DEFAULT=saved in /etc/default/grub (and then regenerating grub.cfg) or, in case of hand-made grub.cfg, the line set default=”${saved_entry}”.

Jak na lata doświadczeń przystało, wyboru kernela nie pozostawiam przypadkowi i w moim /etc/default/grub były ustawione na sztywno numery kerneli do uruchomienia. Zmieniam na powyższe na testowej maszynie w domu, grub-reboot potem reboot i… wstał! Z nowym kernelem. Świat wydaje się piękny, więc reboot, by wrócić na stary kernel i… tak dobrze nie ma. Uruchamia się za każdym razem z nowym.

Nawet niezbyt się zirytowałem, po prostu rebootnąłem zdalną maszynkę na nowy kernel. Skoro dystrybucyjny to raczej wstanie. Stosowne zmiany, reboot i… maszynka wstała, z nowym kernelem, wszystko wydaje się działać. Misja zakończona, cel osiągnięty.

I tu byłby koniec wpisu, ale w międzyczasie zacząłem rozmowę na ten temat na kanale IRC #debian (@freenode). Tam dowiedziałem się o /boot/grub/grubenv i o tym, że może (będzie) się tak dziać, jeśli nie jest ustawione prev_saved_entry. I faktycznie, nie było. I dowiedziałem się, że można to ustawić wydając polecenie grub-reboot więcej, niż raz.

Czyli, żeby zrobić boot once dla GRUBa, trzeba kolejno:

  • ustawić GRUB_DEFAULT=saved w /etc/default/grub
  • grub-reboot <wpis, gdzie ma być default>
  • grub-reboot
  • sprawdzić /boot/grub/grubenv na wszelki wypadek
  • reboot

I pomyśleć, że przy LILO była to szybka edycja konfiga plus lilo dla wprowadzenia zmian w życie… Znaczny postęp poczyniliśmy! 😉

Skoro już wpis na tematy linuksowe… Archa nie próbowałem, ale ludzie (w tym jeden DD) chwalą. Bardzo dobra dokumentacja. Poza tym, jest taka inicjatywa jak debianfork.org. I cieszę się, że jest. Bo skoro Debian może mieć więcej niż jedną architekturę, więcej niż jeden kernel (tak kFreeBSD), to czemu nie miałby móc mieć różnych, równorzędnych demonów do startu usług?

Jak obliczyć wolną pamięć RAM w Linuksie?

Ile mam wolnej pamięci w systemie? to częste pytanie i użytkowników desktopów, i administratorów. Na każde pytanie istnieje prosta, błędna odpowiedź i podobnie jest w tym przypadku, choć ustalanie ilości wolnej pamięci RAM wydaje się trywialną sprawą. Większość ludzi korzysta z polecenia free, którego przykładowy wynik może wyglądać następująco (desktop):

total       used       free     shared    buffers     cached
Mem:       3926996    3614388     312608          0      82656    1305692
-/+ buffers/cache:    2226040    1700956
Swap:      1022964      20480    1002484

Typowa interpretacja byłaby zapewne w tym przypadku taka, że wolnych jest 312608 kB RAM. Niezupełnie jest to prawdą. Tzn. tyle pamięci faktycznie jest zupełnie nieużywanej, ale tak naprawdę w razie potrzeby dla aplikacji dostępne jest znacznie więcej pamięci i należałoby raczej patrzeć na drugi wiersz, nie pierwszy, czyli bliższym prawdy wynikiem jest, że wolnych w tym przypadku jest 1700956 kB RAM.

W przypadku serwerów z Linuksem, ilość wolnej pamięci łatwiej odczytać, szczególnie na potrzeby skryptów, z /proc/memifno/:

cat /proc/meminfo | head -n 5
MemTotal:        3926996 kB
MemFree:          296944 kB
MemAvailable:    1589592 kB
Buffers:           82692 kB
Cached:          1305316 kB

Patrząc na wartości z /proc/meminfo, ilość zajętej i wolnej pamięci RAM można liczyć w następujący sposób:

Free RAM = MemFree + Buffers + Cached
Used RAM = MemTotal - (MemFree + Buffers + Cached)

Jednak i to niezupełnie jest prawdą, bo do w skład Cached wchodzą np. obszary używane przez tmpfs, które nie mogą być zwolnione. Dlatego niedawno w /proc/meminfo dodano kolejną wartość MemAvailable, której zadaniem jest podawanie wprost ilości dostępnej do wykorzystania przez programy (czyli, potocznie, wolnej) pamięci. Jeśli taka wartość jest podana, to zamiast powyższych wzorów lepiej skorzystać z:

Free RAM = MemAvailable
Used Ram = MemTotal - MemAvailable

Linki:

  1. http://www.linuxatemyram.com/
  2. https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

 

Obudź sobie Linuksa

Mało kto wie, ale komputer może się sam włączyć o zadanej godzinie. Zupełnie sam, bez pomocy zewnętrznych źródeł, magic packet i Wake-On-LAN. Można to wykorzystać do oszczędzania energii (i zużycia sprzętu), a przy tym nie musieć włączać komputera ręcznie, nie czekać na jego uruchomienie, ogólnie – mieć wrażenie, że działa on cały czas.

W szczególności można zrobić z komputera budzik (włączy się o zadanej godzinie i np. odtworzy zadany utwór albo stację radiową) czy też do maszynki przyjmującej backupy (nie musi być włączona cały czas, wystarczy włączyć ją na czas transferu backupu i wyłączyć po ich przesłaniu). Automagiczne włączanie przydać się może także w firmie, gdzie Linux pełni rolę serwera NAS i wydruku – nic nie stoi na przeszkodzie, by wyłączał się po pracy (np. 18:00), a uruchamiał przed przyjściem pierwszych pracowników (np. 7:00).

Wszystko to można osiągnąć za pomocą programu rtcwake będącego częścią util-linux z odpowiednimi parametrami.

Na początek warto jednak pamiętać, że wyłączenie wyłączeniu nierówne. Program rtcwake obsługuje m.in. następujące tryby wyłączenia (wybierane przełącznikiem -m):

  • standby – stan ACPI S1. Minimalne oszczędności energii, błyskawiczny powrót do działającego systemu. Tryb domyślny.
  • mem – stan ACPI S3 (Suspend-to-RAM). Wyłączone jest wszystko, poza pamięcią RAM. Duże oszczędności energii, bardzo szybkie wybudzanie.
  • disk – ACPI state S4 (Suspend-to-disk). Wyłączenie wszystkiego, stan maszyny zapisywany jest na dysku. Stosunkowo wolne wybudzanie z uwagi na konieczność odczytu zawartości pamięci RAM z dysku.
  • off -ACPI state S5 (Poweroff). Wyłączenie systemu. Nie jest oficjalnie wspierane prze ACPI, ale zwykle działa.

Niestety, rtcwake posiada jedną poważną wadę – nie pozwala na podanie czasu wybudzenia w „ludzki” sposób. Można jedynie podać za ile sekund ma nastąpić wybudzenie albo czas w postaci Unix time. Mało wygodne. Oczywiście można to obejść przy pomocy skryptów (patrz linki).

Ja chwalę sobie tryb mem i używam często wieczorem, żeby rano mieć włączony komputer. Przy okazji często budzę się dźwiękiem włączanego komputera (nie, nie ustawiam muzyki). Skryptów nie używam, po prostu usypiam kompa na ten sam okres czasu, osiem godzin, przy pomocy polecenia:

rtcwake -s 28800 -m mem

Da się oczywiście zrobić więcej/lepiej ale… jakoś nie mam potrzeby.

Więcej o rtcwake AKA warto przeczytać:

  1. http://czytelnia.ubuntu.pl/index.php/2012/05/23/automatycznie-wybudzanie-z-hibernacji-budzik/ – dobry opis po polsku, dobry skrypt
  2. http://blog.loleksy.pl/2014/01/28/reuse-an-old-laptop-or-netbook-as-a-vps-backup-solution/ – skrypt do backupu z wykorzystaniem rtcwake