os.setuid(), seteuid(), setgid(), setegid(), setreuid(), setregid() în Python

Utilizatori și permisiuni (os) Python 3.0+ (Unix)

Schimbă utilizatorul sub care rulează procesul, de obicei pentru a renunța la drepturile de administrator.

Sintaxă
os.setgid(gid) / os.setuid(uid)
os.setegid(gid) / os.seteuid(uid)
os.setregid(rgid, egid) / os.setreuid(ruid, euid)

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 de setgid(): după setuid nu mai ai dreptul să schimbi grupul, iar procesul rămâne în grupul root.

Comenzi înrudite