SQL Server w logistyce

Tabela _users_events w bazie danych SQL Server

Rejestr zdarzeń logowania — w tym prób nieudanych, które są najwcześniejszym sygnałem ataku na konta.

sql.server.net.pl/sql/
Uśmiechnięty analityk w garniturze przy szerokim monitorze
Uśmiechnięty analityk w garniturze przy szerokim monitorze
W skrócie
  • Tabela odnotowuje zdarzenia dotyczące dostępu, w tym nieudane próby logowania wraz z adresem IP.
  • Cztery kolumny wystarczają, żeby rozpoznać próbę odgadnięcia hasła: kto, skąd, kiedy i z jakim skutkiem.
  • Rodzaj zdarzenia jest opisany tekstem, nie kodem — daje elastyczność kosztem trudniejszego filtrowania.
  • Brak indeksu na kolumnie z czasem sprawia, że zapytania o ostatnią dobę przeglądają całą tabelę.

Do czego służy tabela [dbo].[_users_events]

Włamanie do systemu magazynowego rzadko zaczyna się od wyrafinowanej techniki. Zaczyna się od prób odgadnięcia hasła — kilkudziesięciu, kilkuset, wykonywanych z jednego adresu w krótkim czasie. Tabela [dbo].[_users_events] jest miejscem, w którym takie próby zostawiają ślad.

Struktura jest minimalna i wystarczająca. Nazwa użytkownika, adres IP, czas zdarzenia oraz jego opis — na przykład informacja o błędnym logowaniu. Cztery wartości pozwalają odpowiedzieć na wszystkie pytania istotne przy analizie: czy próby dotyczą jednego konta, czy wielu; czy pochodzą z jednego adresu; jak są rozłożone w czasie.

Rozróżnienie rodzaju zdarzenia zapisano tekstem w kolumnie ZDARZENIE. Daje to swobodę w dodawaniu nowych rodzajów bez zmiany struktury, ale wymaga konsekwencji: zapisy różniące się wielkością liter albo drobnym sformułowaniem trafią do osobnych grup w każdym zestawieniu i zafałszują statystykę.

Jak z pojedynczych wpisów rozpoznać atak na konta
Zdarzenie ZdarzenieNieudane logowanie zapisane z loginem i adresem IP
Skupienie SkupienieWiele prób z jednego adresu w krótkim czasie
Wzorzec WzorzecTen sam adres wobec wielu różnych loginów
Reakcja ReakcjaZablokowanie adresu i wymuszenie zmiany haseł

Rozróżnienie ma znaczenie: próby wobec jednego konta to zwykle zapomniane hasło, wobec wielu — atak słownikowy.

Budowa tabeli — wykaz kolumn

Pięć kolumn opisuje pojedyncze zdarzenie dotyczące dostępu do systemu.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
CZASdatetime
data i godzina
nieCzas zdarzenia
ID_USER_IPint
liczba całkowita
takId wpisu dotyczacego ip
IPvarchar(50)
tekst do 50 znaków
nieIp logowania
USERNAMEvarchar(50)
tekst do 50 znaków
nieNazwa uzytkownika
ZDARZENIEvarchar(50)
tekst do 50 znaków
nieOpis zdarzenia jakie opisuje dany rekord np. BLEDNE LOGOWANIE

Kolumna ZDARZENIE ma pięćdziesiąt znaków i przechowuje opis tekstowy. Warto ustalić zamkniętą listę dopuszczalnych wartości — bez tego zestawienia rozbijają się na warianty różniące się wyłącznie zapisem.

Indeksy i wydajność zapytań

Tabela ma zdefiniowany wyłącznie klucz główny, co przy analizie bezpieczeństwa jest ograniczeniem.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
PK__users_eventsID_USER_IPklucz główny

Wszystkie sensowne pytania do tej tabeli zawężają zakres czasu albo dotyczą jednego adresu IP, a żadna z tych kolumn nie jest zindeksowana. Przy kilkuset tysiącach wpisów oznacza to, że codzienna kontrola bezpieczeństwa wymaga odczytu całej tabeli. Indeks na parze CZAS i IP rozwiązałby to niewielkim kosztem.

Co widać w rejestrze i jak to interpretować

Nieudane logowanie samo w sobie nic nie znaczy — ludzie mylą hasła codziennie. Znaczenie ma wzorzec, w jakim próby występują.

Interpretacja wzorców nieudanych logowań
Co widaćPrawdopodobne wyjaśnienieReakcja
Kilka prób, jeden login, jeden adresZapomniane hasło albo zmiana układu klawiaturyŻadna — sytuacja normalna
Kilkadziesiąt prób, jeden login, jeden adresPróba odgadnięcia hasła do konkretnego kontaBlokada adresu, kontakt z właścicielem konta
Wiele loginów, jeden adresAtak słownikowy na dowolne kontoNatychmiastowa blokada adresu
Jeden login, wiele adresówUdostępnione hasło albo przejęte kontoWymuszenie zmiany hasła
Próby poza godzinami pracyDostęp z zewnątrz albo automatSprawdzenie, czy adres należy do sieci firmowej

Trzeci wiersz wymaga reakcji najszybszej — atak obejmujący wiele loginów wskazuje na działanie automatu, nie pomyłkę człowieka.

Warto ustawić na tę tabelę zadanie kontrolne uruchamiane raz dziennie i wysyłające podsumowanie, gdy liczba nieudanych prób z jednego adresu przekroczy ustalony próg. Kilkanaście minut konfiguracji zamienia rejestr z archiwum, do którego nikt nie zagląda, w mechanizm faktycznie ostrzegający — a to różnica między wykryciem problemu w dniu jego wystąpienia a po miesiącu.

Jak korzystać z tabeli w praktyce

Przy korzystaniu z rejestru zdarzeń logowania warto pamiętać o kilku rzeczach:

  • Ustal zamkniętą listę wartości kolumny ZDARZENIE; swobodny tekst rozbija zestawienia na warianty tego samego zdarzenia.
  • Grupuj po adresie IP, zanim zaczniesz analizować pojedyncze wpisy — wzorzec mówi więcej niż zdarzenie.
  • Odróżniaj próby wobec jednego konta od prób wobec wielu; to dwie zupełnie różne sytuacje wymagające różnej reakcji.
  • Ustaw automatyczne powiadomienie po przekroczeniu progu prób z jednego adresu, zamiast polegać na ręcznym przeglądzie.
  • Rozważ indeks na parze CZAS i IP — obecnie każde zapytanie kontrolne przegląda całą tabelę.
  • Przechowuj wpisy dłużej niż inne rejestry; analiza bezpieczeństwa często sięga wstecz o miesiące.

Adresy, z których w ciągu ostatniej doby nie powiodło się wiele prób logowania — pierwsza rzecz do sprawdzenia przy kontroli bezpieczeństwa:

SELECT  IP,
        COUNT(*)                  AS PROB,
        COUNT(DISTINCT USERNAME)  AS ROZNYCH_LOGINOW,
        MIN(CZAS)                 AS PIERWSZA,
        MAX(CZAS)                 AS OSTATNIA
FROM    dbo._users_events
WHERE   ZDARZENIE LIKE '%LOGOWANIE%'
  AND   CZAS >= DATEADD(DAY, -1, GETDATE())
GROUP BY IP
HAVING  COUNT(*) > 10
ORDER BY ROZNYCH_LOGINOW DESC, PROB DESC;

Sortowanie zaczyna się od liczby różnych loginów, nie od liczby prób. Adres atakujący dziesięć kont po pięć razy jest groźniejszy niż ten, który pięćdziesiąt razy próbował dostać się na jedno.

Osobną kwestią jest okres przechowywania. Rejestry operacyjne archiwizuje się zwykle po kilku miesiącach, bo starsze wpisy przestają być potrzebne. Tutaj jest odwrotnie: analiza incydentu bezpieczeństwa niemal zawsze sięga wstecz dalej, niż się początkowo zakłada, a wpisy sprzed pół roku bywają jedynym dowodem na to, kiedy problem naprawdę się zaczął. Warto więc ten jeden rejestr wyłączyć z ogólnej reguły archiwizacji.

Rejestr zdarzeń logowania jest tanim zabezpieczeniem, które działa wyłącznie wtedy, gdy ktoś do niego zagląda — albo gdy zagląda za niego zadanie automatyczne. Bez tego pozostaje zapisem, z którego dowiadujemy się o włamaniu już po fakcie.

Powiązane tabele i dokumentacja

Rejestr zdarzeń logowania czyta się razem z pozostałymi zapisami dotyczącymi dostępu:

FAQ

Najczęściej zadawane pytania o tabelę _users_events

01

Kiedy nieudane logowania powinny niepokoić?

Gdy układają się we wzorzec. Kilka prób z jednego adresu wobec jednego konta to zwykle zapomniane hasło. Kilkadziesiąt prób wobec wielu różnych loginów z tego samego adresu oznacza atak słownikowy prowadzony automatem i wymaga natychmiastowej blokady. Kluczowa jest liczba różnych kont, nie liczba prób.

02

Co oznacza jeden login z wielu adresów?

Najczęściej udostępnienie hasła innej osobie albo przejęcie konta. Warto to zweryfikować z właścicielem konta, a niezależnie od wyniku wymusić zmianę hasła. Sytuacja bywa też skutkiem legalnej pracy zdalnej ze zmiennym adresem — dlatego rozstrzygnięcie wymaga rozmowy, nie samego zapytania.

03

Dlaczego warto ustalić zamkniętą listę rodzajów zdarzeń?

Bo kolumna przechowuje swobodny tekst. Zapisy różniące się wielkością liter albo drobnym sformułowaniem trafiają w zestawieniach do osobnych grup, co rozbija statystykę i utrudnia ustawienie progu alarmowego. Kilka ustalonych wartości wystarcza i pozwala pisać zapytania na warunku równości zamiast dopasowania wzorca.

04

Czy tabela wymaga dodatkowych indeksów?

Przy większym ruchu tak. Wszystkie sensowne zapytania zawężają zakres czasu albo dotyczą jednego adresu IP, a żadna z tych kolumn nie jest zindeksowana. Przy kilkuset tysiącach wpisów codzienna kontrola wymaga odczytu całej tabeli — indeks na parze CZAS i IP rozwiązuje to niewielkim kosztem.

Słownik pojęć

Słownik pojęć

Pojęcia związane z kontrolą dostępu i bezpieczeństwem systemu.

RRole i uprawnienia
Mechanizm przypisywania użytkownikom dostępu do funkcji i danych. Zamiast nadawać uprawnienia pojedynczo, przypisuje się je do roli odpowiadającej stanowisku.
RRODO
Rozporządzenie o ochronie danych osobowych. Wymaga ograniczenia dostępu do danych, rejestrowania operacji na nich i wskazania podstawy przetwarzania.
GGRC
Governance, Risk and Compliance — ład korporacyjny, zarządzanie ryzykiem i zgodność z przepisami. Wymaga dokumentowania procedur i śladu rewizyjnego.
ŚŚlad rewizyjny
Nieusuwalny zapis, kto i kiedy zmienił dane w systemie. Podstawa wiarygodności ewidencji podczas audytu i kontroli.
MMicrosoft SQL Server
Serwer relacyjnej bazy danych, na którym pracują aplikacje SoftwareStudio. Odpowiada za spójność danych, uprawnienia dostępu, kopie zapasowe i wydajność zapytań.
IIndeks bazodanowy
Struktura przyspieszająca wyszukiwanie wierszy w tabeli. Dobrze dobrane indeksy skracają czas zapytań, ale spowalniają zapisy i zajmują miejsce na dysku.
PPowiadomienia SMS i e-mail
Automatyczne komunikaty wysyłane po zajściu zdarzenia w systemie — potwierdzeniu awizacji, zmianie statusu reklamacji czy zbliżającym się terminie przeglądu.
MModel licencjonowania
Zasady odpłatności za oprogramowanie: licencja wieczysta z opłatą wdrożeniową albo abonament obejmujący aktualizacje i wsparcie.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.