Dacă acțiunile care trebuie executate ca root pot fi separate în procese/script-uri separate, atunci puteți rula aceste procese ca root setuid. Este un instrument foarte la îndemână care, după părerea mea, este folosit mult prea rar.
Ce sunt procesele setuid? Uită-te, de exemplu, la passwd
comanda. Poate fi rulat de orice utilizator, dar trebuie să fie rulat ca root, deoarece trebuie să modifice parola stocată într-un fișier pe care numai root îl poate accesa (/etc/shadow
).
Cum se face? Uită-te la permisiunile /usr/bin/passwd
binar:
-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd
„s” în loc de „x” din câmpul proprietar indică faptul că acest binar va fi rulat cu drepturile proprietarului său - adică root.
În acest fel fiecare binar poate fi făcut să ruleze ca root (sau orice alt utilizator), independent de cine îl apelează.
Cu toate acestea, pe scenarii bitul setuid este ignorat din motive de securitate. Deci pentru a rula a scenariu ca root trebuie să folosiți a înveliș binar care va apela scenariul din interior. Puteți utiliza următorul program simplu C pentru a crea un astfel de wrapper:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int rc;
setuid(0);
rc=WEXITSTATUS(sistem("/calea/la/scriptul/dvs." ));
ieșire(rc);
}
Compilați programul și faceți rădăcina setuid executabil (presupunând că executabilul este numit învelitoare
, face sudo chown root:root wrapper
urmat de sudo chmod o+s wrapper
).
BTW. Scriptul care este rulat din interiorul wrapper-ului nu trebuie să fie setuid; doar ambalajul trebuie.
Editați | ×: din explicația dvs. din comentarii se pare că doriți să rulați un anumit rm -rf /unele/cale
comandă ca root și sunt preocupați să nu eliminați accidental nimic altceva. În acest caz, sugerez doar înlocuirea /calea/la/scriptul/dvs
parte în programul wrapper de mai sus prin această comandă rm -rf /unele/cale
, și doar rulați învelitoare
binar din scriptul dvs. în locul în care ați rula rm -rf /unele/cale
comanda. Aceasta pare a fi cea mai sigură abordare.