Izolacja egzekwowana przez bazę danych, a nie przez kod aplikacji.
Każde żądanie, które coś zmienia, jest autoryzowane trzy razy, w trzech miejscach zawodzących niezależnie od siebie. Za nimi stoi 868 polityk bezpieczeństwa na poziomie wierszy, więc błąd w obsłudze żądania jest błędem, a nie wyciekiem danych. Ta strona jest napisana dla osoby, która musi nas zaakceptować.
Jak Lurno chroni dane jednej organizacji przed drugą
Lurno autoryzuje każde żądanie zmieniające dane w trzech niezależnych miejscach. Interfejs sprawdza uprawnienie, zanim wyrenderuje kontrolkę. Serwer weryfikuje to samo uprawnienie, zanim dotknie danych, i odmawia, jeśli odpowiedź brzmi „nie”. Baza danych stosuje politykę bezpieczeństwa na poziomie wierszy, która decyduje, jakie wiersze zapytanie może w ogóle zwrócić. Wszystkie trzy muszą przepuścić żądanie. Takich polityk jest 868 w 676 migracjach, a tabele aplikacji znajdują się w 14 schematach dziedzinowych, a nie w domyślnym schemacie publicznym, więc wiersze jednej organizacji pozostają nieosiągalne z sesji innej organizacji nawet wtedy, gdy kod nad nimi jest błędny. Zmiany administracyjne trafiają do rejestru audytowego, do którego można wyłącznie dopisywać, a którego wiersze są powiązane łańcuchem SHA-256 i dają się zweryfikować zapytaniem. Augmental Learning Inc. działa zgodnie z praktykami ISO 27001; nie ma certyfikatu ISO 27001 ani raportu SOC 2 i mówimy o tym w ankiecie, zamiast pozwolić kupującemu zakładać coś innego.
- Autoryzacja w trzech bramkach
- Model, w którym jedno żądanie jest autoryzowane trzy razy, przez trzy mechanizmy zawodzące niezależnie od siebie. Bramka pierwsza to interfejs: ukrywa kontrolkę, do której zalogowana osoba nie ma uprawnienia. Bramka druga to serwer: obsługa żądania weryfikuje uprawnienie, zanim dotknie danych, i przerywa działanie, jeśli odpowiedź brzmi „nie”. Bramka trzecia to baza danych: polityka bezpieczeństwa na poziomie wierszy ogranicza, jakie wiersze może zwrócić zapytanie. Pierwsza bramka to wygoda, druga to podstawowa granica, a trzecia to ta, która wciąż działa, gdy drugą pominięto.
Trzy bramki i to, co stoi za każdą z nich
Jedno żądanie, autoryzowane trzy razy
Kontrolka w interfejsie pyta, czy zalogowana osoba ma dane uprawnienie, zanim się wyrenderuje. Obsługa żądania na serwerze weryfikuje to samo uprawnienie, zanim wykona jakąkolwiek pracę. Następnie baza danych stosuje politykę, która decyduje, jakie wiersze może zobaczyć zapytanie. Trzy mechanizmy, trzy osobne miejsca, w których trzeba mieć rację, a odmowa któregokolwiek z nich kończy żądanie.
- Sprawdzenie w interfejsie to wygoda, a nie granica. Ukrywa przycisk; nie chroni tabeli.
- Każde sprawdzenie przechodzi przez jeden katalog uprawnień i jedną funkcję. Żadna obsługa żądania nie odczytuje nazwy roli i nie decyduje samodzielnie, co ta rola oznacza.
- Rola nadana na oddziale w drzewie organizacji spływa w dół tej gałęzi — a polityki bazy danych czytają to samo drzewo co interfejs, więc nie mogą się ze sobą rozminąć.
868 polityk w 676 migracjach
Izolacja jest schematem, a nie konwencją. Tabele powstają z włączonym bezpieczeństwem na poziomie wierszy i politykami, które delegują decyzję do tej samej funkcji uprawnień, którą wywołuje serwer, a kontrola migracji szuka tabel, do których nadano dostęp bez stojącej za nim polityki. Ta liczba nie jest figurą marketingową — to odpowiedź bazy danych na pytanie, ile polityk egzekwuje.
- Polityki nie wpisują własnej logiki w treść. Wywołują funkcję uprawnień, więc odpowiedź nie może rozminąć się z tym, co serwer zdecydował chwilę wcześniej.
- Polityki zapisu mają klauzulę sprawdzającą obok klauzuli odczytu, więc wstawienie danych nie umieści wiersza w organizacji, do której zapisujący nie ma uprawnienia.
- Tam, gdzie widok udostępnia dane osobowe, dostęp nadaje się kolumna po kolumnie. Uprawnienie nadane na całą tabelę po cichu zniosłoby ochronę na poziomie kolumn, więc go nie stosujemy.
Czternaście schematów dziedzinowych, nigdy publiczny
Tabele aplikacji znajdują się w czternastu nazwanych schematach — jeden dla tożsamości i dostępu, jeden dla organizacji, jeden dla mediów i tak dalej. Nic, co ma znaczenie, nie leży w domyślnym schemacie publicznym, czyli w miejscu, w którym przypadkowo nadane uprawnienie albo zbyt pobłażliwe ustawienie domyślne najłatwiej ujawni dane. Prywatne media nie mają w ogóle polityk magazynu dla zalogowanych przeglądarek: każdy odczyt podpisuje serwer, który najpierw sprawdził wiersz właścicielski, i tak samo powstaje każde uprawnienie do wgrania pliku.
- Tokeny jednorazowe — zaproszenia, resety hasła, odzyskiwanie konta — są przechowywane jako solone skróty. Surowy token pokazuje się raz, w wiadomości e-mail, i nigdy więcej.
- Publiczna jest wyłącznie identyfikacja wizualna. Logo i favicon organizacji muszą wyrenderować się, zanim ktokolwiek się zaloguje; awatary i media lekcji nie muszą, więc pozostają podpisane.
Udowodnienie po fakcie, co się stało
Rejestr audytowy, którego nikt nie może sprawdzić, to plik z logami z lepszym marketingiem. Ten jest wyłącznie dopisywalny i ujawnia każdą manipulację, a sprawdzenie go to jedno zapytanie.
Rejestr wyłącznie do dopisywania
Zmiany administracyjne zapisujemy jako zdarzenia zawierające sprawcę, działanie, zasób, organizację oraz stan przed i po. Nic nie aktualizuje wiersza audytu. Ścieżka zapisu wyłącznie dopisuje.
Łańcuch skrótów SHA-256
Każde zdarzenie przechowuje skrót poprzedniego oraz własny skrót, oba nadawane przez wyzwalacz w bazie danych, a nie przez kod, który zdarzenie zapisał. Zmiana jednego wiersza sprawia, że wszystkie późniejsze skróty przestają się zgadzać.
Weryfikacja, którą można obejrzeć na żywo
Funkcja weryfikująca przechodzi przez łańcuch i wskazuje pierwszy wiersz, w którym się on urywa. Uruchomimy ją przy Państwu podczas przeglądu.
Przeglądy dostępu
Kto ma jaką rolę i w której organizacji — sprawdzane według harmonogramu, a nie dopiero w czasie audytu. Odebranie roli jest zdarzeniem audytowym jak każde inne.
Dwie osoby do rzeczy nieodwracalnych
Anonimizacja albo usunięcie osoby to najpierw wniosek, a potem osobne zatwierdzenie. Wnioskujący nie może zatwierdzić własnego wniosku i nikt nie może wskazać samego siebie.
Sesje, które można zakończyć
Zalogowana osoba może unieważnić swoje pozostałe sesje, a unieważniona sesja zostaje zablokowana przy najbliższym sprawdzeniu uprawnień, a nie dopiero wtedy, gdy jej token wygaśnie.
Od zgody do usunięcia danych, z zegarem przy każdym kroku
Każdy tenant jest administratorem danych swoich uczestników, a Lurno jest podmiotem przetwarzającym. Mechanizmy poniżej sprawiają, że ten podział jest realny, a nie tylko umowny.
- 01
Zgoda z numerem wersji
Każda polityka, na którą osoba wyraża zgodę, ma swoją wersję. Zmiana polityki unieważnia starą zgodę: osoba jest pytana ponownie, a to, na co i kiedy się zgodziła, zostaje zapisane. Przetwarzanie przez AI to osobna zgoda — po jej wycofaniu nic nie trafia do żadnego dostawcy.
- 02
Wniosek o dostęp do danych jako kreator
Administrator przechodzi przez wniosek krok po kroku, zamiast improwizować: identyfikuje osobę, której dane dotyczą, zbiera to, co platforma o niej przechowuje, i przygotowuje eksport. Przenoszalność oznacza format czytelny maszynowo — JSON i CSV, a nie plik PDF ze zrzutem ekranu.
- 03
Retencja z datą końcową
Dane osobowe mają harmonogram retencji dla każdej kategorii, zamiast domyślnie leżeć w nieskończoność. Nieaktywne konta, wygasłe zaproszenia i przeterminowane sesje mają datę, po której przestają istnieć.
- 04
Usuwanie danych z zasadą dwóch osób
Jeden administrator składa wniosek, drugi go zatwierdza i dopiero wtedy operacja się wykonuje. Wnioskujący nigdy nie może zatwierdzać, a żaden z nich nie może wskazać samego siebie. Usunięcie sięga tabel, które odwołują się do tej osoby, a nie tylko wiersza profilu.
- 05
Rejestr naruszeń z 72-godzinnym zegarem
Incydent to wiersz z terminem wyliczonym jako 72 godziny od wykrycia oraz przypomnieniami, które nie przestają się pojawiać, dopóki sprawa nie zostanie zamknięta. Zegar rusza w chwili wykrycia, a nie wtedy, gdy ktoś przypomni sobie o artykule 33.
Gdzie faktycznie leżą dane
Magazyn mediów, który można skierować gdzie indziej
Pliki zapisujemy przez interfejs magazynu z czterema implementacjami: Supabase Storage, Amazon S3, Azure Blob Storage i Google Cloud Storage. To zwykle uczciwa odpowiedź na wymóg dotyczący lokalizacji danych — wdrożenie może zapisywać pliki do bucketu w regionie, którego Państwo potrzebują, zamiast czekać, aż dostawca taki region otworzy. Prosimy podać wymóg wcześnie, a powiemy wprost, czy jest dziś spełniony.
- Baza danych, uwierzytelnianie i funkcje, na których działa API, są hostowane przez Supabase. To jedyna zależność, której nie da się skonfigurować inaczej, i jest ona wymieniona w umowie DPA.
- Własne domeny poszczególnych organizacji obsługuje Cloudflare, z certyfikatami wystawianymi automatycznie, więc uczestnik w Bejrucie albo Mediolanie widzi Państwa domenę, a nie naszą.
Analityka produktowa w UE, z pominięciem uczestników
Analityka platformy działa przez PostHog w jego regionie UE, za warstwą abstrakcji, dzięki której dostawcę można wymienić bez dotykania produktu. Nagrania sesji są maskowane i nigdy nie rejestrują uczestników — powierzchnia uczestnika nie jest w ogóle oprzyrządowana pod nagrywanie.
- Pola tekstowe i wszystko, co oznaczono jako dane osobowe, są maskowane w przeglądarce, zanim nagranie gdziekolwiek trafi.
- Analityka wymaga zgody i jest wyłączona, dopóki organizacja jej nie włączy. Nic dotyczącego osoby niepełnoletniej nie jest profilowane na żadnej powierzchni.
Co dzieje się z tekstem, zanim trafi do dostawcy AI
Wiadomość uczestnika, wgrany plik PDF, pytanie wpisane do copilota: wszystko to jest treścią, a nic z tego nie jest poleceniem. To rozróżnienie jest egzekwowane, a nie proszone o nie w prompcie.
Klasyfikacja prób wstrzyknięcia
Niezaufane dane wejściowe są klasyfikowane, zanim wykona się właściwe wywołanie. Tekst próbujący przekierować model zostaje oznaczony, a nie wykonany.
Losowe ogrodzenie
Niezaufany tekst opakowujemy w znacznik generowany osobno dla każdego żądania, którego model nie może odgadnąć, a sam znacznik jest z treści usuwany. Skrócenie tekstu domyka ogrodzenie, zamiast zostawiać je otwarte.
Anonimizacja przed wywołaniem
Imiona i nazwiska, adresy e-mail oraz identyfikatory są zastępowane, zanim cokolwiek wyruszy do dostawcy. Ocenianie działa na zanonimizowanej pracy; mapowanie z powrotem do uczestnika zostaje na naszym serwerze.
Walidacja schematu odpowiedzi
Każda odpowiedź jest sprawdzana względem schematu. Odpowiedź niepoprawna dostaje jedną próbę naprawy, a potem kończy się błędem, zamiast trafić do kursu.
Ślad od propozycji do zmiany
Zapytania, przyjęte szkice i odrzucone szkice to osobne wpisy w tym samym rejestrze powiązanym łańcuchem skrótów. To, co zaproponował model, stoi obok tego, co zastosował człowiek.
Jak ludzie się logują
Napisane tak, jak potrzebuje tego osoba oceniająca bezpieczeństwo: co jest wdrożone dziś, a co nie.
Konta z zaproszenia
Konta tworzy administrator albo powstają z zaproszenia — nie ma samodzielnej rejestracji. Linki do resetu i odzyskiwania są jednorazowe i przechowywane jako skróty.
Logowanie partnerskie (silent SSO)
System partnera, który już kogoś uwierzytelnił, może przekazać tę osobę podpisaną asercją, dzięki czemu uczestnik nie widzi drugiego logowania. Konfiguruje się je osobno dla każdej organizacji, ma własny klucz i można je odwołać.
Logowanie jednokrotne SAML i OIDC
W planachNie zbudowane. Jeśli Państwa wdrożenie zależy od Entra ID albo Okta, prosimy powiedzieć o tym na pierwszej rozmowie, a powiemy, na jakim jest to etapie, zamiast sugerować, że już działa.
MFA i passkeys
W planachRównież na mapie drogowej. Dziś hasłem zarządza dostawca tożsamości, sesje może unieważnić ich właściciel, a unieważnienie działa od najbliższego sprawdzenia uprawnień.
Wszyscy, którzy dotykają Państwa danych
Pięciu, a każdy z nich jest wymieniony w umowie powierzenia przetwarzania, a nie odkrywany później.
| Capability | Czym się zajmuje | Gdzie ma zastosowanie |
|---|---|---|
| Supabase | Baza danych, uwierzytelnianie, magazyn plików i funkcje, na których działa API | Główny podmiot przetwarzający. Magazyn mediów można zamiast tego skierować na S3, Azure albo GCS. |
| Cloudflare | DNS, TLS i własna domena, na której obsługiwana jest każda organizacja | Terminuje TLS dla domen poszczególnych organizacji; certyfikaty są wystawiane automatycznie. |
| OpenAI | Generowanie treści przez AI, tutoring i szkice ocen | Wywoływany tylko wtedy, gdy żądanie tego wymaga, po anonimizacji. Zamiast niego można skonfigurować Anthropic albo Google, a organizacja może podłączyć własny klucz. |
| Resend | Poczta transakcyjna — zaproszenia, powiadomienia, resety | Organizacja może wysyłać z własnej subdomeny, z własnym kluczem. |
| PostHog | Analityka produktowa i maskowane nagrania sesji | Region UE. Powierzchnie uczestnika nie są nagrywane. |
Wiążąca jest lista w umowie powierzenia przetwarzania, obok aneksu FERPA o ochronie danych uczniów dla szkół. Oba dokumenty wyślemy przed rozmową, a nie po niej.
WCAG 2.1 AA i to, czego nie mamy
Lurno jest budowane zgodnie z WCAG 2.1 AA. Automatyczne testy axe działają w ciągłej integracji, więc niedostateczny kontrast albo brakująca etykieta psują build, zamiast trafić do wydania. Ścieżki klawiaturowe, widoczny fokus i preferencje ograniczonego ruchu mieszkają w bibliotece komponentów, a nie są doklejane na każdym ekranie z osobna. Produkt jest dostępny po angielsku, francusku, arabsku i włosku, a arabski jest w całości od prawej do lewej, a nie jest przetłumaczonym układem od lewej do prawej.
Czego nie mamy, to dokumentu VPAT ani zewnętrznego audytu dostępności, i wolimy napisać to tutaj, niż zakopać w odpowiedzi na pytanie 47. Jeśli formalny raport zgodności jest warunkiem zakupu, prosimy zgłosić to wcześnie — to rozmowa o zakresie prac, a nie pole do odhaczenia.
Odpowiedzi, zanim trzeba będzie wysłać ankietę
Strony, na które ta ciągle wskazuje
Prosimy przesłać nam ankietę.
Większość odpowiedzi jest powyżej. Resztę — lokalizację danych, retencję, podprzetwarzających, umowę DPA — prosimy przynieść na rozmowę, a odpowiemy tymi samymi prostymi słowami, których użyliśmy tutaj.