Як вигнати доброзичливого користувача зі своєї системи?


66

Я трохи гуляв це назад і помітив пару способів, але я здогадуюсь, що Google знає не все. Тож як ви відштовхуєте користувачів від вашого вікна Linux? також як ви хочете бачити, як вони ввійшли в першу чергу? і пов'язане ... чи працює ваш метод, якщо користувач увійшов до X11 DE (не вимога, яку мені просто цікаво)?


3
Питання змінено, щоб відобразити припущення, дані прийнятою відповіддю. В умовах порушення безпеки єдиний спосіб вигнати зловмисного користувача зі своєї системи - бути набагато розумнішим за цього користувача. Розумний користувач не збирається дозволяти себе показувати utmp або знаходити щось настільки тривіальне, як who(1)або w(1). Єдиний нерозумний спосіб позбутися від будь-яких потенційних руткітів, які можуть бути встановлені, - це повністю стерти та перевстановити систему.
jw013

Відповіді:


139

Мабуть, є простіший спосіб, але я роблю це:

  1. Подивіться, хто ввійшов у вашу машину - використовуйте whoабо w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Знайдіть ідентифікатор процесу оболонки, до якого підключено TTY:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Смійтеся над їхнім майбутнім відключенням (цей крок не є обов'язковим, але рекомендується)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Вбийте відповідний процес:

    > kill -9 30737
    

Я тільки що виявив , ви можете об'єднати кроки 1 і 2, даючи whoна -uпрапор; PID - це число, відключене праворуч:

> 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)

61
+1 за "Смійтеся над їхнім майбутнім відключенням (цей крок не є обов'язковим, але рекомендується)"
Джош

9
kill -9, так? Ви справді перебуваєте в режимі BOFH на цьому.
Джандер

12
@Jander Ви виганяєте користувача із системи; як приємно вам бути?
Майкл Мрозек

6
Як правило, я б сказав, що не спонукайте людей до зловживаньkill -9 , а починайте натомість із ніжнішими сигналами , але я вважаю, що в цьому контексті це не так важливо. Я просто залишаю коментар у випадку, якщо люди пропустять жарт.
jw013

5
Існує також забій, який в основному автоматизує весь процес (навіть висміюючи свою жертву, якщо увімкнути інший режим)
Ульріх Дангел,

32

Як уже зазначав Micheal, ви можете whoдізнатися, хто ввійшов у систему. Однак якщо у них кілька процесів, є більш зручний спосіб, ніж вбивати кожен процес окремо: ви можете використовувати killall -u usernameдля вбивства всіх процесів цим користувачем.


+1. Використання killallтакож буде трохи доречнішим у графічних середовищах, оскільки для вбивства є більше, ніж просто оболонка.
Джон У. Сміт

3
ПОПЕРЕДЖЕННЯ: Якщо ви використовуєте це для користувача root, ви знищите всі кореневі процеси, і вам доведеться фізично перезапустити сервер.
Кунок

@Kunok, за якої ситуації ви б хотіли вигнати кореневого користувача з машини? На кшталт, якщо цей обліковий запис викрали чи щось?
Олексій Магура

23

Некромантизм!

Я ціную гумор прийнятої відповіді, але професійно не можу її відстоювати.

Найбільш витончений метод, про який я знаю, - це надіслати -HUP в оболонку, щоб імітувати користувальницьку роботу. Ви можете надіслати це на неправданий sshd користувача, щоб імітувати втрату їх зв'язку, що запускає очищення всього середовища оболонки (включаючи дочірні оболонки), або надіслати це конкретним вкладеним оболонкам (скажімо, тим, які встановлюються всередині відключеного термінального мультиплексора, який утримує вас від демонтажу файлової системи), якщо ви хочете бути дуже точними.

writeХоча використання для надсилання повідомлень кінцево непрацюючим ptys перед тим, як завантажувати їх, є захоплюючим захопленням.


1
Хоча псевдомогульне почуття, яке супроводжує вбивство -9, є цікавим, але ця пропозиція, мабуть, краща. Підвищення голосу від мене.
Ендрю Фаланга

4
Щоб зробити цю відповідь явною, те, що я зробив: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(сон дає користувачеві можливість зберігати та виходити з системи, але ви, мабуть, використовуєте це лише тому користувачеві, який забув все-таки вийти із системи)
wkschwartz

13

Вийдіть із "ім'я користувача" користувача:

skill -KILL -u username

Побачити man skill


3
Я думаю, це знищить усі процеси цього користувача, а не лише їх оболонку, але якщо ви цього хочете, то це, безумовно, простіше
Michael Mrozek

Я не бачу, щоб це працювало на RHEL7
антивірусі

11

Інша корисна команда pkillтут pkill -u username && pkill -9 -u username. killallє недоліком того, що для Solaris IIRC це означає щось зовсім інше - також pkillмають трохи більш досконалі варіанти.


8
У Solaris 'killall' використовується сценаріями відключення, щоб знищити (майже) всі процеси на сервері. "Це робить те, що написано на жерсті".
др-ян

Люди, чому ви так любите SIGKILL? Запущені програми та програми навіть не матимуть шансів зберегти дані та трохи очистити. SIGTERM (як використовується при відключенні) або SIGHUP також зробить це і є набагато витонченішим. (Ви все одно можете відправити SIGKILL після закінчення пільгового періоду.)
контрмод

3

Перш за все, це свідчить про більшу проблему. Якщо у вас є користувачі, яким ви не довіряєте вашій системі, ви, ймовірно, повинні вирівняти її та переглянути зображення.

Зважаючи на це, ви можете виконати деякі чи всі наступні дії:

# створити середовище
$ BADUSER = foo #, де foo - це ім'я користувача, про яке йдеться
$ USERLINE = $ (grep '^ $ {BADUSER}:' / тощо / passwd)
$ BADUID = $ (відлуння $ {USERLINE} | awk -F: '{print $ 3}')
$ BADGID = $ (відлуння $ {USERLINE} | awk -F: '{print $ 4}')
$ BADHOMEDIR = $ (відлуння $ {USERLINE} | awk -F: '{print $ 6}')
$ BDIR = "~ / резервне копіювання / домашнє резервне копіювання /"
$ TSTAMP = $ (дата +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -файли - $ {TSTAMP} .txt"

# вимкнути майбутнє вхід користувача
$ sudo chsh -s / bin / false "$ {BADUSER}"

# знищити всі процеси користувача
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# створити резервну копію / очистити домашній каталог користувача
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# знайти всі файли, що належать користувачеві
$ sudo find / -user $ {BADUSER}> ~ / резервне копіювання / $ {OWNED_FILENAME}

# видалити користувача
$ sudo userdel $ {BADUSER}

Я не знаю, що я погодився би з "рівнем реіміграції", це Unix, а не Windows ... У мене справді немає цієї проблеми ... Я просто запитував.
ксенотеррацид

3
Плюс, лише тому, що потрібно відштовхувати користувача, не обов'язково означає, що вони недостовірні. Можливо, вони просто забули вийти.
David Z

xenoterracide: Можливо, я просто захищаю ті системи, які я підтримую, але якби у мене був користувач, якого я відчував, що він повинен бути примусово видалений із системи, що знаходиться під моїм контролем, мало б статися щось серйозне.
cjac

-1 для читання речей у запитання, які логічно не випливають та перетягування Q / A поза темою.
Веслі

you have users that you don't trust on your system... Або може бути просто те, що ти вбиваєш одного, як повідомлення іншим. Зрештою, чи не є віросповідання сисадміна «Ліпше боятися, ніж кохати»? Усі жарти вбік Макіавеллі повинен написати книгу О'Рейлі.
Парфянський розстріл

0

Я оглянув усе навколо і не зміг знайти жодного сценарію для автоматизації цього завдання.

Отже, на основі запропонованих тут рішень я змішав все в інтерактивному сценарії Bash, в якому перераховані користувачі та сеанси, who -uщоб користувач міг вибрати, що робити.

Потім ви можете:

  • знищити всі сеанси для користувача killall -u <username> -HUP
  • вбити конкретний сеанс kill <PID>

Вся необхідна інформація надходить who -uі аналізується за допомогою mapfileта awk.

Я додам можливість відправити повідомлення, використовуючи writeпізніше (розгортаючи процес із запізненням).

Я, мабуть, додаю можливість також вбити конкретний сеанс kill -9. Але я не мав жодних проблем із справедливим killі, як вказували інші, kill -9слід уникати, якщо можливо.

Ви можете перевірити код на github, якщо хочете спробувати його чи дізнатися більше про те, як я це роблю в автоматизованому вигляді:


0

Тож як ви відштовхуєте [доброякісних] користувачів зі своєї вікна Linux?

Зрештою, це зводиться до ідентифікації та припинення тих процесів, які належать, асоціюються або породжуються з ідентифікатора користувача. Якими б командами ви не користувалися, щоб досягти цієї мети, не обов'язково має значення, поки ви туди потрапите.

В основному дві відповіді ...

Варіант A: виведення журналу із зазначеного користувача, для якого коли-небудь і скільки б логін у них не було. Отже, це означатиме визначення тих процесів, які належать користувачеві, відслідковуються за допомогою uid та класифікуються як частина певного процесу входу для даного дистрибутива Linux, який ви виконуєте. Зрозумійте, що існують батьківські процеси, такі як SSH або VNC до "входу", і дочірні процеси, такі як GDM після "входу". Зазвичай убивство батьківського процесу вбиває дочірній процес, але не завжди. Тож ви хочете вбити ці інші процеси, які, очевидно, більше не потрібні після виходу з системи. Виконуючи все це, це дозволило б забезпечити роботу фонових завдань ... тому що це доброякісний користувач і, можливо, ви просто хочете їх вийти. Наскільки я знаю, /usr/bin/wі /usr/bin/whoповідомлятиму, хто пройшов через процес входу.

варіант В: повністю припинити всі процеси, що належать певному uid, що просто означатиме вбивство будь-яких процесів, що належать вказаному користувачеві, це також виходитиме з них, якщо вони входили в систему . Це повинно бути просто, ps -ef | grep <uid>а потім закінчити всі ці процеси будь-яким чином прийнятним чином.

fwiw в СЛЕС 11, про який він повідомляє

вміння людини ... Ці інструменти, мабуть, застарілі та непредставні. Синтаксис команд погано визначений. Спробуйте скористатися командами killall, pkill і pgrep.

kill -9 FTW!


-1

На мою думку, це не дуже корисно використовувати, killall -u usernameтому що якщо це той самий користувач, як і ви, ви відмовитеся. Тож killпроцес стане кращим рішенням.


також, якщо є такі процеси, якими керує цей користувач, можливо, SSHD ви ніколи не прийдете в Сервер, викликають відключення SSH.
Майло

3
Чому на Землі демона SSH (або будь-якого демона) працює з використанням облікових даних користувача, якого потрібно примусово вийти з системи з будь-якої реалістичної причини? Крім того , що робить цей відповідь додати , що не охоплюється відповідь Майкла Mrozek в або відповідь Ендрю Б (і , можливо , інші)?
CVn

-2

Ця команда чудово спрацювала для GUI, мої "значні" відмовляються виходити з ...

leaves@me:/# skill -HUP -u username
  • Я не знаю, що сталося.
  • Має бути, було оновлено.
  • "Google" знову знизився.
  • Це був вірус в Інтернеті.

Деякі відхилення на випадок, якщо вони вам потрібні.


1
Про це вже йдеться у відповіді bsd.
Стівен Кітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.