Co naprawdę anonimizuje skracanie adresu IP

Spis treści
Odrzucenie ostatniego oktetu to typowa odpowiedź na pytanie o adresy IP i jest to odpowiedź rozsądna. Prawie nigdy nie następuje po niej krok drugi: podanie, jak duża jest grupa, w której odwiedzający teraz znika. Środek traktuje się jak przełącznik – zamaskowane albo niezamaskowane – podczas gdy jest on suwakiem, a to, gdzie ten suwak stoi, rozstrzyga, czy w ogóle cokolwiek osiągnięto.
Liczby są na tyle niewielkie, że da się je zapamiętać, i warto mieć je pod ręką, gdy następnym razem ktoś zapyta, czy dane są już anonimowe. Zwykle nie są, i nie jest to argument przeciwko skracaniu – tylko przeciwko zdaniu, które zwykle po nim pada.

Jak duża jest naprawdę pozostała grupa
Skracanie odbywa się w bitach: każdy odrzucony bit podwaja liczbę adresów, które mają tę samą zapisaną wartość. Po odrzuceniu całego oktetu wspólną wartość ma 256 adresów. Żeby ocenić znaczenie tej liczby, trzeba też uwzględnić, co reprezentuje pojedynczy adres.
| Zapisane | Adresy z tą wartością | Co to jeszcze mówi |
|---|---|---|
203.0.113.45 |
1 | Jedno łącze – w bloku jedno gospodarstwo, w firmie jedna lokalizacja. |
203.0.113.0 (/24) |
256 | Zwykle jeden blok operatora w jednym mieście, często jedna ulica albo budynek. |
203.0.0.0 (/16) |
65 536 | Region i dostawca, już nie miejsce. |
| nic | wszystkie | Nic – i to jedyna wartość, która znosi powiązanie. |
To przy środkowym wierszu zwykle wybucha dyskusja. 256 adresów to nie 256 osób: blok mieszkaniowy u operatora rozdziela się na kilkadziesiąt łączy naraz, a za NAT firmy cały budynek wychodzi do sieci przez jeden adres. W jedną stronę grupa jest mniejsza, niż sugeruje liczba, w drugą znacznie większa – i żadnej z tych rzeczy nie widać w samych danych.
Dlatego skracanie najlepiej opisywać tym, czym jest: mierzonym w bitach obniżeniem dokładności, które zmniejsza ryzyko, nie znosząc powiązania z osobą. Zakres /24, znacznik czasu z dokładnością do sekundy i identyfikator przeglądarki są razem na tyle wąskie, że organy nadzorcze traktowały tę kombinację jako dane osobowe, a maskowanie ostatniego oktetu niczego w tym nie zmienia.
Dlaczego hasz nie jest alternatywą
Propozycja pada na co drugim spotkaniu: zapisać hasz zamiast adresu, wtedy wartość będzie nieczytelna. Nieczytelna jest, anonimowa nie – bo przestrzeń, z której pochodzi, jest maleńka.
IPv4 obejmuje około 4,3 miliarda adresów. Zwykła maszyna liczy SHA-256 w tempie rzędu setek milionów haszy na sekundę, pełna tablica adresów i ich haszy powstaje więc w kilka minut i mieści się na laptopie. Zahaszowany adres IPv4 nie jest zatem pseudonimem, lecz adresem zapisanym w innym alfabecie, a wyszukanie, które ten zapis odwraca, to błąd zaokrąglenia w nakładzie pracy.
Sól na każde zdarzenie niszczy tablicę, ale niszczy też jedyny powód, dla którego wartość zachowano: dwa zdarzenia tego samego odwiedzającego przestają do siebie pasować. Sól stała zachowuje przypisanie i zamienia tablicę jedynie w nieco droższą, policzoną raz i używaną ponownie dla każdego rekordu tego samego zbioru. Naprawdę użyteczny pozostaje hasz z adresu już skróconego – wtedy haszowana jest grupa 256 adresów, a ochrona pochodzi ze skrócenia, a nie z hasza.
IPv6 skraca inaczej, niż wygląda
Reguła przeniesiona z IPv4 – odrzucić ostatnią ćwiartkę – przy IPv6 nie daje prawie nic, bo adres zbudowany jest inaczej. Łączu przydziela się zwykle całe /64, a każde urządzenie za nim wymyśla sobie własne zakończenie wewnątrz tego bloku. Skrócenie adresu do jego /64 usuwa więc urządzenie, a zachowuje łącze – dokładnie ten identyfikator, o który chodziło.
Sensowne skracanie zaczyna się dopiero o stopień dalej w lewo. Zakres /56 albo /48 to tyle, ile dostawca przydziela lokalizacji, tam więc zaczyna się grupa większa niż jedno gospodarstwo. Reguła Google dla IPv6 – wyzerowanie ostatnich 80 bitów, po którym zostaje /48 – leży właśnie w tym miejscu, a nie przy optycznie odpowiadającej ćwiartce.
Jeden przypadek przechodzi przez to wszystko niezauważony: adres IPv4 w zapisie IPv6, notowany jako ::ffff:203.0.113.45. Reguły maskowania liczące od prawej pozostawiają osadzony adres znacznie dłużej, niż wynikałoby z oczekiwań, a wartość wyglądająca jak zamaskowany adres IPv6 może nieść pełny adres IPv4.
W którym miejscu przepływu leży skracanie
Maskowanie jest maskowaniem tylko wtedy, gdy następuje, zanim adres opuści własny obszar, a to rozróżnienie dzieli dwa przypadki opisywane skądinąd tymi samymi słowami.
W układzie serwerowym – w Conversions API, w kontenerze na własnej infrastrukturze – adres jest polem w ładunku. To, co zostanie wpisane w client_ip_address, jest tym, czego dowie się odbiorca; skrócenie przed wysłaniem usuwa więc ostatni oktet ostatecznie. To przypadek, w którym środek dotrzymuje obietnicy.
Przy tagu działającym w przeglądarce jest odwrotnie. Zapytanie idzie wprost do dostawcy, a adres, który on widzi, to adres połączenia, a nie ten z ładunku. Zamaskowana wartość w parametrze zmienia to, co znajdzie się w raporcie; nie zmienia tego, co dotarło na brzeg sieci dostawcy. Dopiero proxy przez własną domenę przesuwa tę granicę – i wtedy dostawca widzi adres własnego serwera.
Do czego skracanie naprawdę służy
Cel łatwiej obronić, gdy nazwie się go dokładnie. Zakres /24 nadal prowadzi do miasta, a często do dzielnicy, i właśnie o to chodzi: analiza geograficzna, dla której adres zebrano, przechodzi przez cięcie niemal bez zmian, podczas gdy wartość wskazująca pojedyncze łącze znika. Do tej wymiany środek jest dobrze dobrany, a do twierdzenia, że dane są już anonimowe – źle.
Dokumentacja wynika z tego samego zdania. Rejestr podający długość maski, miejsce w przepływie i wynikającą z tego wielkość grupy opisuje coś sprawdzalnego. Taki, który odnotowuje „adresy IP są anonimizowane”, opisuje przełącznik, którego nie ma – a pierwszym pytaniem przy każdej kontroli będzie to, od którego zaczął się ten tekst: jak duża jest grupa.
Pytania i odpowiedzi
Jak duża jest grupa za wartością IPv6 skróconą do /48?
To zależy od tego, co operator przydziela jednemu łączu. Zakres /48 obejmuje 256 bloków /56 i 65 536 bloków /64. Jeśli gospodarstwa domowe dostają po jednym /56, skróconą wartość dzieli między sobą do 256 łączy; liczba jest więc taka sama jak przy IPv4 /24, tyle że tu liczone są łącza, a nie adresy. Jeśli dostają po jednym /64, jest ich odpowiednio więcej.
Jeśli natomiast lokalizacja sama dostaje całe /48, jak to się zdarza w firmach, skrócenie nie usuwa niczego, co ją wyróżnia: zapisana wartość nadal oznacza dokładnie to jedno łącze. Wielkość grupy, którą powinien podawać rejestr, nie jest więc przy IPv6 stałą liczbą, lecz zależy od praktyki przydziału u operatorów, a dla lokalizacji z własnym /48 wynosi jeden.
Czy pomaga tajny klucz, na przykład HMAC zamiast soli?
Chroni przed osobami z zewnątrz, ale nie znosi powiązania z osobą. Dopóki klucz pozostaje tajny, tablicy adresów i wartości nie da się bez niego policzyć, a zbiór danych, który wyciekł, jest dla osób trzecich wart znacznie mniej. Kto ma klucz, liczy jednak tablicę w kilka minut tak samo jak przy haszu bez soli, bo przestrzeń adresów pozostaje ta sama.
Ponieważ administrator sam przechowuje klucz, wartości są dla niego pseudonimami, a nie danymi anonimowymi. HMAC z pełnego adresu jest więc dobrym zabezpieczeniem, ale nie zastępuje ani skracania, ani wpisu w rejestrze, że przechowywane są tu dane osobowe.
Gdzie pojawia się pełny adres, choć narzędzie analityczne go skraca?
Wszędzie tam, dokąd połączenie dociera, zanim zadziała skracanie. Typowe miejsca:
- dziennik dostępu serwera WWW, który w domyślnej konfiguracji Apache i nginx zapisuje pełny adres każdego żądania,
- dziennik błędów, który przy wielu błędach zapisuje adres klienta,
- CDN, zapora aplikacji webowych (WAF) albo load balancer przed serwerem, każdy z własnymi dziennikami, a do tego nagłówek X-Forwarded-For, który przekazuje serwerowi pierwotny adres,
- narzędzia blokujące, takie jak fail2ban, które przechowują adresy w całości właśnie dlatego, że mają je blokować,
- kopie zapasowe, które obejmują to wszystko, niekiedy z dłuższym okresem przechowywania niż oryginał.
Żadne z tych miejsc nie jest samo w sobie błędne, a niektóre są potrzebne do działania. Należą jednak do rejestru wraz z celem i okresem przechowywania, bo inaczej rejestr opisujący maskowanie w narzędziu analitycznym obejmuje tylko najmniejszą część przetwarzania.
Skąd w danych biorą się adresy IPv4 w zapisie IPv6?
Często z serwera, który na gnieździe IPv6 przyjmuje także połączenia IPv4. System operacyjny podaje je wtedy jako ::ffff:203.0.113.45 i dokładnie w tej postaci trafiają one do dzienników i aplikacji. Reguła maskowania powinna więc najpierw sprawdzić, czy wartość zaczyna się od ::ffff:, a potem skrócić osadzony adres IPv4 według reguły dla IPv4.