w środowisku Linuksa muszę zabić proces rozpoczęty przez użytkownika 2, jeśli jestem użytkownikiem 1, nie będąc sudoerami ani korzystając z roota. Czy wiesz, czy istnieje sposób na ustawienie tego podczas uruchamiania procesu? Takich jak lista użytkowników, którzy mogą zabić proces?
Faktem jest, że współbieżne wystąpienia tego samego procesu mogą być uruchamiane przez różnych użytkowników, dlatego nie jest dla mnie wygodne ustawienie identyfikatora grupy na proces. Inni użytkownicy, którzy nie należą do grupy, nie będą mogli rozpocząć drugiego równoległego procesu.
To, co mam, to lista użytkowników, którzy mogą rozpocząć proces, zdefiniowana w bazie danych, przed rozpoczęciem procesu sprawdzam, czy aktualny użytkownik na liście, a jeśli tak, rozpoczynam proces od bieżącego użytkownika. Jeśli drugi użytkownik może to zrobić, chce zabić proces, chciałbym, aby to zrobił, ale nie chcę, aby to był sudoers.
Dlatego zastanawiałem się nad stworzeniem procesu działającego jako root, który odbiera żądanie zabicia procesów od użytkownika, sprawdza, czy użytkownik może uruchomić / zatrzymać proces i zabija proces.
Czy uważasz, że to może być najlepsze rozwiązanie?
Odpowiedzi:
Przykro mi, ale po prostu nie jest to możliwe (jest to zgodne z projektem). Jeśli jednak członkowie wspólnej grupy, użytkownik 1 mógłby zapisać do pliku, który proces użytkownika 2 sprawdza, wskazując procesowi, że powinien się zakończyć.
Lub użytkownik 2 może uruchomić w tle coś, co sprawdza plik, a następnie wysyła odpowiednie sygnały. Użytkownik 1 musi wtedy po prostu zapisać do tego pliku. Może to być łatwiejsze, ponieważ nie wymagałoby żadnej modyfikacji programów użytkownika 2.
Konwencjonalnie nie, użytkownik 1 nie może wysyłać sygnałów POSIX do procesu użytkownika 2.
źródło
O ile ACL, SELinux lub coś innego nie ma lepszego sposobu na zrobienie tego, tak jak widziałem to za pomocą skryptu SetUID . Jak możesz sobie wyobrazić, są niesławni z powodu zagrożeń bezpieczeństwa.
Jeśli chodzi o twoją sprawę, powiedz, że procOwner to nazwa użytkownika właściciela procesu, a użytkownik A (identyfikator użytkownika 1000), użytkownik B (identyfikator użytkownika 1201) i użytkownik C (identyfikator użytkownika 1450) to ludzie, którzy mogą zabić proces.
killmyproc.bash:
Następnie ustaw właściciela i uprawnienia za pomocą:
A także umieścić Usera, UserB i userC w grupie
procGroup
.źródło
Nie umownie - przyjazd dowolnego użytkownika i zabicie procesów innej osoby jest największą podatnością na atak typu „odmowa usługi”.
Można to zrobić, jeśli proces docelowy współpracuje. Jednym ze sposobów byłoby monitorowanie zewnętrznego zdarzenia (takiego jak plik tworzony w / var / tmp lub komunikat w gnieździe), instruując go, aby sam się zabił. Jeśli nie możesz tego napisać, możesz napisać opakowanie, które go uruchomi, a następnie wykona monitorowanie, zabijając proces potomny, jeśli wystąpi zdarzenie.
źródło
Nie możesz
Jeśli chcesz współdzielić procesy z innymi użytkownikami, powinieneś rozpocząć proces pod wspólnym identyfikatorem użytkownika.
źródło
Oczywiście możesz napisać program w taki sposób, że z wdziękiem kończy się, gdy odbiera określony sygnał (termin używany luźno w znaczeniu „z góry określone zdarzenie”, a nie sygnał POSIX) od określonego (listy) użytkowników.
źródło
Możesz napisać program Suid, który mogą wykonywać tylko użytkownicy w określonej grupie i który wysyła odpowiedni sygnał do procesu. Nie jestem pewien, czy chciałeś też wykluczyć suid.
źródło
bit suid nie działa ze skryptami bash. imho, najlepszym sposobem jest napisanie jakiegoś skryptu opakowującego „killservice”. Załóżmy, że Twoja usługa działa jako użytkownik usługi użytkownika
następnie
następnie wystarczy dodać regułę w / etc / sudoers, aby umożliwić im uruchomienie / usr / bin / killserviceworker jako użytkownika usługi bez pytania o hasło:
killserviceworker może wyglądać następująco:
źródło