Publiczne Wi-Fi a bezpieczeństwo

Wczoraj ukazał się artykuł o tym, czy korzystanie z publicznego Wi-Fi jest bezpieczne. Uważam, że prezentowane tam podejście jest dość optymistyczne. Nie uważam obcych sieci za tak bezpiecznie, jak pisze autor. Wszystko zależy od tego, czego się obawiamy. I naszego poziomu paranoi.

Na pewno podłączanie do sieci Wi-Fi, jeśli zakładamy złe zamiary jej właściciela lub innych użytkowników jest bezpieczniejsze, niż podłączanie kablem ethernetowym. Ot, nikt nie poda wysokiego napięcia na kablu i nie spali nam urządzenia. No ale żarty na bok.

Publiczne Wi-Fi – zagrożenia

Podłączając się do cudzej lub publicznej sieci ujawniamy informacje o swoim urządzeniu i systemie. Np. syngatury urządzenia typu adres MAC czy hostname. W pewnych przypadkach dane te mogą zostać wykorzystane do… powiedzmy przypisania nam pewnych działań. Ale to bardziej naruszenie prywatności niż realny atak. Pójdźmy dalej.

Podłączając się do sieci eksponujemy nasze urządzenie na bezpośrednie połączenia. OK, jeśli ktoś ma firewall lub nie udostępnia żadnych usług innym komputerom w sieci lokalnej, to problemu nie ma. Ale już udostępnienie zasobu chronionego prostym hasłem z laptopa w sieci domowej, gdzie bezpośredni dostęp miały tylko nasze urządzenia może okazać się zgubne. W naszej sieci przed atakami z internetu mógł chronić router (NAT).

Nie taki HTTPS wspaniały

Wspomniany w artykule HSTS ma dwie wady. Po pierwsze, adopcja. Zwyczajnie nie wszystkie strony z niego korzystają. Żeby daleko nie szukać, tamten artykuł zamieszczony jest na stronie bez HSTS. I pewnie ktoś przytomnie zauważy, że przecież to tylko blog, a nie bank. To polecam samodzielne sprawdzenie, czy, ew. które polskie banki korzystają z HSTS na stronach. O HSTS z preload litościwie nie wspominam.

Po drugie, jest to mechanizm TOFU. Tzn. nie zapewnia bezpieczeństwa przy pierwszym połączeniu. Owszem, przeglądarka w kolejnych połączeniach do strony, przez zwykle długi okres ważności, będzie już korzystać z HTTPS. Ale jeśli jest to nowa strona lub otwierana w nowej przeglądarce to HSTS nic nie daje.

Dodatkowo autor wspomina o powszechnych przekierowaniach HTTP -> HTTPS. Tylko niestety taki mechanizm nie zapewnia bezpieczeństwa. OK, może je podnosić w szczególnym przypadku, jeśli jest stosowany łącznie z HSTS. Bez tego raczej zapewnia złudzenie bezpieczeństwa. Bowiem jeśli pierwszy request jest wykonywany po HTTP, to nadal DNS spoofing jest groźny. Atakujący może dowolnie rozwiązać nazwę domeny do której próbujemy się połączyć. Np. na swój serwer. I tam wykonać przekierowanie HTTP. Redirect (301) może być na cokolwiek. Także na domenę z poprawnym HTTPS. Tyle, że niekoniecznie tę, na którą chcieliśmy się połączyć. Tylko np. na domenę homograficzną, albo domenę o zbliżonej nazwie. Ot, choćby wchodząc na http://mojbank.pl możemy skończyć na https://mojbark.pl, o wyglądzie identycznym jak https://mojbank.pl. I z poprawnym certyfikatem HTTPS i „kłódeczką”.

No i ostatecznie nawet połączenie HTTPS z poprawnym hostem nie gwarantuje jeszcze, że jest w pełni bezpiecznie. W niektórych przypadkach, na które użytkownik nie ma wpływu, nadal możliwe mogą ataki na HTTPS. OK, w przeciwieństwie do DNS spoofingu są trudniejsze do wykonania.

Jak korzystać bezpieczniej z publicznych Wi-Fi?

Czy to znaczy, że zupełnie nie zgadzam się z autorem? Niekoniecznie. Zgadzam się, że jest o wiele bezpieczniej, niż kiedyś. Generalnie jeśli ktoś naprawdę musi skorzystać z Wi-Fi i miałbym dać tylko jedną radę to byłoby to: włącz DoH w przeglądarce i wpisuj adresy w pasku adresu przeglądarki „z palca”, korzystając z podpowiedzi. No wiem, to w zasadzie dwie rady. Ale przyjmijmy, że jedna, tylko złożona.

Czemu tak? DoH zapewni nam odporność na DNS spoofing, a dodatkowo da bonus w postaci podwyższenia prywatności. Potencjalny podsłuchujący nie dostanie adresów odwiedzanych stron „na tacy” w postaci nieszyfrowanych zapytań DNS. W części przypadków w ogóle nie będzie w stanie ustalić z jakim serwisem się łączymy.

Wpisywanie domen w pasku adresu, z wykorzystaniem podpowiedzi uchroni przed kliknięciem w podobną domenę i zwiększy szansę na wykorzystanie protokołu HTTPS już od pierwszego requestu.

Pomigracyjnie

W poprzednim wpisie pisałem o planowanej migracji na Oracle Cloud. Jak widać blog stoi już w nowej lokalizacji, więc operacja jest zakończona i mogę napisać kilka słów z perspektywy.

Migracja

Poszło niemal bezproblemowo. Backup w zasadzie zadziałał. Był problem z detalami typu lista zainstalowanych pakietów i crony. W sumie nieistotne i/lub poprawione. Xpil opisał swoją migrację VPSa i po tej lekturze miałem silne postanowienie zamknięcia wszystkiego w kontenerach LXC. To nieco wydłużyło proces migracji i dodało trochę zadań. Co prawda nadal nie jest to taka separacja jak w dockerach czyli per usługa, ale mariadb + nginx + całe WWW w osobnym VPSie też jest OK.

Konieczne było lekkie przemeblowanie. Musiałem rozdzielić skrypty cron do właściwych kontenerów. Okazało się też, że wynik działania jednego kontenera (Planeta Joggera) musi trafić nie do hypervisora, tylko do innego kontenera, a ten nie ma dostępu. Skrypt w cronie na hypervisorze załatwił sprawę.
Podobnie niezbyt elegancko rozwiązany jest backup bazy danych. Dump robię teraz w LXC, a następnie cały kontener jest backupowany. W ten sposób zawartość bazy jest zdublowana. Mam pomysł jak to rozwiązać, nie wiem, czy potrzebuję. Tyle o samej migracji, a efekty i hosting?

Efekty

Przede wszystkim jest szybciej, przynajmniej wg GTmetrix. Niestety nie zrobiłem testu tuż przed migracją i od razu po niej. Mam tylko ten link z twardymi danymi, ale w międzyczasie się poprawiło, więc polegam głównie na pamięci. Ale tak dobrze to nigdy nie było:

Blog GTmetrix w Oracle Cloud
GTmetrix w Oracle Cloud

Hosting

Pewnie w sporej części to kwestia przejścia z jednego VPSa na dwa, w dodatku z widocznymi dwoma rdzeniami w systemie. W Arubacloud było:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2650L v4 @ 1.70GHz
stepping        : 1
microcode       : 0xb000038
cpu MHz         : 1699.999
cache size      : 35840 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx hypervisor lahf_lm 3dnowprefetch pti arat
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips        : 3399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual

Teraz jest (pojedynczy rdzeń):

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 1
model name      : AMD EPYC 7551 32-Core Processor
stepping        : 2
microcode       : 0x1000065
cpu MHz         : 1996.249
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero xsaveerptr virt_ssbd arat npt nrip_save arch_capabilities
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 3992.49
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual

Blog zawsze dominował, jeśli chodzi o obciążenie, ale teraz ma całe zasoby dla siebie. Z drugiej strony bieżący VPS ma sporo wolniejszy dysk (3000 IOPS, 24 MB/s). Można tym jakoś sterować, ale zakładałem na domyślnych wartościach. No i nie widzę potrzeby zmiany.

Wady

Żeby nie było, że wszystko jest fajnie – port 25 TCP w Oracle Cloud jest zablokowany na twardo, w obie strony. Czyli ani maila nie przyjmę, ani nie wyślę. Znalazłem, że trzeba pisać do supportu o odblokowanie. Napisałem i zobaczymy. O ile do monitoringu poczta nie jest mi potrzebna, bo powiadomienia mogę wysyłać Telegramem, to przy blogu jest to jakby kluczowe. Potwierdzanie subskrybcji komentarzy itp. Z drugiej strony widzę, że nie było to jakoś mocno wykorzystywane… Zobaczę co odpowiedzą i wtedy pomyślę, co dalej.

Ogólnie sporo rzeczy w Oracle Cloud jest załatwianych przez support. Ustawienie PTR – support (działa!). Inny obraz dysku dla arm64 – support (tak powiedzieli na czacie, odpuściłem).

UPDATE: Port 25 nie został odblokowany, bo free tier. Nie jest to duży problem – wystarczy skonfigurować SMTP relay u któregoś z dostawców.

Chmura Wyroczni

Niewiele brakowało, a lipiec byłby pierwszym od wielu miesięcy, jeśli nie w historii, miesiącem bez wpisu. Jakoś tak się złożyło, że było parę rzeczy, ale żadna nie wydała mi się godna wpisu.

Najważniejszym zagadnieniem jest rozpoczęcie prac związanych z migracją na nowy hosting (Oracle Cloud), o którym wspominałem we wpisie z początku roku. Jest to jednocześnie ostatnie z zaplanowanych postanowień. PUM jest już przepisany na Pythona i działa. Skrypt generujący stan rowerów na stacjach Nextbike, w zeszłym miesiącu przeniosłem na repo na GitHub.

Pozostał hosting. Moim wyborem jest Oracle Cloud. Ich free tier jest bardzo zachęcający, szczególnie jeśli chodzi o moje potrzeby. Ilość przestrzeni na dysku wręcz rozpieszcza – obecnie mieszczę się „ze wszystkim” na 1 VPS i 20 GB. Przynajmniej, jeśli chodzi o rzeczy „produkcyjne”. Nie ukrywam, że po pierwsze dopiero się uczę, po drugie nie jest to wszystko ani intuicyjne, ani dopracowane. Dobrze, że kiedyś miałem nieco więcej do czynienia z Openstack, bo filozofia podobna.

Napaliłem się na maszynki ARMowe i… szybko dostałem kubłem zimnej wody. Po pierwsze, w oficjalnych obrazach nie ma Debiana. Po drugie, w przypadku ARM nie ma możliwości cywilizowanej metody instalacji, przez dostarczenie swojego obrazu. Znalazłem co prawda tego typu wygibasy, które rozumiem, ale… nie działają od kopa. Przynajmniej nie dla najnowszego Ubuntu. Pewnie popróbuję jeszcze, ale wariant, że polegam na dostępności starego Ubuntu dla „produkcyjnych” gratów, średnio mi się uśmiecha.

Tak czy inaczej mam soft, który wymaga amd64, więc po prostu postawiłem maszynkę amd64. Tu również nie dają Debiana, ale istnieje ręczna, jednak dość cywilizowana metoda instalacji Debiana w Oracle Cloud. Trochę mniejsze zasoby, ale w zupełności wystarczają. Pierwsze kontenery już przeniosłem. Oczywiście zacząłem od strony zadniej, czyli od zabawek i rzeczy nieprodukcyjnych. Pozwoliło mi to złożyć „tymczasowego” VPSa. W przyszłym tygodniu pewnie będzie większa przerwa. Akurat blog nie jest skonteneryzowany, więc przywrócenie nie będzie po prostu wgraniem backupu kontenera.