Bagaimana Anda menendang pengguna jinak dari sistem Anda?

66

Saya sudah googling ini beberapa waktu lalu dan memperhatikan beberapa cara, tapi saya kira google tidak tahu semuanya. Jadi, bagaimana Anda menendang pengguna dari kotak Linux Anda? juga bagaimana Anda bisa melihat mereka masuk di tempat pertama? dan terkait ... apakah metode Anda berfungsi jika pengguna masuk ke X11 DE (bukan persyaratan yang saya hanya ingin tahu)?

xenoterracide
sumber
3
Mengubah pertanyaan untuk mencerminkan asumsi yang diberikan jawaban yang diterima. Dalam konteks pelanggaran keamanan, satu-satunya cara untuk menendang pengguna jahat dari sistem Anda adalah menjadi lebih pintar dari pengguna itu. Seorang pengguna yang cerdas tidak akan membiarkan diri mereka muncul di utmp atau ditemukan oleh sesuatu yang sepele who(1)atau w(1). Satu-satunya cara yang sangat mudah untuk menyingkirkan rootkit potensial yang mungkin diinstal adalah dengan sepenuhnya menghapus dan menginstal ulang sistem.
jw013

Jawaban:

140

Mungkin ada cara yang lebih mudah, tetapi saya melakukan ini:

  1. Lihat siapa yang masuk ke mesin Anda - gunakan whoatau w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Cari ID proses dari shell yang terhubung dengan TTY mereka:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Tertawalah pada pemutusan yang akan datang mereka (langkah ini opsional, tetapi dianjurkan)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Bunuh proses yang sesuai:

    > kill -9 30737
    

Saya baru saja menemukan Anda dapat menggabungkan langkah-langkah 1 dan 2 dengan memberikan whopara -ubendera; PID adalah angka ke kanan:

> 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)
Michael Mrozek
sumber
61
+1 untuk "Tertawalah pada pemutusan yang akan datang mereka (langkah ini adalah opsional, tetapi dianjurkan)"
Josh
9
kill -9ya Anda benar-benar dalam mode BOFH yang satu ini.
Jander
12
@ Jander Anda menendang pengguna dari sistem; seberapa baik Anda perlu?
Michael Mrozek
6
Biasanya, saya katakan jangan mendorong orang untuk menyalahgunakankill -9 , dan mulai dengan sinyal yang lebih lembut , tapi saya kira dalam konteks ini tidak terlalu penting. Saya hanya meninggalkan komentar kalau-kalau orang ketinggalan lelucon.
jw013
5
Ada juga pembunuhan yang pada dasarnya mengotomatiskan seluruh proses (bahkan mengolok-olok korban Anda jika Anda mengaktifkan mode butthead)
Ulrich Dangel
32

Seperti yang telah ditunjukkan oleh Micheal, Anda dapat menggunakan whountuk mengetahui siapa yang masuk. Namun jika mereka memiliki beberapa proses, ada cara yang lebih nyaman daripada membunuh setiap proses secara terpisah: Anda dapat menggunakan killall -u usernameuntuk membunuh semua proses oleh pengguna itu.

sepp2k
sumber
+1. Menggunakan killalljuga akan sedikit lebih tepat di lingkungan grafis, karena ada lebih dari sekedar shell untuk membunuh.
John WH Smith
3
PERINGATAN: Jika Anda menggunakan ini untuk pengguna root, Anda akan membunuh semua proses root dan Anda harus me-restart server secara fisik.
Kunok
1
@ Kunok di bawah situasi apa yang Anda inginkan menendang pengguna root dari mesin? Seperti apakah akun itu dibajak atau apa?
Alexej Magura
23

Penujuman!

Saya menghargai humor dari jawaban yang diterima, tetapi secara profesional saya tidak bisa mendukungnya.

Metode paling anggun yang saya ketahui adalah mengirim -HUP ke shell untuk mensimulasikan hangup pengguna. Anda dapat mengirim ini ke sshd idle pengguna untuk mensimulasikan koneksi mereka terputus, yang memicu pembersihan seluruh lingkungan shell (termasuk cangkang anak), atau mengirim ini ke cangkang bersarang tertentu (misalnya, yang mengatur di dalam terminal multiplexer yang terputus yang menjaga Anda dari unmount sistem file) jika Anda ingin benar-benar tepat.

Menggunakan writeuntuk mengirim pesan ke terminal idle sebelum Anda mem-bootnya adalah hobi yang menyenangkan.

Andrew B
sumber
1
Sementara perasaan pseudo-mahakuasa yang menyertai kill -9 itu menyenangkan, saran ini mungkin lebih baik. Suara dari saya.
Andrew Falanga
4
Untuk membuat jawaban ini eksplisit, apa yang saya lakukan adalah: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(tidur memberikan pengguna kesempatan untuk menyimpan dan logout, tetapi Anda mungkin hanya menggunakan ini pada pengguna yang lupa logout)
wkschwartz
13

Logout 'username' pengguna:

skill -KILL -u username

Lihat man skill

bsd
sumber
3
Saya pikir itu akan membunuh semua proses oleh pengguna itu, bukan hanya shell mereka, tetapi jika itu yang Anda inginkan maka ini jelas lebih mudah
Michael Mrozek
Saya tidak benar-benar melihat ini bekerja pada RHEL7
antivirtel
11

Perintah lain yang bermanfaat ada di pkillsini pkill -u username && pkill -9 -u username. killallmemiliki kelemahan bahwa pada Solaris IIRC itu berarti sesuatu yang sama sekali berbeda - juga pkillmemiliki opsi yang sedikit lebih maju.

Maciej Piechotka
sumber
8
Pada Solaris 'killall' digunakan oleh skrip shutdown untuk mematikan (hampir) semua proses di server. "Itu melakukan apa yang tertulis di kaleng."
dr-januari
Teman-teman, mengapa Anda begitu suka SIGKILL? Menjalankan program dan aplikasi bahkan tidak akan memiliki kesempatan untuk menyimpan data dan membersihkan sedikit. SIGTERM (seperti yang digunakan pada saat shutdown) atau SIGHUP akan melakukannya juga dan jauh lebih anggun. (Anda masih dapat mengirim SIGKILL setelah berakhirnya masa tenggang.)
countermode
3

Pertama-tama, ini menunjukkan masalah yang lebih besar. Jika Anda memiliki pengguna yang tidak Anda percayai pada sistem Anda, Anda mungkin harus naik level dan gambar ulang.

Dengan mengingat hal itu, Anda dapat melakukan beberapa atau semua hal berikut ini:

# mengatur lingkungan
$ BADUSER = foo # di mana foo adalah nama pengguna yang dipermasalahkan
$ 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 = $ (tanggal +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# Nonaktifkan login masa depan pengguna
$ sudo chsh -s / bin / false "$ {BADUSER}"

# bunuh semua proses pengguna
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# buat cadangan / bersihkan direktori home pengguna
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# temukan semua file yang dimiliki oleh pengguna
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# hapus pengguna
$ sudo userdel $ {BADUSER}
cjac
sumber
Saya tidak tahu bahwa saya akan setuju dengan "level it reimage" ini adalah unix bukan windows ... Saya tidak benar-benar memiliki masalah ini ... Saya hanya bertanya.
xenoterracide
3
Plus, hanya karena Anda harus menendang pengguna tidak selalu berarti mereka tidak dapat dipercaya. Mungkin mereka hanya lupa untuk logout.
David Z
xenoterracide: Mungkin saya hanya melindungi sistem yang saya kelola, tetapi jika saya memiliki pengguna yang saya rasa perlu dihapus secara paksa dari suatu sistem di bawah kendali saya, sesuatu yang serius harus terjadi.
cjac
-1 untuk membaca hal-hal ke dalam pertanyaan yang tidak secara logis mengikuti dan menyeret Q / A di luar topik.
Wesley
you have users that you don't trust on your system... Atau mungkin saja Anda membunuh satu sebagai pesan kepada yang lain. Lagi pula, bukankah kepercayaan sysadmin itu bukanlah "Lebih baik ditakuti daripada dicintai"? Selain semua lelucon, Machiavelli harus menulis buku O'Reilly.
Parthian Shot
0

Saya melihat sekeliling dan tidak dapat menemukan satu skrip pun untuk mengotomatiskan tugas ini.

Jadi, berdasarkan solusi yang diusulkan di sini, saya mencampur semuanya dalam skrip Bash interaktif yang mencantumkan pengguna dan sesi dari who -upengguna untuk memilih apa yang harus dilakukan.

Anda kemudian dapat:

  • bunuh semua sesi untuk pengguna killall -u <username> -HUP
  • bunuh sesi tertentu kill <PID>

Semua informasi yang diperlukan berasal who -udan kemudian diuraikan menggunakan mapfiledan awk.

Saya akan menambahkan kemungkinan untuk mengirim pesan menggunakan writenanti (forking proses dengan penundaan).

Saya mungkin akan menambahkan opsi untuk membunuh sesi tertentu kill -9juga. Tapi saya tidak punya masalah dengan adil killdan seperti yang ditunjukkan oleh orang lain, kill -9harus dihindari jika memungkinkan.

Anda dapat memeriksa kode di github jika Anda ingin mencobanya atau mempelajari lebih lanjut tentang bagaimana saya melakukannya dengan cara otomatis:

Gus Neves
sumber
0

Jadi bagaimana Anda menendang [jinak] pengguna dari kotak Linux Anda?

Pada akhirnya, hal itu berujung pada pengidentifikasian dan penghentian proses-proses yang dimiliki, dikaitkan, atau muncul dari id pengguna. Apa pun perintah yang Anda gunakan untuk mencapai tujuan akhir itu tidak masalah selama Anda sampai di sana.

Pada dasarnya dua jawaban ...

Opsi A: menyebabkan keluar dari kata pengguna, yang pernah dan bagaimanapun banyak login mereka miliki. Jadi ini berarti mengidentifikasi proses-proses yang dimiliki oleh pengguna, dapat dilacak oleh uid, dan diklasifikasikan sebagai bagian dari beberapa proses login untuk distro linux yang Anda jalankan. Sadarilah ada proses induk seperti SSH atau VNC sebelum "masuk" dan proses anak seperti GDM setelah "masuk" Biasanya membunuh proses induk akan membunuh proses anak, tetapi tidak selalu. Jadi, Anda ingin membunuh proses lain yang jelas tidak lagi diperlukan setelah logout. Dalam melakukan semua ini, ini akan membuat pekerjaan latar belakang tetap berjalan ... karena itu adalah pengguna yang ramah dan mungkin Anda hanya ingin keluar. Sejauh yang saya tahu, /usr/bin/wdan /usr/bin/whoakan melaporkan siapa yang telah melewati proses login.

opsi B: akhiri semua proses yang dimiliki oleh uid tertentu sepenuhnya, yang berarti membunuh setiap dan semua proses yang dimiliki oleh pengguna tersebut, ini juga akan mengeluarkan mereka jika mereka login. Ini akan memuaskan tendangan mereka dari sistem . Itu hanya perlu sederhana ps -ef | grep <uid>dan kemudian mengakhiri semua proses dengan cara apa pun yang dapat diterima.

fwiw di SLES 11 melaporkannya

man skill ... Alat-alat ini mungkin sudah usang dan tidak dapat diport. Sintaks perintah tidak didefinisikan dengan baik. Pertimbangkan untuk menggunakan perintah killall, pkill, dan pgrep sebagai gantinya.

kill -9 FTW!

ron
sumber
-1

Menurut pendapat saya, itu tidak benar-benar berguna untuk digunakan killall -u usernamekarena jika itu adalah pengguna yang sama dengan Anda, Anda akan menendang diri sendiri. Jadi killprosesnya akan menjadi solusi yang lebih baik.

Mailo
sumber
juga jika ada proses yang dijalankan oleh pengguna itu, mungkin SSHD Anda tidak akan pernah masuk ke Server, menyebabkan SSH shutdown.
Mailo
3
Mengapa di bumi SSH daemon (atau daemon apa saja ) dijalankan menggunakan kredensial pengguna yang perlu secara paksa keluar dari sistem untuk alasan realistis apa pun? Juga, apa yang ditambahkan oleh jawaban ini yang tidak dicakup oleh jawaban Michael Mrozek atau jawaban Andrew B (dan mungkin juga yang lain)?
CVn
-2

Perintah ini bekerja sangat baik untuk GUI saya "signifikan" menolak untuk keluar dari ...

leaves@me:/# skill -HUP -u username
  • Saya tidak tahu apa yang terjadi.
  • Pasti ada pembaruan.
  • "Google" turun lagi.
  • Itu adalah virus di InterWebs.

Beberapa pengalihan jika Anda membutuhkannya.

JaInI
sumber
1
Ini sudah disebutkan dalam jawaban bsd.
Stephen Kitt