
Ich habe ein PHP-Skript, beispielsweise file.php, das Folgendes enthält:
<?php
exec("ip netns exec vpn file2.php");
?>
Wenn ich file.php über die Befehlszeile als Root ausführe, funktioniert es. Wenn ich es jedoch über Apache ausführe, hat www-data nicht die Berechtigung, ip netns exec zu verwenden. www-data kann jedoch ip netns list verwenden.
Wie kann ich entweder a) die Ausführung von „ip netns exec“ durch Nicht-Root-Benutzer zulassen oder www-data die Berechtigung erteilen, „ip net exec“-Sachen auszuführen?
Antwort1
Versuchen Sie etwas wie
# ip netns exec vpn sudo -u www-data apache
als root .
Auf diese Weise wird Apache mit netns als Nicht-Root-Benutzer ausgeführt. Wenn Sie beide Namespaces gleichzeitig benötigen, starten Sie zwei Instanzen, jede in einem Namespace. Das Ändern des Namespaces im laufenden Betrieb scheint nicht zu funktionieren.
Erläuterung:
Das Verzeichnis /var/run/netns
speichert alle Netzwerk-Namespaces. Wenn wir einen neuen „abc“ hinzufügen, wird in diesem Verzeichnis eine leere Datei „abc“ erstellt. Jedes Mal, wenn wir das Programm „xyz“ im Namespace „abc“ ausführen, wird ip(1)
ein Dateideskriptor für geöffnet und gespeichert /var/run/netns/abc
, dann werden unshare(2)
und aufgerufen setns(2)
.
Hier gibt es also zwei Hindernisse. Das eine sind die Dateisystemberechtigungen /var/run/netns/*
, das andere sind die Möglichkeiten für privilegierte Systemaufrufe.