Start · Sprachen · PHP · Referenz · posix_setgid

posix_setgid

Funktion

Setzt die reale Gruppen-ID (GID) des aktuellen Prozesses auf den angegebenen Wert.

seit PHP 4.0.2 Kategorie: misc

Signatur

posix_setgid(int $group_id): bool

Beschreibung

posix_setgid() ändert die reale Gruppen-ID des aktuellen Prozesses. Dies entspricht dem POSIX-Systemaufruf setgid(). Die Funktion ist typischerweise dann nützlich, wenn ein PHP-Prozess mit erhöhten Rechten (z. B. als root) gestartet wird und anschließend auf eine weniger privilegierte Gruppe wechseln soll, um die Angriffsfläche zu minimieren.

Um die GID erfolgreich ändern zu können, muss der Prozess entweder als root (UID 0) laufen oder die gewünschte GID muss einer Gruppe entsprechen, der der aktuelle Benutzer angehört. Auf Linux-Systemen setzt setgid() zusätzlich die effective und saved GID, sofern der Prozess Root-Rechte besitzt.

Die Funktion steht nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD usw.) zur Verfügung und ist unter Windows nicht verfügbar. Sie sollte zusammen mit posix_setuid() eingesetzt werden, wenn ein Daemon-Prozess dauerhaft auf einen unprivilegierten Benutzer und eine unprivilegierte Gruppe heruntergestuft werden soll – dabei muss die Gruppe vor dem Benutzer gesetzt werden.

Parameter

Name Typ Default Beschreibung
$group_id Pflicht int Die numerische Gruppen-ID (GID), auf die der aktuelle Prozess gesetzt werden soll. Die GID muss eine gültige Gruppe im System darstellen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die GID erfolgreich gesetzt wurde, andernfalls false. Im Fehlerfall (z. B. unzureichende Rechte oder ungültige GID) kann der genaue Fehler mit posix_get_last_error() und posix_strerror() abgerufen werden.

Beispiele

Gruppen-ID des aktuellen Prozesses setzen

<?php
// GID der Gruppe 'www-data' ermitteln (typischerweise 33 auf Debian/Ubuntu)
$groupInfo = posix_getgrnam('www-data');
$gid = $groupInfo['gid'];

if (posix_setgid($gid)) {
    echo "Gruppen-ID erfolgreich auf {$gid} gesetzt.\n";
    $current = posix_getgid();
    echo "Aktuelle GID: {$current}\n";
} else {
    $errno = posix_get_last_error();
    echo "Fehler beim Setzen der GID: " . posix_strerror($errno) . "\n";
}
Gruppen-ID erfolgreich auf 33 gesetzt. Aktuelle GID: 33

Daemon-Prozess sicher auf unprivilegierten Benutzer herunterstufen

<?php
// Erst Gruppe setzen, dann Benutzer – Reihenfolge ist entscheidend!
$group = posix_getgrnam('www-data');
$user  = posix_getpwnam('www-data');

if (!$group || !$user) {
    die("Benutzer oder Gruppe 'www-data' nicht gefunden.\n");
}

if (!posix_setgid($group['gid'])) {
    die("Konnte GID nicht setzen: " . posix_strerror(posix_get_last_error()) . "\n");
}

if (!posix_setuid($user['uid'])) {
    die("Konnte UID nicht setzen: " . posix_strerror(posix_get_last_error()) . "\n");
}

echo "Prozess läuft jetzt als UID=" . posix_getuid() . ", GID=" . posix_getgid() . "\n";
Prozess läuft jetzt als UID=33, GID=33

// Wichtig · Fallstricke

Reihenfolge beachten: Wenn sowohl GID als auch UID geändert werden sollen, muss posix_setgid() vor posix_setuid() aufgerufen werden. Nach dem Wechsel auf einen nicht-privilegierten Benutzer fehlen die Root-Rechte, um noch die Gruppe ändern zu können.

Keine Umkehrbarkeit: Sobald Root-Rechte aufgegeben wurden, kann der Prozess nicht mehr zur ursprünglichen GID zurückwechseln. Dies ist ein gewünschtes Sicherheitsmerkmal.

Zusatzgruppen: posix_setgid() ändert nur die primäre Gruppe. Zusätzliche Gruppeneinträge (Supplementary Groups) müssen separat mit posix_setgroups() angepasst werden, sofern verfügbar.

Die Funktion steht nur zur Verfügung, wenn PHP mit POSIX-Unterstützung kompiliert wurde (--enable-posix). Unter Windows ist sie nicht vorhanden.