Ce face os.setuid(), seteuid(), setgid(), setegid(), setreuid(), setregid()
Un server pornit ca root (ca să poată asculta pe portul 80) renunță la drepturi după inițializare, trecând pe un utilizator obișnuit: întâi setgid(), apoi setuid(); după setuid nu mai poți schimba grupul. Variantele set*e* schimbă doar identitatea efectivă (temporar), iar setre* le schimbă pe ambele deodată.
Un proces obișnuit nu poate trece pe alt utilizator; primește PermissionError.
Parametri
| Parametru | Descriere |
|---|---|
uid / gid |
Identificatorii noi (-1 = neschimbat, la setre*). |
Ce returnează
None.
Exemple
Exemplul 1: Renunțarea la drepturile de root
import os, pwd
www = pwd.getpwnam("www-data")
os.setgroups([])
os.setgid(www.pw_gid)
os.setuid(www.pw_uid)
print(os.getuid(), os.geteuid())
try:
os.setuid(0)
except PermissionError as e:
print("Nu se mai poate reveni:", e.strerror)
Rezultat (pornit ca root pe Linux)
33 33
Nu se mai poate reveni: Operation not permitted
Exemplul 2: Schimbări temporare și combinate
import os
os.setegid(1000); os.seteuid(1000)
print(os.geteuid(), os.getuid())
os.seteuid(0); os.setegid(0)
os.setregid(1000, 1000)
os.setreuid(1000, 1000)
print(os.getuid(), os.geteuid())
Rezultat (pornit ca root pe Linux)
1000 0
1000 1000
Greșeli frecvente
- Apelezi
setuid()înainte desetgid(): dupăsetuidnu mai ai dreptul să schimbi grupul, iar procesul rămâne în grupul root.
Comenzi înrudite
os.getuid(), geteuid(), getgid(), getegid() și getlogin(): Identitatea utilizatorului și a grupului sub care rulează procesul.os.getgroups(), setgroups(), getgrouplist() și initgroups(): Grupurile suplimentare din care face parte procesul sau un utilizator.os.chroot(): Schimbă directorul rădăcină al procesului (necesită drepturi de administrator).