Odebrałem uprawnienia, a ta osoba nadal jest w środku: sesja to nie to samo co uprawnienie

Odebrałeś uprawnienie, wyłączyłeś nawet konto, a ta osoba nadal potrafi coś zrobić. Nic nie jest zepsute: odbieranie dostępu i kończenie sesji to dwie osobne czynności.

AtlasPVE ·

Ten wpis odpowiada na

  • proxmox skasowany użytkownik nadal się loguje
  • proxmox odebrane uprawnienie nadal ma dostęp
  • proxmox ciągle mnie wylogowuje
  • jak długo trwa sesja w proxmoksie
  • proxmox unieważnienie tokenu api

Odebrałeś użytkownikowi uprawnienie. Może nawet wyłączyłeś całe konto. Potem zauważasz, że ta osoba nadal potrafi coś zrobić.

Nic nie jest zepsute. Zalogowanie się i posiadanie uprawnień to dwie osobne chwile, a między nimi jest szczelina.

Logowanie zdarza się raz, o uprawnienie pyta się za każdym razem

Gdy się logujesz, system wręcza ci bilet. Bilet mówi: ta osoba udowodniła, kim jest, i ten bilet jest ważny do takiej a takiej godziny.

Uprawnienie jest osobnym pytaniem, zadawanym na nowo przy każdym żądaniu. Ale w praktyce wiele systemów bierze przy logowaniu kopię mapy uprawnień, dla szybkości, i przez pewien czas używa tej kopii.

Wychodzą z tego dwa opóźnienia.

Pierwsze: gdy odbierasz uprawnienie, otwarta sesja może dalej nieść tamtą kopię. Zmiana dociera do niej dopiero przy odnowieniu sesji.

Drugie, i ważniejsze: skasowanie albo wyłączenie użytkownika nie drze biletu, który on trzyma. Bilet jest samowystarczalny i pozostaje ważny aż do wygaśnięcia.

Reguła: odebranie dostępu to nie zakończenie sesji

To są dwie osobne czynności, a wykonanie tylko pierwszej zostawia za tobą otwarte okno.

Okno nie jest nieskończone; bilet nie jest ważny przez dobę. Ale nie jest też zerowe, a w sytuacji pilnej odpowiedź, że zaraz się zamknie, nie jest wystarczająco dobra.

Gdy ktoś odchodzi albo gdy hasło jest podejrzane

Zrób trzy rzeczy, w tej kolejności.

Odbierz uprawnienie. Wyłącz też konto, jeśli jest po temu powód.

Zmień hasło. To zamyka drogę do zdobycia świeżego biletu w miejsce trzymanego. Samo odebranie uprawnienia tego nie robi.

Usuń osobno tokeny dostępu. To najczęściej pomijany krok. Token nie jest sesją: nie wygasa sam, żyje, dopóki go nie skasujesz. Zmiana hasła użytkownika nie unieważnia jego tokenów. Usuwając użytkownika, sprawdź osobno, co stało się z jego tokenami.

I zamknijmy jedno nieporozumienie: uwierzytelnianie dwuskładnikowe ci tu nie pomaga. Ono pilnuje chwili logowania. O sesji już otwartej nie ma nic do powiedzenia.

Druga strona: dlaczego ciągle mnie wylogowuje

To druga twarz tego samego mechanizmu.

Bilet ma ograniczony czas życia, a interfejs regularnie go odnawia, dopóki jesteś na karcie. Zamknij kartę, wróć po kilku godzinach i żadne odnowienie się nie odbyło, bilet jest martwy, więc prosi cię o ponowne zalogowanie. To nie jest usterka.

Druga, mniej znana przyczyna jest ciekawsza: zegar maszyny. Bilet niesie znacznik czasu. Jeśli zegar serwera odjedzie, świeżo wydany bilet potrafi wyglądać, jakby pochodził z przyszłości albo dawno wygasł. Objaw jest mylący: hasło jest poprawne, logowanie wygląda na przyjęte, a sesja natychmiast potem odpada. Nikomu nie przychodzi do głowy szukać problemu z zegarem po stronie tożsamości, ale poszukaj.

Co robi Atlas

W Atlasie ciasteczko idące do przeglądarki nie jest prawdziwym biletem. Przeglądarka niesie tylko pozbawiony znaczenia losowy identyfikator; właściwy bilet zostaje na serwerze.

Różnica jest konkretna: nawet jeśli błąd przeglądarki odczyta ciasteczko, nie wynosi z niego samego biletu, więc nie może go przenieść gdzie indziej i tam użyć. Jedyne, co może zrobić, to działać z tej przeglądarki, dopóki ta sesja żyje. To nie jest zerowe ryzyko, ale zawęża zasięg zagrożenia.

Otwarte sesje są zapisywane na dysku, więc przy aktualizacji produktu nikt nie zostaje wyrzucony. Zapis wykonywany jest celowo w jednym kroku: gdyby plik został zostawiony zapisany w połowie, to nawet przy stronie odczytującej, która to toleruje, odpadłyby wszystkie otwarte sesje.

Naprawdę warto opowiedzieć o usterce znalezionej tu przez pomiar.

Wygasłe zapisy sesji były sprzątane tylko z pamięci, a nie z pliku. Sprawdzono działającą maszynę: w pliku siedziało pięć wygasłych zapisów, każdy z biletem w środku. Zostałyby tam do następnego logowania, bo nic innego nigdy tego pliku nie zapisywało.

Zamiarem kodu było już wtedy ich nietrzymanie. Brakowało wyłącznie kroku zapisu.

Lekcja obowiązuje każdego, kto pisze kod dotyczący bezpieczeństwa: zapominanie ma dwa miejsca. Coś usuniętego z pamięci nie jest usunięte z dysku, a z tych dwóch to na dysku zawsze żyje dłużej. Gdy decydujesz, że czegoś nie wolno trzymać, drugie pytanie brzmi zawsze tak samo: gdzie to jest trzymane?

Źródła

Własna dokumentacja Proxmoksa. Po angielsku i to ona ma ostatnie słowo w tej sprawie.

Powiązane wpisy

Jak to wygląda wewnątrz Atlasa?

Przejdź do strony produktu