Kök veya sudoer olmadan farklı bir kullanıcıyla başlayan bir süreci nasıl öldürürüm?


20

Linux ortamında, sudoer olmadan veya root kullanmadan user1 isem user2 tarafından başlatılan bir işlemi öldürmem gerekiyor. Süreci başlatırken bunu ayarlamanın bir yolu olup olmadığını biliyor musunuz? Süreci öldürmek için izin verilen kullanıcıların bir listesi gibi?

Gerçek şu ki, aynı sürecin eşzamanlı örnekleri farklı kullanıcılardan başlatılabilir, bu yüzden grup kimliğini sürece ayarlamak benim için uygun değildir. Grupta yer almayan diğer kullanıcılar ikinci bir paralel işlem başlatamaz.

Ne var, işlem başlamadan önce veritabanında tanımlanan, işlemi başlatmak için izin verilen kullanıcıların bir listesini listede geçerli kullanıcının kontrol ve evet ise, geçerli kullanıcı ile işlemi başlatmak olduğunu. İkinci bir kullanıcı bunu yapmak için izin verirse, süreci öldürmek istiyorsa, bunu yapmasına izin verilmesini istiyorum ama sudoer olmasını istemiyorum.

Bu nedenle, bir kullanıcıdan işlemleri öldürme isteğini alan, kullanıcının işlemi başlatmasına / durdurmasına izin verilip verilmediğini ve işlemi öldürüp öldürmediğini kontrol eden kök olarak çalışan bir işlem oluşturmayı düşünüyordum.

Sizce bu en iyi çözüm olabilir mi?


SO hoş geldiniz. Bunun mümkün olduğunu düşünmüyorum ... Her neyse, bu SO'nun kardeş sitesi serverfault.com için daha uygun. Yakında oraya göç edebilir, hiçbir şey yapmanıza gerek yoktur.
Pekka, GoFundMonica'yı

Ne tür bir programdan bahsediyoruz? Genel durumda zor olurdu, ancak bazı durumlarda (apache veya kendinizi değiştirebileceğiniz bir uygulama gibi) daha kolay olurdu.
Kim

Yanıtlar:


14

Üzgünüm, ama bu mümkün değil (tasarım gereği). Ancak, ortak bir grubun üyeleri, user1, user2'nin işleminin denetlediği bir dosyaya yazabilir ve sonlandırılması gerektiğini belirtir.

Veya kullanıcı2, arka planda bir dosyayı kontrol eden ve ardından uygun sinyalleri gönderen bir şey çalıştırabilir. Kullanıcı1 daha sonra bu dosyaya yazmak zorundadır. Bu, user2 programlarında herhangi bir değişiklik yapılmasını gerektirmeyeceğinden daha kolay olabilir.

Geleneksel olarak, hayır, kullanıcı1, kullanıcı2'nin işlemine POSIX sinyalleri gönderemez.


Cevabınız için teşekkürler. Benim durumumda, gerçekten dosyayı kullanmıyorum ama uygun sinyali gönderebilen bir sistem ( dim.web.cern.ch/dim ) kullanıyoruz, daha sonra kullanıcının izin verdiğini kontrol eden bir işlem çağrılabilir süreci durdurur ve öldürür.

@ATelesca - Yeterli olmayan kullanıcıların Xen sanal makinelerini oldukça büyük bir çiftlikte kontrol etmesine / başlatmasına / durdurmasına izin vermek için çok benzer bir şey kullanıyorum. Temel olarak, aynı şey.
Tim Post

9

ACL'ler veya SELinux ya da başka bir şey yapmanın daha iyi bir yolu yoksa, bunu gördüğüm şekilde bir SetUID betiğidir. Tahmin edebileceğiniz gibi, güvenlik riskleri olarak ün yapmıştır.

Durumunuzla ilgili olarak, procOwner'ın işlem sahibinin kullanıcı adı olduğunu ve userA (uid 1000), userB (uid 1201) ve userC (uid 1450) 'nin işlemi öldürmesine izin verilen kişiler olduğunu varsayalım.

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.

Ardından, sahibi ve izinleri aşağıdakilerle ayarlayın:

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

Ve ayrıca userA, userB ve userC'yi gruba koyun procGroup.


Bunu denedim ve işe yaramadı. Sahip olmayan kullanıcının kill komutu için izin verilmedi.
Javid Jamae

1
Sadece eklemek istiyorum, neden sistem kill komut dosyası izinlerini kontrol izin vermiyor? UserA, userB ve userC dışında bir grup oluşturma, ardından killscript'i bu gruba seçme ve bunu g + x olarak chmodding benim için daha düzenli görünüyor.
Leonid Shevtsov

1
setUid bit kabuk komut dosyalarında izin verilmiyor, u çalıştırmak için basit sarıcı derlenmiş program sandık gerekir
El '

2

Geleneksel olarak değil - herhangi bir kullanıcının gelip bir başkasının işlemlerini öldürmesi, hizmet reddinin en üst düzey güvenlik açığıdır.

Hedef süreç işbirliği yaparsa yapılabilir. Bunun bir yolu harici bir olayı izlemesi (/ var / tmp içinde oluşturulan bir dosya veya bir soket üzerindeki bir mesaj gibi), kendisini öldürmesini söylemesi olabilir. Bunu yapmak için yazamıyorsanız, onu başlatan ve ardından izleme yapan bir sargı yazabilirsiniz, olay gerçekleşirse alt işlemi öldürürsünüz.


1

Hayır, yapamazsınız.

İşlemleri diğer kullanıcılarla paylaşmak istiyorsanız, işlemi ortak bir kullanıcı kimliği altında başlatmalısınız.


1

Tabii ki, programı belirli bir kullanıcıdan (belirli bir liste) kullanıcıların belirli bir sinyalini (POSIX sinyali değil, "önceden belirlenmiş bir olay" anlamına gevşetmek için kullanılan terim) zarif bir şekilde sonlanacak şekilde yazabilirsiniz.


Sinyallerin "kullanıcı" alanı yoktur. Onlar sadece sinyaldir.
LtWorf

Bu yüzden "POSIX sinyali değil, önceden belirlenmiş bir olay" dedim.
drxzcl

1

Yalnızca belirli bir gruptaki kullanıcıların çalışabileceği ve işleme uygun sinyali gönderen bir intihar programı yazabilirsiniz. Yine de suid'i hariç tutmak istediğinizden emin değilim.


0

suid biti bash betikleriyle çalışmaz. imho, en iyi yolu bazı sarıcı komut dosyası "killservice" yazmaktır. Hizmetinizin kullanıcı hizmeti kullanıcısı olarak çalıştığını varsayalım

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

sonra

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

daha sonra, / usr / bin / killserviceworker'ı şifre sormadan kullanıcı hizmeti kullanıcısı olarak çalıştırmalarına izin vermek için / etc / sudoers içine kural eklemeniz yeterlidir:

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

killserviceworker şöyle görünebilir:

#!/bin/bash
kill ${cat /run/service.pid}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.