Start · Sprachen · PHP · Referenz · posix_setegid

posix_setegid

Funktion

Setzt die effektive Gruppen-ID (EGID) des aktuellen PHP-Prozesses auf den angegebenen Wert.

seit PHP 4.0.2 Kategorie: misc

Signatur

posix_setegid(int $group_id): bool

Beschreibung

posix_setegid() ändert die effektive Gruppen-ID (EGID) des laufenden Prozesses. Die effektive Gruppen-ID bestimmt, welche Datei- und Ressourcenberechtigungen der Prozess bei Zugriffsoperationen verwendet – im Gegensatz zur realen Gruppen-ID, die den tatsächlichen Eigentümer des Prozesses identifiziert.

Typischer Einsatz: Ein Serverprozess, der zunächst als root gestartet wird (um z. B. einen privilegierten Port zu binden), kann anschließend seine effektive Gruppen-ID auf eine unprivilegierte Gruppe herabsetzen, um das Prinzip der geringsten Rechte (Principle of Least Privilege) umzusetzen.

Die Funktion steht nur auf POSIX-konformen Betriebssystemen (Linux, macOS, BSD usw.) zur Verfügung und ist auf Windows-Systemen nicht verfügbar. Das PHP-Modul posix muss kompiliert oder als Extension geladen sein.

Beachte: Nur ein Prozess mit den entsprechenden Berechtigungen (in der Regel root oder CAP_SETGID) darf die effektive Gruppen-ID beliebig ändern. Nicht-privilegierte Prozesse dürfen die EGID nur auf ihre reale oder gespeicherte Gruppen-ID setzen.

Parameter

Name Typ Default Beschreibung
$group_id Pflicht int Die numerische Gruppen-ID (GID), auf die die effektive Gruppen-ID des Prozesses gesetzt werden soll. Muss eine gültige, auf dem System existierende GID sein (z. B. 33 für www-data unter Debian/Ubuntu).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die effektive Gruppen-ID erfolgreich gesetzt wurde, andernfalls false. Im Fehlerfall (z. B. unzureichende Berechtigungen oder ungültige GID) kann der genaue Fehlercode mit posix_get_last_error() und die zugehörige Meldung mit posix_strerror() abgefragt werden.

Beispiele

Effektive Gruppen-ID auf www-data setzen

<?php
// Setzt die effektive Gruppen-ID auf die GID der Gruppe 'www-data' (typisch: 33)
$targetGid = 33;

if (posix_setegid($targetGid)) {
    echo "Effektive Gruppen-ID erfolgreich auf {$targetGid} gesetzt." . PHP_EOL;
    $info = posix_getegid();
    echo "Aktuelle effektive GID: {$info}" . PHP_EOL;
} else {
    $errno = posix_get_last_error();
    $errmsg = posix_strerror($errno);
    echo "Fehler beim Setzen der EGID: [{$errno}] {$errmsg}" . PHP_EOL;
}
?>
Effektive Gruppen-ID erfolgreich auf 33 gesetzt. Aktuelle effektive GID: 33

Privileg-Absenkung nach dem Start als root

<?php
// Typisches Muster: Prozess startet als root, senkt dann Rechte ab

$unpriv_gid = posix_getgrnam('nobody')['gid'] ?? 65534;
$unpriv_uid = posix_getpwnam('nobody')['uid'] ?? 65534;

// Erst GID, dann UID wechseln (Reihenfolge wichtig!)
if (!posix_setegid($unpriv_gid)) {
    $err = posix_strerror(posix_get_last_error());
    throw new RuntimeException("posix_setegid() fehlgeschlagen: {$err}");
}

if (!posix_seteuid($unpriv_uid)) {
    $err = posix_strerror(posix_get_last_error());
    throw new RuntimeException("posix_seteuid() fehlgeschlagen: {$err}");
}

echo "Prozess läuft nun als nobody (UID={$unpriv_uid}, GID={$unpriv_gid})" . PHP_EOL;
?>
Prozess läuft nun als nobody (UID=65534, GID=65534)

// Wichtig · Fallstricke

Sicherheitshinweis: Ändere die GID immer bevor du die UID absenkst – nach dem Wechsel zu einem nicht-privilegierten Benutzer fehlen möglicherweise die Rechte, um die Gruppen-ID noch einmal zu ändern.

Irreversibilität: Bei nicht-privilegierten Prozessen ist der Wechsel unter Umständen permanent. Überprüfe daher die Logik deiner Anwendung sorgfältig, bevor du posix_setegid() aufrufst.

Verfügbarkeit: Die Funktion ist nur verfügbar, wenn PHP mit POSIX-Unterstützung kompiliert wurde (--enable-posix). Auf Windows-Systemen existiert sie nicht.

Verwechsle posix_setegid() (effektive GID) nicht mit posix_setgid() (reale GID). Für die meisten Sicherheitsanwendungsfälle sollte posix_setgid() bevorzugt werden, da es alle Gruppen-IDs (real, effektiv, gespeichert) gleichzeitig setzt.