Sejf w sejfie vs. Sejf z kilkoma drzwiczkami – jak kontrolować dostęp za pomocą kryptografii

Czasami potrzeba zabezpieczenia dostępu do danych na różne sposoby, tak aby tylko powołane osoby mogły je odczytać. Standardowym, dość powszechnym sposobem jest zaprzęgnięcie do tego celu dedykowanego serwisu, który kontroluje co kto może zrobić (np. LDAP) i podpięcie do niego serwisu zarządzającego danym zasobem (np. dostęp do systemu). Zaletą takiego podejścia jest oczywiście skalowalność i kontrola nad tym co się dzieje, jednak takie podejście zwiększa ilość słabych punktów, które mogą zawieść. Po pierwsze outage dowolnego z nich powoduje niedostępność całej usługi. Po drugie, znalezienie podatności w dowolnym z nich może doprowadzić do nieautoryzowanego dostępu do danych.
Zamiast powyższego podejścia chciałbym pokazać jak można uzyskać podobną “funkcjonalność” dotyczącą dostępu do danych za pomocą kryptografii. Zamiast kontrolować dostęp aktywnie, przez dedykowany serwis, zaszyfrujemy nasze dane w odpowiedni sposób, za pomocą ogólnodostępnych funkcji.

Jest kilka różnic w takim podejściu w stosunku do metody opartej o dedykowany serwis. Po pierwsze kryptografia działa offline, więc dostęp do danych będzie miała nawet osoba, która dostała je w zaszyfrowanej formie i jest offline, zatem można udostępnić je bezpiecznie nawet przez pendrive. Po drugie dostęp do danych jest dawany na zawsze. To znaczy, że jeśli raz damy dostęp do nich, to nie możemy go odebrać, a jedynie zaszyfrować dane ponownie, nowymi kluczami, nieznanymi danej osobie, jednak nie mamy gwarancji, że nie dostanie ich w starej formie. W przypadku serwisu typu LDAP wiemy czy ktoś się logował i prosił o dostęp do danego zasobu. Jeśli nie, to możemy mu go najzwyczajniej odebrać.

Na potrzeby tego wpisu i aby było łatwiej zrozumieć podejście kryptograficzne załóżmy, że nasze dane są trzymane w sejfie, a posiadanie dostępu tego sejfu pozwala odczytać te dane (odszyfrować).

Sejf

Po prostu – dostęp do zasobu ma mieć jedynie uppawniona osoba. Dane szyfrujemy, a klucz dajemy zainteresowanemu. Albo zainteresowany daje nam swój publiczny klucz, a my nim szyfrujemy dane i tylko on może je odszyfrować. Jest to najprostsze podejście, które równocześnie pozwala dać dostęp grupie (przez skopiowanie tego samego klucza symetrycznegoosób bez kontroli w czyje ręce się dostanie. W przypadku szyfrowania kluczem asymetrycznym ten problem odpada – zakładamy, że nikt nie chce udostępniać swojego prywatnego klucza innym tylko po to aby mogli odszyfrować jednorazowo dane.

Sejf w sejfie

Wyobraźmy sobie sytuację, gdzie do dostęp do danych ma być uzyskany jedynie za zgodą wszystkich zainteresowanych na raz. Nikt nie dostanie się do naszego sejfu bez wiedzy pozostałych osób. Najprostszym przykładem może być nasz testament. Podczas jego odszyfrowania my będziemy “offline” z wiadomych względów, natomiast chcemy aby wszyscy zainteresowani (spadkobiercy) zostali powiadomieni i wzięli udział w jego otwarciu.

Aby uzyskać taką konfigurację musimy zaszyfrować dane (testament) za pomocą wielu różnych kluczy (lub kluczy publicznych różnych osób), które odpowiadać będą wszystkim zainteresowanym:

zabezpieczone_dane = Sa(Sb(Sc(dane)))

gdzie Sx jest szyfrowaniem za pomocą klucza należącego do osoby x. W ten sposób każda osoba musi odszyfrować swoją “warstwę” aby dostać się do właściwych danych. Oczywiście istnieje tutaj ryzyko, że osoba posiadająca klucz Sa ze względu na niechęć do ujawnienia danych zablokuje ten proces i osoby b oraz c nie dowiedzą się co było w środku. Również Sc może nie podzielić się swoimi odszyfrowanymi danymi, po dowiedzeniu się co jest w środku.

Analogią jest tu oczywiście zamknięcie małego sejfu w większym, a tego w jeszcze większym. Aby dostać się do najmniejszego z nich otwarte muszą być wszystkie wcześniejsze drzwiczki większych sejfów, a więc wszyscy posiadacze kluczy muszą współpracować. W przypadku kryptografii współpraca (oraz przebywanie w jednym miejscu) nie jest już tak oczywiste i może częściowo zablokować dostęp do danych tak jak w opisanym przypadku.

Innym, dość chamskim przykładem takiego zabezpieczenia wymagającego współpracę dwóch lub więcej osób jest przypięcie komuś roweru dodatkowym zapięciem. Bez Was nie odjedzie swoim jednoślaedm ]:-> Pozdrowienia dla Moniki z Motoroli. Pół biura Cie szukało żeby odpiąć mój rower 😀

Natomiast jeśli dane są bardzo duże, to możemy użyć tymczasowego klucza (de)szyfrującego, który jest zamknięty w sejfach. Dopiero po otrzymaniu tego klucza można dostać się do właściwych dancyh, zamkniętych w innym, pojedynczym sejfie (zaszyfrowanych tym kluczem).

Sejf z wieloma drzwiczkami

Kolejnym podejściem jest zezwolenie na dostęp do dancyh/sejfu dowolnej osobie z grupy, ale z założeniem, że każdy ma swój inny, unikalny klucz. Najpopularniejszym rozwiązaniem tego problemu jest szyfrowanie dysków w naszych komputerach (halo windows, u Was też?). Każdy użytkownik systemu może ustawić swoje hasło do szyfrowania dysku, którym zaszyfrowany jest docelowy klucz. Podczas startu systemu podając jedno z haseł odszyfrowujemy tak na prawdę docelowy klucz symetryczny, którym jest zaszyfrowany cały dysk. Dzięki temu, oprócz możliwości udzielenia dostępu dla wielu osób, możemy w dowolnym momencie dodać lub usunąć hasło do odszyfrowania systemu plików, bez konieczności re-szyfrowania całego dysku. Zmieniając hasło, zapisujemy jedynie kilkadziesiąt/kilkaset bajtów zaszyfrowanego głównego klucza za pomocą naszego nowego hasła.

Jak takie coś wygląda w prawdziwym życiu? Ano tak:



https://www.geograph.org.uk/photo/5932928

Aby dostać się za taką bramkę trzeba odpiąć łańcuch. Aby to zrobić zdjęta musi być jedna z kilku kłódek. Każda z nich odpowiada konkretnemu mieszkańcowi posesji. Co jeśli ktoś zgubi klucz? Tylko ta osoba kupuje nową kłódkę i zakłada na swoje miejsce, bez zawracania głowy innym osobom dorabianiem nowego klucza.

W przypadku analogi do sejfu mielibyśmy skrzynkę nie z jednymi, a z wieloma drzwiczkami, każde z osobnym kluczem.

Otwarcie N z M zamków

Moim zdaniem najciekawszym sposobem zabezpieczenia danych jest otwarcie sejfu (odszyfrowanie) przy dostępnych jedynie M kluczach z N, gdzie oczywiście M < N. Czyli mamy coś pomiędzy drugim a trzecim opisywanym rozwiązaniem: do otwarcia nie muszą być obecni wszyscy, ale nie może to być też jedna osoba. Sytuacja taka może być wymagana gdy na przykład bank wymaga do wysłania przelewu potwierdzenia od większości udziałowców firmy. Czyli mogą to być na przykład dowolne 4 z 7 osób. Zaimplementowanie tego mając centralny serwis jest oczywiście proste. Natomiast jak to zrobić z użyciem kryptografii? Wróćmy do czasów liceum albo nawet gimnazjum (lub końca podstawówki, jeśli gimb tu nie ma 🙂 Jedna z mniej „pożytecznych” rzeczy, która była przez bardzo długi czas wałkowana, nawet jeszcze na studiach, to wielomiany. Gdzieś w tym okresie nauki pojawiało się też twierdzenie, że przez dowolne X punktów przechodzi dokładnie jeden wielomian X+1 stopnia. Aby to dobrze zwizualizować, wyznacz dwie kropki obok siebie i spróbuj przez nie narysować kilka paraboli. Działa? Tak! Parabola jest wielomianem 2-go stopnia. Jeśli wyznaczysz gdzieś pomiędzy trzecią kropkę, okaże się, że da się tamtędy przeprowadzić jedynie jedną parabolę (bez znaczącego jej wyginania 😀 ) Uff, dowód matematyczny za nami.



Źródło: Wikipedia

W czym to pomoże?

Osoba trzymająca pieczę nad sejfem (lub danymi) może ustawić jako jego kod dostępu (klucz szyfrujący) miejsca zerowe wielomianu (czyli tam, gdzie linia przecina się z poziomą osią na wykresie). Wielomian taki musi być stopnia odpowiadającego ilości wymaganych osób do otwarcia lub odszyfrowania danych. Czyli jeśli będziemy potrzebowali jednoczesnej współpracy 4 osób, to musimy „wylosować” wielomian 3 stopnia. Następnie dajemy każdej zainteresowanej osobie jeden punkt leżący na tym wielomianie. Punktów możemy wylosować do woli, bez ograniczeń, gdyż taki wielomian ciągnie się od -oo do +oo, a powyższe twierdzenie działa dla dowolnych punktów. Dzięki temu jeśli znajdą się wymagane 4 osoby chcące znaleźć klucz do odszyfrowania danych, to uda im się to przez wyznaczenie miejsc zerowych wielomianu, bazującego na ich 4 punktach, przez które przechodzi ten wielomian.

Dużo danych i cyferek… wracając do przykładu potwierdzaniem przelewu w banku dla większości z 7-osobowego zarządu:

  • “Większość” to dowolne 4 osoby z 7
  • Zatem wielomian musi być stopnia 4-1, czyli trzeciego
  • Potrzebujemy 7 różnych punktów dla 7 różnych członków zarządu
  • Mając taki wielomian losujemy dowolne 7 punktów X,Y leżące na tym wielomianie, które nie są miejscami zerowymi

Zatem po spotkaniu się 4 dowolnych osób, dostają one zadanie matematyczne polegające na znalezieniu wielomianu trzeciego stopnia przechodzącego przez ich punkty i wyznaczenia jego miejsc zerowych. Dla niewtajemniczonych, miejsce zerowe to tam, gdzie wykres wielomianu przecina się z osią poziomą. Dla mniej wtajemniczonych: narysuj dowolną parabolę przecinającą oś poziomą – to tam gdzie się przecina 🙂 Wyznaczone miejsca zerowe, na przykład po zamianie na stringi i konkatenacji stają się naszym kluczem do odszyfrowania danych.

Skomplikowane… ale z drugiej storny pomyśl o tym gdy z kolegą będziesz szukał miejsc zerowych aby gdzieś w sercu Bieszczad potwierdzić bankowi przelew, a zasięgu i komputera akurat brak 😉

Bonus: Otwarcie N z M zamków z bossem 🙂

Manipulując odpowiednio stopniem wielomianu oraz ilością punktów, jakie dostają poszczególne osoby możemy też przydzielić odpowiednie „wagi” tym osobom. Jeśli do dostępu do danych chcemy co najmniej jedną osobę z zarządu firmy i dowolnych 3 pracowników, lub dowolne dwie osoby z zarządu bez udziału pracowników, to każdy z zarządu może wtedy dostać odpowiednio więcej punktów leżących na wielomianie, ale w taki sposób, aby dalej brakowało mu trzech z nich.

Tak więc „boss” mający X-3 punkty potrzebuje co najmniej 3 pracowników do uzyskania klucza do odszyfrowania danych (tj. wyznaczenia tego wielomianu). Jeśli natomiast znajdzie innego „bossa”, to razem mają wręcz nadmiar punktów niezbędnych do ustalenia miejsc zerowych i odszyfrowania danych. Dzięki takiemu mechanizmowi możemy w prosty sposób kontrolować ile jakich osób będzie wymaganych do dostępu do danych.

Co jeszcze

Do powyższych metod dochodzą też sposoby na usuwanie poszczególnych posiadaczy częściowego klucza lub aktualizacje kluczy, jak również cała matematyka polegająca na określeniu złożoności i bezpieczeństwa takich kluczy. Do tego polecam już jednak bardziej techniczne dokumenty.

Większość powyższych metod jest zaimplementowana w frameworku dinemic, który za pomocą podobnych mechanizmów kontroluje i zarządza dostępem do rozproszonej bazy danych.