
Ich habe ein Problem mit meiner Docker-Installation. Aus Sicherheitsgründen habe ich meine „daemon.json“ so konfiguriert, dass der Namespace auf einen anderen Benutzer umgestellt wird ( userns-remap
). Jetzt habe ich das Problem, dass ich, wenn ich einen Container (mit umgestelltem Benutzerkontext ( USER containeruser
) ausführe und versuche, einen anderen anzupingen, der sich im selben Containernetzwerk befindet, folgenden Fehler erhalte:
$ ping 172.16.0.3
PING 172.16.0.3 (172.16.0.3): 56 data bytes
ping: permission denied (are you root?)
Ich habe bereits verschiedene Dinge mit AppArmor ausprobiert, weitere Fähigkeiten zugewiesen und so weiter. Aber nichts hat geholfen, das Problem zu lösen.
Das laufende Image ist ein Alpine Linux ohne jegliche Modifikationen.
Haben Sie eine Lösung für mein Problem?
Antwort1
Kurz zusammengefasst
apk add iputils
Erläuterung
Alpine basiert aufbeschäftigtboxwelches die üblichen Linux-Befehle in einer einzigen Binärdatei implementiert. Wenn Sie sich das /bin
Verzeichnis auf Ihrem Basis-Alpine-Image ansehen, werden Sie sehen, dass der ping
Befehl (wie andere) ein symbolischer Link zu/bin/busybox
Zur Ausführung als normaler Benutzer ping
benötigt man denSuid-Bitgesetzt. Sie könnten versucht sein, das Suid-Bit auf dem symbolischen Link (also chmod u+s /bin/ping
) zu setzen. Aber das würde es tatsächlich auf der Busybox-Binärdatei und damit auf allen anderen Befehlen setzen, die als symbolischer Link registriert sind, was eine Sicherheitsverletzung darstellen würde.
Glücklicherweise gibt es iputils
in Alpine ein Paket, das eine alternative Version von enthält ping
. Wenn Sie es installieren, wird der symbolische Link durch eine einfache Binärdatei ersetzt, die die erforderlichen Berechtigungen enthält, um von allen ausgeführt werden zu können. Fügen Sie einfach den oben erforderlichen Befehl in einer RUN
Zeile in Ihr Dockerfile ein.
Antwort2
Obwohl es die Frage des OP nicht beantwortet, kann es für Leute hilfreich sein, die nach dem Fehler im Titel suchen.
Sie können den folgenden Befehl ausführen, um die Shell als Root-Benutzer des Docker-Containers aufzurufen.
docker exec -u 0 -it <container-name> <shell>
Abhängig von der im Bild vorhandenen Shell shell
kann es sich um eine der folgenden handeln zsh
: , bash
, sh
, ash
, usw. Sie können es durch Ausprobieren herausfinden.
Dies ist insbesondere dann hilfreich, wenn Sie nicht über die Docker-Datei verfügen, um sie zu ändern (z. B. beim Abrufen des Docker-Images direkt aus der Registrierung).