sd_notify() support in nghttp2


nghttp2 is an implementation of HTTP/2. It comes as a set of libraries and tiny programs using them – a client, WWW server and a proxy. I've started using the last one, nghttpx, as a reverse proxy in few project and I'm quite content with.

Recently I implemented sd_notify() support in it. Explicit main PID tracking and readiness signaling works like a charm with systemd. sd_notify() protocol let us reliably supervise service even during hot-swap. That is, after receiving SIGUSR2, nghttpx executes new binary and tells systemd “this is main process now”. Old binaries can finish serving current requests and exit.

The pull request, after a round of comments and fixes, was merged into trunk after v1.19.0, so it will be in the next release. If you're willing to test, I'd ask you to check USR2 graceful shutdown branch, also. At the moment you need to manually SIGQUIT old processes after hot-swap. This branch is supposed to automate it.

And if you're maintain nghttp2 package in a distribution, please be sure to check changes in the service unit file.

Drutostróż


Od końca zeszłego wieku używam IPSec to zabezpieczania ruchu sieciowego. Zgodnie z dziwactwami opensource, FreeS/WAN morfował się przez Openswan do Libreswan i strongSWAN. Równolegle korzystałem też z racoon. Interesował mnie racoon2 z uwagi na integrację z Kerberosem (KINK), ale ten wygląda na porzucony. Ostatnio zainteresował mnie Wireguard, który do niektórych zastosowań jest całkiem fajny.

Może najpierw zalety. Wireguard oparty jest na współczesnych algorytmach i protokołach kryptograficznych, autor chwali się całkiem niezłą wydajnością i niskimi opóźnieniami. Konfiguracja jest bardzo prosta i działa w zasadzie od strzału. W systemie pojawiają się dodatkowe interfejsy sieciowe, w które można zajrzeć tcpdumpem albo wyroutować w nie ruch do szyfrowania.

Miłym dodatkiem jest że tak powiem moshowatość. Po jednokrotnym nawiązaniu sesji, wymiana zaszyfrowanych pakietów odbywa się nawet jeśli jednej z końcówek zmienia się adres IP (oczywiście jeśli po zmiane odezwie się on do drugiej). Trudno więc wpaść w sytuację, w której sesja jest niby zestawiona, a ruchu trafia w czarną dziurę.

Są też wady. W zestawieniu z IPSec, Wireguard całkowicie ignoruje aspekt zarządzania kluczami. Końcówki mają swoje klucze publiczny z prywatnym, ale administrator pozostawiony jest sam sobie z kwestią ich propagacji. A to często jest najbardziej skomplikowane zagadnienie przy opracowywaniu architektury rozwiązania szyfrującego.

Jak można się domyśleć z obecności dedykowanego interfejsu sieciowego, Wireguard obsługuje tylko tryb tunelowy. Szkoda, bo o wiele częściej korzystam z trybu transportowego. Sieciowo jest bardziej oczywisty. Części scenariuszy nie da się za pomocą WG zrealizować. Można za to inne, jak np. przeniesienie tylko szyfrowanego interfejsu sieciowego do przestrzeni nazw jakiegoś kontenera. Niektórzy tego potrzebują, o czym świadczy chociażby pojawienie się w Linuksie interfejsów ip_vti*.

No i największa wada, WireGuard jeszcze nie jest w jądrze Linuksa. Jason (autor WG) ma plan włączenia gdzieś w drugiej połowie roku. Od tego uzależniona jest szeroka dostępność w dystrybucjach i włączenie obsługi w systemd-networkd. Jak na razie dostępne są repozytoria i samokompilujące się moduły dla różnych dystrybucji.

WireGuard ma jakąś taką trudną do uchwycenia elegancję i czuję, że coś z tego będzie. Może nawet pojawi się wsparcie dla innych niż Linux systemów.

https://video.fosdem.org/2017/Janson/wireguard.vp8.webm

Zaciskanie pasa TLSa


Red Hat zdecydował się na nietypowy krok w swojej dystrybucji Linuksa. W wersji RHEL 6.9 usuną lub ograniczą obsługę przestarzałej kryptografii. Zmiana dotknie SSLv2, MD5, RC4 itp. W aktualizacji stabilnej wersji nie powinno się zmniejszać zakresu obsługi, jednak ten krok wymusiły odkryte problemy z bezpieczeństwem.

Zmiana nie dotknie osób ponadprzeciętnie dbających o bezpieczeństwo, bo Ci admini już dawno wprowadzili zalecenia z Applied Crypto Hardening PDF. I przeprowadzili analizę, do jakiego stanu można podśrubować security, żeby za bardzo nie utrudnić innym. Ja przykładowo na serwerze WWW chciałem ograniczyć TLS tylko do v1.2/1.3. Ale sprawdziłem, i oznaczałoby zablokowanie dostępu osobom z Androidem <5.0. Na takie poświęcenie nie jestem gotów ;-). Nie każdy działający tablet z 4.x można zaktualizować, a jeśli ktoś wchodzi na bloga mobilnie, to zazwyczaj jest w trudnej sytuacji bez dostępu do czegoś lepszego. Zablokowanie mu dostępu w takiej chwili byłoby bezsensowne. A może i okrutne, bo pewnie popsuł sobie dostęp do internetu i szuka sposóbu na naprawę.

Przy okazji, wspomniany dokument w wielu przypadkach specyfikuje wprowadzenie ciągu określającego dozwolone algorytmy w postaci EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+…. Jest to dosyć nieelastyczne, w Fedorze można to zrobić lepiej: wystarczy podać PROFILE=SYSTEM. Wtedy poziom zabezpieczeń dla wszystkich usług na raz ustawimy poprzez manipulacje w /etc/crypto-policies/ i wywołanie polecenia update-crypto-policies.

Adresy .onion w całej sieci lokalnej


Tor ma taką fajną umiejętność tworzenia ukrytych adresów z wykorzystaniem domeny .onion – jak http://sejnfjrq6szgca7v.onion, http://uj3wazyk5u4hnvtk.onion/ czy https://facebookcorewwwi.onion. Ma też drugą fajną umiejętność, dzięki czemu można udostępnić łączność do takich adresów wszystkim urządzeniom w sieci lokalnej, nawet nie znającym Tora.

Sztuczka działa dzięki temu, że Tor potrafi działać jako serwer DNS i syntetyzować rekordy dla domeny .onion. W konfiguracji podajemy z jakiej podsieci mają być zwracane. Trzeba tylko przekierować routing ww. podsieci na klienta tor i voila. Tor odbierając pakiety skierowane na adres X wie, że ten adres zwrócił po zapytaniu o xyz.onion i odpowiednio kieruje połączenia.

Konfiguracja jest prosta. Najpierw wybieramy sobie ta specjalne podsieci:

VirtualAddrNetworkIPv4 10.192.0.0/10
VirtualAddrNetworkIPv6 [fceb:001a::]/32

Dwa, każemy Torowi obsługiwać DNS na naszym wewnętrznym interfejsie. Dobrze się chwile zastanowić, czy nie mamy tu już przypadkiem jakiegoś unbound, deadwood, systemd-resolved czy innego serwera DNS nasłuchującego na tym porcie. Jeśli tak, trzeba go wyłączyć. There can be only one!

DNSPort 203.0.113.2:53
DNSPort [2001:db8:85a3::8a2e:370:7334]:53
AutomapHostsOnResolve 1

Na koniec konfiguracji Tora zostaje kazać mu nasłuchiwać jako transparetne proxy, tak jak umie to Squid:

TransPort 0.0.0.0:9040
TransPort [::]:9040

Zostały jeszcze 2 drobiazgi – przekierowanie ruchu do magicznych podsieci na naszego cichociemnego tora:

iptables -A PREROUTING -p tcp -d 10.192.0.0/10 -j REDIRECT --to-ports 9040
ip6tables -A PREROUTING -p tcp -d fceb:001a::/32 -j REDIRECT --to-ports 9040

Oraz poinformowanie naszego głównego DNS, że domenę .onion obsługuje ktoś inny:

  Zone name: onion.
  Zone active: TRUE
  Zone forwarders: 2001:db8:85a3::8a2e:370:7334, 203.0.113.2
  Forward policy: first
----------------------------
Number of entries returned 1
----------------------------

W tym momencie na każdej stacji powinno działać:

$ host facebookcorewwwi.onion
facebookcorewwwi.onion has address 10.207.220.42
facebookcorewwwi.onion has IPv6 address fceb:1a:39ba:123f:1d30:72d1:a46e:1f93

$ wget sejnfjrq6szgca7v.onion
--2016-11-03 13:14:09--  http://sejnfjrq6szgca7v.onion/
Resolving sejnfjrq6szgca7v.onion (sejnfjrq6szgca7v.onion)... 10.221.133.34, fceb:1a:437e:551f:ef67:b2c2:bb64:ece5
Connecting to sejnfjrq6szgca7v.onion (sejnfjrq6szgca7v.onion)|10.221.133.34|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14760 (14K) [text/html]
Saving to: 'index.html'

index.html  100%[======================================================================================>]  14.41K  34.0KB/s    in 0.4s

2016-11-03 13:14:10 (34.0 KB/s) - 'index.html' saved [14760/14760]

Konfigurację dla innych systemów znajdziemy oczywiście na stronie projektu.