Blog JSystems - uwalniamy wiedzę!

Szukaj
Z tego artykułu dowiesz się:
  • jak określić identyfikator PID niechcianej sesji,
  • jak natychmiast rozłączyć niechcianą sesję,
  • jak uniemożliwić użytkownikowi ponowne podłączenie się.

Aby rozłączyć sesję użytkownika, będziemy potrzebowali jego PID. Wartość tę znajdziemy dzięki słownikowi "pg_stat_activity". Zobaczymy w nim listę wszystkich sesji (w tym wewnętrznych sesji PostgreSQL) wraz z informacją typu ip użytkownika, czy używanego przez niego programu. Na potrzeby przykładu tworzymy użytkownika "problemowy":

create user problemowy;

Następnie podpinamy się jako ten użytkownik z pomocą "psql" i sprawdzamy aktualny czas:

psql -U problemowy -d postgres
select current_timestamp;
PostgreSQL: ilustracja poglądowa

Chcemy teraz tę sesję "ubić". Wyszukujemy dane na temat sesji tego użytkownika w "pg_stat_activity":

select * from pg_stat_activity where usename='problemowy';
PostgreSQL: ilustracja poglądowa (2)

Potrzebna nam wartość znajduje się w kolumnie "pid". Wartość z tej kolumny przekazujemy jako argument dla funkcji "pg_terminate_backend", by przerwać sesję:

select pg_terminate_backend(917507);

Po przerwaniu sesji wracamy ponownie do połączenia użytkownika "problemowy" i ponownie usiłujemy sprawdzić czas:

PostgreSQL: ilustracja poglądowa (3)

Sesję udało się przerwać, choć jak widzimy, psql podłączył się od razu ponownie. Jeśli chcemy, możemy ubić sesję i natychmiast zablokować możliwość ponownego zalogowania się:

select pg_terminate_backend(917592);
alter user problemowy nologin;

Po takiej operacji automatyczna próba ponownego połączenia się nie przechodzi:

PostgreSQL: ilustracja poglądowa (4)
Baner szkolenia Administracja, replikacja i tuning baz danych PostgreSQL w JSystems, terminy gwarantowane

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL →

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Jak znaleźć PID sesji, którą chcę rozłączyć w PostgreSQL?
PID sesji odczytasz ze słownika systemowego pg_stat_activity. Znajdziesz tam listę wszystkich sesji wraz z nazwą użytkownika, adresem IP i używanym programem. Aby zawęzić wynik do konkretnej osoby, filtruj po kolumnie usename, a potrzebny identyfikator znajduje się w kolumnie pid.
Jaka funkcja rozłącza sesję użytkownika w PostgreSQL?
Do natychmiastowego przerwania sesji służy funkcja pg_terminate_backend. Jako argument podajesz jej PID sesji pobrany z pg_stat_activity. Po wywołaniu tej funkcji dana sesja zostaje zakończona po stronie serwera.
Dlaczego po rozłączeniu sesji użytkownik od razu wraca?
Samo wywołanie pg_terminate_backend kończy tylko bieżącą sesję. Jeśli klient, na przykład psql, ma włączone ponowne łączenie, natychmiast tworzy nowe połączenie. Aby to zablokować, trzeba dodatkowo odebrać użytkownikowi prawo logowania.
Jak trwale zablokować użytkownikowi ponowne zalogowanie?
Po przerwaniu sesji ustaw użytkownikowi atrybut nologin poleceniem alter user nazwa nologin. Od tego momentu automatyczna próba ponownego połączenia nie przejdzie, dopóki nie przywrócisz prawa logowania.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...