Ich möchte alle Kill-Befehle deaktivieren (auch für den Root-Benutzer). Ich habe versucht, die Berechtigungen zu ändern, aber der Befehl kann immer noch ausgeführt werden. Gibt es eine Möglichkeit, das zu tun?
Antwort1
Das "Deaktivieren" kill
von root
, selbst wenn es möglich wäre, hätte höchstwahrscheinlich unerwünschte Nebenwirkungen, wie z. B. Fehlfunktionen von Systemskripten, und im schlimmsten (aber wahrscheinlichsten) Szenario würde es verhindern, dass Ihr Computer richtig startet (oder sogarHerunterfahrenrichtig).
Auch für einen Benutzer würde es Probleme verursachen. Ich habe beispielsweise Skripte, die ich als nicht privilegierter Benutzer ausführe und die prüfen, ob bestimmte Prozesse mit ausgeführt werden kill -0 $pid
. Diese Skripte würden nicht mehr funktionieren.
Sie selbst könnten alias
den kill
Befehl auch anders formulieren, etwa echo "kill"
:
$ alias kill='echo "kill"'
Dies würde kill
zumindest verhindern, dass auf der Befehlszeile sinnvolle Aktionen ausgeführt werden:
$ kill -s HUP $$
kill -s HUP 11985
Antwort2
Verwenden Sie dieses Kernelmodul, um den kill
Systemaufruf zu deaktivieren amd64
.
Die Verwendung erfolgt auf eigene Gefahr. Es sind verheerende Nebenwirkungen zu erwarten.
#include <linux/module.h>
MODULE_LICENSE("GPL");
int __init init(void) __attribute__((noreturn))
{
unsigned long long cr0 = read_cr0();
write_cr0(cr0 & ~(1 << 16)); /* Clear Write Protection (WP) bit */
*(unsigned char *)sys_kill = 0xc3; /* opcode for "ret" */
write_cr0(cr0);
/* This makes sure that delete_module below won't complain */
__this_module.refcnt = 1;
__this_module.state = MODULE_STATE_LIVE;
asm volatile
(
"mov %0, %%rsp\n\t" /* It seems GCC refuses to mess with the stack pointer */
"jmp sys_delete_module\n\t" /* call delete_module(name, flags) */
:: "r"(current->stack + THREAD_SIZE - sizeof(struct pt_regs) - 8), "D"(__this_module.name), "S"(0) :
);
}
void __exit exit(void)
{
return;
}
Kompilieren Sie es wie jedes andere Modul. Verwenden Sie insmod
es dann.
Antwort3
Dusollte nichtDeaktivieren Sie es systemweit, da es in Systemskripten (z. B. im /etc/init.d/functions
Paket initscripts
) verwendet wird.
Sie können es deaktivierenfür die Login-Shell(und seine Unterschalen) durchalias
'ing es beispielsweise auf true
/ false
(oder etwas wie kill_disabled
, wenn Sie einen Fehler statt eines No-Op erhalten möchten).
Beachten Sie, dass diese Methode nicht narrensicher ist: Sie wirkt sich nur auf direkt ausgeführte Befehle aus (nicht auf solche in Skripten). Und der Benutzer kann den Alias mit entfernen unalias
.
Führen Sie dazu den folgenden Befehl aus
alias kill=kill_disabled
oder fügen Sie es zu einem geeignetenbash
Startdateium es bei jeder Anmeldung auszuführen.
Die interaktive Ausführung führt nun kill
zu Folgendem:
$ kill 9999
-bash: kill_disabled: command not found
Wie gesagt, der obige Weg kann leicht unterlaufen werden. Wenn Sie einen narrensicheren Weg brauchen, besteht die einzige Lösung darin, die gesamte Login-Shell-Sitzung in einemchroot
Umgebung. Es deaktiviert weiterhin nur dieLagerbefehl,kein direkter Systemaufruf, jedoch erfolgt. Letzteres kann nicht deaktiviert werden, da es für den normalen Betrieb unerlässlich ist (z. B. sendet jedes Ctrl+ , Pipes erfordern und Hintergrundprozesse werden mit mehr als fünf verschiedenen Signalen gesteuert). Das Einrichten einer Chroot-Umgebung ist eine fortgeschrittene Aufgabe und im Allgemeinen unpraktisch, wenn der Benutzer auf das gesamte Dateisystem zugreifen muss.CSIGINT
SIGPIPE
Antwort4
Wenn Sie möchten, dass die Benutzer es normal verwenden können, kill
außer wenn sie versuchen, Ihr spezielles Programm zu beenden, können Sie kill
im .bashrc
Benutzerprofil eine Funktion definieren und innerhalb dieser Funktion prüfen, ob der Benutzer versucht, Ihr Programm zu beenden. Wenn nicht, können Sie das kill
Dienstprogramm innerhalb Ihrer Funktion selbst aufrufen.
Als Beispiel habe ich eine kleine Kill-Funktion geschrieben, die das Dienstprogramm nicht beendet, sleep
sondern für alle anderen bereitgestellten Parameter wie ein normales Kill-Dienstprogramm funktioniert.
function kill() {
process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
if [[ $process == "sleep"]]
then
echo "Killing $process is not allowed"
else
/bin/kill $@
fi
}