(10 Antworten)
Vor 6 Jahren geschlossen.
Ich möchte sicherstellen, dass mein Programm nur von Benutzer xyz
ausgeführt werden kann mit Root-Privilegien. Dazu setze ich das setuid-Bit mit:
chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh
Außerdem habe ich den Benutzer xyz
hinzugefügt zum house
gruppieren, sodass nur xyz
und root kann program1.sh ausführen.
In program1.sh gibt es
id -u
damit es mir die gültige ID zeigen kann.
Ausführen von program1.sh
als root wird root
angezeigt . Aber läuft mit dem xyz
Konto wird xyz
angezeigt . Es scheint, dass es nicht mit Root-Rechten ausgeführt wurde. Ich weiß nicht, was hier falsch ist.
Akzeptierte Antwort:
Beim Ausführen von Shell-Skripten mit dem setuid-Bit (z. B. Perms von rwsr-xr-x) werden die Skripte als der Benutzer ausgeführt, der sie ausführt, und nicht als der Benutzer, dem sie gehören. Dies steht im Gegensatz zu der Behandlung von setuid für Binärdateien (z. B. /usr/bin/passwd), die als der Benutzer ausgeführt werden, der sie besitzt, unabhängig davon, welcher Benutzer sie ausführt.
Überprüfen Sie diese Seite:https://access.redhat.com/site/solutions/124693
Dies ist eine Sicherheitsmaßnahme des Betriebssystems. Sie sollten Ihr Skript mit sudo verwenden stattdessen.
Wenn Sie wirklich setuid in Ihrem Skript verwenden müssen, können Sie eine Binärdatei erstellen, die die Arbeit erledigt. Erstellen Sie eine neue Datei „program.c“ und kopieren Sie den folgenden Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0);
system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
return 0;
}
Kompilieren Sie den Code und führen Sie ihn mit den folgenden Befehlen aus:
$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program
Auf diese Weise wird es funktionieren. Die setuid funktioniert für kompilierte Dateien, und diese Datei kann andere Dateien als root ausführen.