Jak wykopać łagodnego użytkownika ze swojego systemu?

66

Googlowałem trochę temu i zauważyłem kilka sposobów, ale domyślam się, że Google nie wie wszystkiego. Jak więc wykopać użytkowników z twojego Linuxa? także w jaki sposób widzisz, że są zalogowani? i powiązane ... czy twoja metoda działa, jeśli użytkownik jest zalogowany do X11 DE (nie jest to wymóg, jestem po prostu ciekawy)?

ksenoterracid
źródło
3
Zmieniono pytanie, aby odzwierciedlić założenia przy przyjętej odpowiedzi. W kontekście naruszenia bezpieczeństwa jedynym sposobem na wyrzucenie złośliwego użytkownika z systemu jest bycie znacznie mądrzejszym niż ten użytkownik. Sprytny użytkownik nie pozwoli się pokazać w utmp ani znaleźć czegoś tak trywialnego jak who(1)lub w(1). Jedynym niezawodnym sposobem na pozbycie się wszelkich potencjalnych rootkitów, które mogą być zainstalowane, jest całkowite wyczyszczenie i ponowna instalacja systemu.
jw013

Odpowiedzi:

139

Jest prawdopodobnie łatwiejszy sposób, ale robię to:

  1. Sprawdź, kto jest zalogowany na twoim komputerze - użyj wholub w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Sprawdź identyfikator procesu powłoki, do której jest podłączony TTY:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Śmiej się z ich zbliżającego się rozłączenia (ten krok jest opcjonalny, ale zachęcany)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Zabij odpowiedni proces:

    > kill -9 30737
    

Właśnie odkryłem można łączyć kroki 1 i 2, dając whow -ubanderą; PID to liczba po prawej stronie:

> who -u
mmrozek  tty1         Aug 17 10:03 09:01        9250
mmrozek  pts/18       Aug 17 10:09 01:46       19467 (:pts/2:S.0)
Michał Mrożek
źródło
61
+1 za „Śmiej się z ich zbliżającego się rozłączenia (ten krok jest opcjonalny, ale zachęcany)”
Josh
9
kill -9co? Naprawdę jesteś w trybie BOFH na tym.
Jander
12
@Jander Wykopujesz użytkownika z systemu; jak miły musisz być?
Michael Mrozek
6
Zwykle powiedziałbym, że nie zachęcaj ludzi do nadużyćkill -9 i zacznij od łagodniejszych sygnałów , ale przypuszczam, że w tym kontekście nie ma to większego znaczenia. Po prostu zostawiam komentarz na wypadek, gdyby ludzie przegapili dowcip.
jw013
5
Istnieje również zabójstwo, które w zasadzie automatyzuje cały proces (nawet wyśmiewa twoją ofiarę, jeśli włączysz tryb tyłka)
Ulrich Dangel
32

Jak już wskazał Micheal, możesz whodowiedzieć się, kto jest zalogowany. Jeśli jednak ma wiele procesów, istnieje wygodniejszy sposób niż zabijanie każdego procesu osobno: możesz użyć killall -u usernamedo zabicia wszystkich procesów przez tego użytkownika.

sepp2k
źródło
+1. Używanie killallbędzie również nieco bardziej odpowiednie w środowiskach graficznych, ponieważ do zabicia jest coś więcej niż tylko powłoka.
John WH Smith,
3
OSTRZEŻENIE: Jeśli użyjesz tego dla użytkownika root, zabijesz wszystkie procesy roota i będziesz musiał fizycznie zrestartować serwer.
Kunok,
@Kunok, pod jaką situtation chciałbyś wykopać użytkownika root z komputera? Na przykład, jeśli to konto zostało przejęte lub coś takiego?
Alexej Magura
23

Nekromancja!

Doceniam humor przyjętej odpowiedzi, ale profesjonalnie nie mogę jej popierać.

Najbardziej wdzięczną metodą, jaką znam, jest wysłanie -HUP do powłoki w celu symulacji zawieszenia użytkownika. Możesz wysłać to do bezczynnego sshd użytkownika, aby zasymulować utratę połączenia, co wyzwala czyszczenie całego środowiska powłoki (w tym powłok potomnych), lub wysłać do określonych zagnieżdżonych powłok (powiedzmy, tych ustawionych wewnątrz odłączonego multipleksera terminali, który powstrzymują Cię przed odmontowaniem systemu plików), jeśli chcesz być bardzo precyzyjny.

Korzystanie writez wysyłania wiadomości do terminali bezczynnie przed uruchomieniem komputera to jednak fajne hobby.

Andrew B.
źródło
1
Podczas gdy pseudo-wszechmocne uczucie towarzyszące zabiciu -9 jest zabawne, ta sugestia jest prawdopodobnie lepsza. Głos w górę ode mnie.
Andrew Falanga,
4
Aby jednoznacznie odpowiedzieć na to pytanie, zrobiłem: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(sen daje użytkownikowi możliwość zapisania i wylogowania, ale prawdopodobnie używasz tego tylko dla użytkownika, który i tak zapomniał się wylogować)
wkschwartz
13

Wyloguj użytkownika „nazwa użytkownika”:

skill -KILL -u username

Widzieć man skill

bsd
źródło
3
Myślę, że to zabije wszystkie procesy tego użytkownika, nie tylko jego powłokę, ale jeśli tego właśnie chcesz, jest to zdecydowanie prostsze
Michael Mrozek
Naprawdę nie widzę tego działającego na RHEL7
antivirtel,
11

Inne przydatne polecenie jest pkilltutaj pkill -u username && pkill -9 -u username. killallmają tę wadę, że w Solaris IIRC oznacza to coś zupełnie innego - pkillmają też nieco bardziej zaawansowane opcje.

Maciej Piechotka
źródło
8
W systemie Solaris „killall” jest używany przez skrypty zamykające do zabicia (prawie) wszystkich procesów na serwerze. „Robi to, co mówi na puszce”.
dr-jan
Ludzie, dlaczego tak bardzo lubicie SIGKILL? Uruchamianie programów i aplikacji nawet nie będzie miało szansy na zapisanie danych i odrobinę oczyszczenia. SIGTERM (jak jest używany podczas zamykania systemu) lub SIGHUP zrobi to samo i jest o wiele bardziej wdzięczny. (Nadal możesz wysłać SIGKILL po upływie okresu karencji.)
tryb przeciwny
3

Przede wszystkim oznacza to większy problem. Jeśli masz użytkowników, którym nie ufasz w systemie, prawdopodobnie powinieneś go wyrównać i ponownie zobrazować.

Mając to na uwadze, możesz wykonać niektóre lub wszystkie z następujących czynności:

# skonfigurować środowisko
$ BADUSER = foo # gdzie foo to nazwa użytkownika, o której mowa
$ USERLINE = $ (grep '^ $ {BADUSER}:' / etc / passwd)
$ BADUID = $ (echo $ {USERLINE} | awk -F: '{print 3 $}')
$ BADGID = $ (echo $ {USERLINE} | awk -F: '{print 4 $}')
$ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F: '{print 6 $}')
$ BDIR = "~ / backup / home-backup /"
$ TSTAMP = $ (data +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# wyłącz przyszłe logowanie użytkownika
$ sudo chsh -s / bin / false "$ {BADUSER}"

# zabij wszystkie procesy użytkownika
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print 2 USD})
$ sudo kill -9 $ {BADPROCS}

# wykonaj kopię zapasową / wyczyść katalog domowy użytkownika
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# znajdź wszystkie pliki należące do użytkownika
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# usuń użytkownika
$ sudo userdel $ {BADUSER}
cjac
źródło
Nie wiem, czy zgodziłbym się z „level it reimage”, to jest Unix, a nie Windows… Naprawdę nie mam tego problemu… Po prostu pytałem.
ksenoterrakid,
3
Co więcej, tylko dlatego, że musisz wykopać użytkownika, niekoniecznie oznacza, że ​​jest niewiarygodny. Może po prostu zapomnieli się wylogować.
David Z
xenoterracide: Może jestem po prostu ochroną systemów, które utrzymuję, ale gdybym miał użytkownika, którego czułem, że musiałbym zostać siłą usunięty z systemu pod moją kontrolą, musiałoby się wydarzyć coś poważnego.
cjac
-1 do wczytywania pytań, które nie są logicznie logiczne i przeciągania pytania poza temat.
Wesley,
you have users that you don't trust on your system... Lub może być tak, że zabijasz jednego jako wiadomość dla innych. W końcu, czy wyznanie sysadmina nie brzmi „Lepiej się bać niż być kochanym”? Pomijając wszystkie dowcipy, Machiavelli powinien napisać książkę O'Reilly.
Parthian Shot
0

Rozejrzałem się dookoła i nie znalazłem ani jednego skryptu automatyzującego to zadanie.

Tak więc, w oparciu o zaproponowane tutaj rozwiązania, zmiksowałem wszystko w interaktywnym skrypcie Bash, który zawiera listę użytkowników i sesji, z who -uktórych użytkownik może wybrać, co ma robić.

Następnie możesz:

  • zabij wszystkie sesje dla użytkownika killall -u <username> -HUP
  • zabij określoną sesję kill <PID>

Wszystkie wymagane informacje pochodzą z, who -ua następnie są analizowane przy użyciu mapfilei awk.

Dodam możliwość wysłania wiadomości za pomocą writepóźniej (rozwiązywanie procesu z opóźnieniem).

Prawdopodobnie dodam również opcję zabicia określonej sesji kill -9. Ale nie miałem problemów z sprawiedliwymi killi jak wskazali inni, kill -9należy unikać, jeśli to możliwe.

Możesz sprawdzić kod na github, jeśli chcesz go wypróbować lub dowiedzieć się więcej o tym, jak to robię w sposób zautomatyzowany:

Gus Neves
źródło
0

Jak więc wyrzucić [łagodnych] użytkowników ze swojego Linux-a?

Ostatecznie sprowadza się to do identyfikacji i zakończenia procesów, które są własnością, są powiązane lub odradzają się na podstawie identyfikatora użytkownika. Jakiekolwiek polecenia użyjesz do osiągnięcia tego celu, niekoniecznie ma to znaczenie, dopóki tam dotrzesz.

Zasadniczo dwie odpowiedzi ...

Opcja A: spowodowanie wylogowania wspomnianego użytkownika, dla którego zawsze i bez względu na liczbę loginów. Oznaczałoby to więc identyfikację procesów, które są własnością użytkownika, identyfikowalne przez użytkownika i sklasyfikowane jako część procesu logowania dla danej dystrybucji Linuksa, którą prowadzisz. Zdaj sobie sprawę, że istnieją procesy nadrzędne, takie jak SSH lub VNC przed „logowaniem”, a procesy podrzędne, takie jak GDM po „logowaniu”. Zwykle zabicie procesu nadrzędnego zabije proces podrzędny, ale nie zawsze. Więc chcesz zabić te inne procesy, które oczywiście nie są już potrzebne po wylogowaniu. Robiąc to wszystko, utrzymałoby to działanie zadań w tle ... ponieważ jest to łagodny użytkownik i może po prostu chcesz je wylogować. O ile wiem /usr/bin/wi /usr/bin/whopoinformuję, kto przeszedł przez proces logowania.

opcja B: całkowite zakończenie wszystkich procesów należących do określonego identyfikatora użytkownika, co oznaczałoby po prostu zabicie wszystkich procesów należących do tego użytkownika, to również wylogowałoby je, jeśli są zalogowane. Spowodowałoby to usunięcie ich z systemu . To musi być tylko proste, ps -ef | grep <uid>a następnie zakończenie wszystkich tych procesów w dowolny możliwy sposób.

fwiw w SLES 11 zgłasza

umiejętność człowieka ... Te narzędzia są prawdopodobnie przestarzałe i nieprzenośne. Składnia polecenia jest źle zdefiniowana. Zamiast tego rozważ użycie poleceń killall, pkill i pgrep.

kill -9 FTW!

Ron
źródło
-1

Moim zdaniem nie jest zbyt użyteczny, killall -u usernameponieważ jeśli jest to ten sam użytkownik co Ty, zaczniesz się. Tak więc killproces będzie lepszym rozwiązaniem.

Mailo
źródło
także jeśli są procesy uruchamiane przez tego użytkownika, być może SSHD nigdy nie wejdzie na serwer, spowoduje zamknięcie SSH.
Mailo
3
Dlaczego , u licha, demon SSH (lub jakikolwiek demon) miałby działać przy użyciu poświadczeń użytkownika, który musi zostać przymusowo wylogowany z systemu z jakiegokolwiek realistycznego powodu? Ponadto, co dodaje ta odpowiedź, której nie obejmuje odpowiedź Michała Mrożka lub odpowiedź Andrew B. (i ewentualnie innych)?
CVn
-2

To polecenie działało świetnie dla GUI, mój „znaczący” odmawia wylogowania się z ...

leaves@me:/# skill -HUP -u username
  • Nie wiem co się stało.
  • Musiała być aktualizacja.
  • „Google” znów spadło.
  • To był wirus na InterWebs.

Niektóre urozmaicenia, jeśli będziesz ich potrzebować.

JaInI
źródło
1
Jest to już wspomniane w odpowiedzi bsd.
Stephen Kitt