Przejdź do głównej zawartości

Dostęp i zdolności

Każdy odczyt przez /osl/query jest ograniczony modelem zdolności + uprawnień (capability + permission): kto pyta (łańcuch delegacji podmiotów), co każda polityka mu nadaje nad grafem semantycznym i jak te nadania się składają. Jest fail-closed z konstrukcji — domyślnie deny, a wszystko nierozwiązane jest odrzucane, nigdy zgadywane.

Podmiot to jeden uczestnik łańcucha delegacji. Ma jeden z trzech opisowych typów:

Typ Czym jest
human Użytkownik (nazwa użytkownika / email)
agent Agent AI (z tagiem dostawcy: Claude, ChatGPT, Gemini, …, lub custom)
machine Workload / konto serwisowe

Dostęp jest ewaluowany nad łańcuchem podmiotów, root → leaf. Działający podmiot to ostatnie ogniwo. Kompozycja ma dwa poziomy:

W obrębie jednego podmiotu

Wszystkie polityki wiążące ten podmiot łączą się: nadania przez union, wygrywa najsilniejszy obowiązek (deny > mask > redact), jawny deny nadpisuje, a warunki (zakres IP, okno czasowe) bramkują tylko ALLOW — deny jest bezwarunkowe.

Wzdłuż łańcucha

Ogniwa łączą się przez MEET (przecięcie): encja lub kolumna jest nadana tylko wtedy, gdy nadaje ją każde ogniwo. Limit tieru to minimum (najbardziej restrykcyjne), a wymagana redakcja to union tego, czego wymaga każde ogniwo. Puste lub nieautorowane ogniwo zwija meet do deny.

Link 0 (manager): { client, email: cleartext }
Link 1 (employee): { client, email: mask }
────────────────────────────────────────────── MEET
Effective: { client, email: mask } ← the column survives, obligated to mask

Zakres semantyczny polityki to zbiór powiązań, każde kluczowane przez nodeId z domain-mapy (np. entity:Customer, metric:aum). Powiązanie deklaruje:

Pole Znaczenie
attributeGrants[] Nadanie per atrybut: cleartext, mask lub deny
filters[] (+ filtersBool) Predykaty wierszy określające, które wiersze są widoczne
grantedMetrics[] Samodzielne nadania metryk
facetGrants[] Nadanie treści per faseta (zobacz wersje redakcji)

Nadania są pozytywne: kolumna, która nie jest nadana, jest redagowana, nigdy zwracana jako NULL ani po cichu usuwana ze schematu. deny usuwa kolumnę z projekcji całkowicie; globalny dla polityki deny nadpisuje nadanie każdego innego powiązania.

Fasety treści są nadzorowane przez nazwane wersje redakcji — oddzielenie nazwy widocznej dla człowieka od fizycznej, bajtowo-stabilnej tożsamości:

  • RedactionVersion ma nazwę (uchwyt w konsoli, np. "PII básica") oraz zbiór tagów (klasy treści, które redaguje, np. {email, phone}).
  • Tagi są tożsamością fizyczną (bajtowo niezmienione, używane jako klucz tabeli); nazwa służy tylko do autorowania.
  • Domniemana wersja original (bez tagów) to tabela bazowa.
  • facetGrant wiąże wymaganą nazwę wersji per faseta. Wybór jest dokładny-albo-deny: silnik serwuje zapisaną wersję, której tagi dokładnie pasują, albo odmawia fasety — nigdy nie schodzi do wersji bardziej lub mniej zredagowanej.
  • Wzdłuż łańcucha wymagane wersje składają się przez union zbiorów tagów (więcej redakcji jest zawsze bezpieczne).

Egzekwowanie jest po stronie serwera, w komórce. Wyniki:

Sytuacja Zwracana wartość W wyniku?
Nadane cleartext oryginał tak
Obowiązek mask *** tak
Obowiązek redact ⟦redacted⟧ tak (przeżywa dla ORDER BY/GROUP BY)
deny / bez nadania usunięte z projekcji

Sentinel ⟦redacted⟧ oznacza, że kolumna przeżywa z nadzorowaną wartością (więc kształt w dół strumienia jest stabilny), zamiast stać się NULL lub zniknąć — i to właśnie czyni joiny cross-modalne fail-closed, a model składalnym.

Łańcuch nie jest zaufanym nagłówkiem — to podpisany token. Komórka emituje i weryfikuje JWT HS256, którego payload zawiera sam łańcuch, więc wywołujący nie może go skrócić ani sfałszować bez złamania podpisu (nieobecny/nieprawidłowy łańcuch → deny). Zobacz Uwierzytelnianie.

Dwie operacje dry-run obliczają rzeczywistą kompozycję bez serwowania danych (konsola Enterprise je eksponuje; API są w komórce):

  • :simulate — podgląd jednej polityki względem zapytania jako pojedynczy podmiot.
  • :simulate-chain — skompiluj pełny autorowany zbiór polityk tenanta nad łańcuchem root → leaf (MEET), zwracając złożony zakres plus rozbicie wkładu per ogniwo. Nieautorowane ogniwo jest oznaczane; meet pustoszeje do fail-closed empty_meet.