Bagaimana cara membunuh proses yang dimulai dengan pengguna yang berbeda tanpa menjadi root atau sudoer?

20

di lingkungan Linux, saya harus mematikan proses yang telah dimulai oleh user2 jika saya pengguna1 tanpa sudoers atau menggunakan root. Apakah Anda tahu jika ada cara mengaturnya saat meluncurkan proses? Seperti daftar pengguna yang diizinkan membunuh prosesnya?

Faktanya adalah bahwa contoh bersamaan dari proses yang sama dapat dimulai dari pengguna yang berbeda, itu sebabnya tidak nyaman bagi saya untuk mengatur id grup ke proses. Pengguna lain yang tidak ada dalam grup tidak akan dapat memulai proses paralel kedua.

Apa yang saya miliki adalah daftar pengguna yang diizinkan untuk memulai proses, didefinisikan dalam database, sebelum memulai proses saya memeriksa bahwa pengguna saat ini dalam daftar dan, jika ya, saya memulai proses dengan pengguna saat ini. Jika pengguna kedua diizinkan melakukan itu ingin mematikan proses saya ingin itu diizinkan untuk melakukan itu tetapi saya tidak ingin itu menjadi sudoers.

Oleh karena itu, saya berpikir untuk membuat proses yang berjalan sebagai root yang menerima permintaan untuk membunuh proses dari pengguna, memeriksa apakah pengguna diizinkan untuk memulai / menghentikan proses dan membunuh proses.

Apakah Anda pikir itu bisa menjadi solusi terbaik?

slhck
sumber
Selamat datang di SO. Saya rasa ini tidak mungkin ... Bagaimanapun, ini lebih cocok untuk situs saudara SO, serverfault.com. Mungkin akan segera dimigrasi ke sana, tidak perlu melakukan apa pun.
Pekka mendukung GoFundMonica
Program apa yang sedang kita bicarakan? Akan sulit dalam kasus umum, tetapi dalam beberapa kasus (seperti apache atau aplikasi yang dapat Anda modifikasi sendiri) akan lebih mudah.
Kim

Jawaban:

14

Maaf, tapi ini tidak mungkin (itu karena desain). Namun, jika anggota grup umum, user1 dapat menulis ke file yang diperiksa proses user2, yang menunjukkan proses yang harus diakhiri.

Atau, user2 dapat menjalankan sesuatu di latar belakang yang memeriksa file, kemudian mengirimkan sinyal yang sesuai. User1 kemudian hanya perlu menulis ke file itu. Ini mungkin lebih mudah, karena tidak memerlukan modifikasi program pengguna2.

Secara konvensional, tidak, user1 tidak dapat mengirim sinyal POSIX ke proses user2.

Pos Tim
sumber
Terima kasih atas jawaban anda. Dalam kasus saya, memang, saya tidak menggunakan file tetapi kami menggunakan sistem ( dim.web.cern.ch/dim ) yang dapat mengirim sinyal yang sesuai, maka proses dapat disebut yang memeriksa bahwa pengguna diizinkan untuk hentikan prosesnya dan bunuh prosesnya.
@ATelesca - Saya menggunakan sesuatu yang sangat mirip untuk memungkinkan pengguna yang kurang mampu untuk mengontrol / memulai / menghentikan mesin virtual Xen di pertanian yang agak besar. Pada dasarnya, hal yang sama.
Tim Post
9

Kecuali ACL atau SELinux atau yang lain memiliki cara yang lebih baik untuk melakukannya, cara saya melihat ini dilakukan adalah dengan skrip SetUID . Seperti yang dapat Anda bayangkan, mereka terkenal karena risiko keamanan.

Mengenai kasus Anda, katakan bahwa procOwner adalah nama pengguna untuk pemilik proses, dan userA (uid 1000), userB (uid 1201), dan userC (uid 1450) adalah orang-orang yang boleh membunuh proses tersebut.

killmyproc.bash:

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.

Kemudian atur pemilik dan izin dengan:

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash

Dan juga menempatkan userA, userB, dan userC dalam grup procGroup.


sumber
Saya mencoba ini, dan itu tidak berhasil. Pengguna yang bukan pemilik mendapat izin yang ditolak pada perintah kill.
Javid Jamae
1
Saya hanya ingin menambahkan, mengapa tidak membiarkan sistem mengontrol izin untuk skrip kill? Membuat grup dari userA, userB, dan userC, kemudian mengunyah skrip kills ke grup itu dan mengubahnya menjadi g + x sepertinya lebih rapi bagi saya.
Leonid Shevtsov
1
bit setUid tidak diizinkan dalam skrip shell, Anda harus membuat program pembungkus sederhana yang dikompilasi untuk menjalankannya
El '
2

Tidak secara konvensional - meminta pengguna datang dan membunuh proses orang lain adalah kerentanan penolakan layanan.

Ini bisa dilakukan jika proses target bekerja sama. Salah satu caranya adalah memantau kejadian eksternal (seperti file yang dibuat di / var / tmp, atau pesan pada soket), memerintahkannya untuk mematikan dirinya sendiri. Jika Anda tidak bisa menulisnya untuk melakukan itu, Anda bisa menulis pembungkus untuk itu yang memulai dan kemudian melakukan pemantauan, membunuh proses anak jika peristiwa itu terjadi.


sumber
1

Tidak, kamu tidak bisa.

Jika Anda ingin berbagi proses dengan pengguna lain, Anda harus memulai proses di bawah id pengguna umum.

Konerak
sumber
1

Tentu saja, Anda dapat menulis program sedemikian rupa sehingga berakhir dengan anggun ketika menerima sinyal tertentu (istilah yang digunakan secara longgar berarti "peristiwa yang ditentukan sebelumnya", bukan sinyal POSIX) dari (daftar) pengguna tertentu.

drxzcl
sumber
Sinyal tidak memiliki bidang "pengguna". Itu hanya sinyal.
LtWorf
Itu sebabnya saya mengatakan "acara yang ditentukan, bukan sinyal POSIX".
drxzcl
1

Anda dapat menulis program suid yang hanya dapat dijalankan oleh pengguna dalam grup tertentu dan yang mengirimkan sinyal yang sesuai ke proses. Tidak yakin apakah Anda bermaksud mengecualikan suid juga.

Kim
sumber
0

bit suid tidak bekerja dengan skrip bash. imho, cara terbaik adalah menulis beberapa skrip wrapper "killservice". Misalkan, layanan Anda berjalan sebagai pengguna layanan pengguna

#!/bin/bash
sudo -u serviceuser /usr/bin/killserviceworker

kemudian

# addgroup servicekiller
# chown root:servicekiller /usr/bin/killservice
# chmod 750 /usr/bin/killservice
# adduser bob servicekiller

kemudian, Anda hanya perlu menambahkan aturan di / etc / sudoers untuk memungkinkan mereka menjalankan / usr / bin / killserviceworker sebagai pengguna layanan tanpa meminta kata sandi:

servicekiller        ALL = (serviceuser:serviceuser) NOPASSWD: /usr/bin/killserviceworker

killerviceworker dapat terlihat seperti ini:

#!/bin/bash
kill ${cat /run/service.pid}
Es
sumber