Kann Socat verwendet werden, um einen SSH-Agent-Socket in ein Chroot weiterzuleiten?

Kann Socat verwendet werden, um einen SSH-Agent-Socket in ein Chroot weiterzuleiten?

Ich erstelle benutzerdefinierte Debian-Umgebungen auf einem Remote-Server, mit dem ich mich über SSH verbinde. Dazu gehört das Erstellen einer Debootstrap-Umgebung, in die ich dann per Chroot einsteige, um ein benutzerdefiniertes Installationsprogramm auszuführen. Als Teil des benutzerdefinierten Installationsprozesses muss das Installationsprogramm in der Lage sein, per SSH aus der Chroot-Umgebung auf einen weiteren Remote-Server zuzugreifen, wobei die SSH-Anmeldeinformationen meines SSH-Agenten wiederverwendet werden.draußender Chroot weiß davon.

Ich kann mir einfach nicht vorstellen, wie ich das machen soll. Im PrinzipdenkenIch sollte in der Lage sein, socat zu verwenden, um $SSH_AUTH_SOCK in die Chroot-Umgebung weiterzuleiten, bevor ich Chroot wie folgt aufrufe:

socat UNIX-CONNECT:$SSH_AUTH_SOCK UNIX-LISTEN:chroot_root$SSH_AUTH_SOCK,fork &
sudo -E chroot chroot_root /bin/bash

Das führt aber zu einer unterbrochenen Pipe von Socat, sobald ich versuche, SSH innerhalb des Chroots zu verwenden, was (in gewisser Weise) verständlich ist.

Gibt es einen Weg, das zu umgehen? Ich habe die Möglichkeit, vor dem Chrooten einen SSH-Master-Socket einzurichten und diesen für alles innerhalb des Chroots zu verwenden, aber das würde eine ziemlich aufdringliche Neuschreibung des Installers erfordern, also bin ichWirklichbin von diesem Plan nicht begeistert.

AKTUALISIEREN

Es stellt sich heraus, dass ich den gewünschten Effekt erzielen kann, indem ich einfach einen Hardlink zum Socket erstelle. Ehrlich gesagt hatte ich nicht erwartet, dass das funktioniert.

Antwort1

Sie können den SSH-Agenten in ein Chroot weiterleiten, müssen dazu aber einige Hürden überwinden: Erstens müssen Sie den Socket im Chroot zugänglich machen und zweitens müssen Sie die Benutzer innerhalb des Chroot darüber informieren.

Um den Socket verfügbar zu machen, funktioniert der Vorschlag des OP, socatsolange die Berechtigungen richtig eingestellt sind. Vorausgesetzt, Sie verwenden ein Skript zum Starten des Chroots, wird der folgende Codeausschnitt verwendet, socatum den Agent-Socket im Chroot bereitzustellen:

# Set up a SSH AGENT forward socket
if [ -n "$SSH_AUTH_SOCK" ]
then
  _dir="$mnt$(dirname $SSH_AUTH_SOCK)"
  _owner=$(awk -F':' '{if ($1=="alice") {print $3":"$4}}' $mnt/etc/passwd)
  mkdir "$_dir"
  chown "$_owner" "$_dir"
  socat UNIX-CONNECT:$SSH_AUTH_SOCK \
        UNIX-LISTEN:$mnt$SSH_AUTH_SOCK,fork,user=${_owner%:*} &
  socat_pid=$!
  export SSH_AUTH_SOCK
fi

Es legt das uidund giddes Benutzers fest (Aliceim Beispiel) innerhalb des Chroots, der auf den Agenten zugreifen können soll. Anschließend wird dieses Verzeichnis erstellt und ein socatauf ziemlich dieselbe Weise wie der OP eingerichtet. Die Ergänzung ist das user=${_owner%:*}Pirce, das die UID auf dem Socket innerhalb des Chroots einstellt, sodassAlicekann darauf zugreifen.

Anschließend merkt es sich die socatPID, damit sie beim Beenden des Chroots abgebaut werden kann. Abschließend exportiert es die SSH_AUTH_SOCKVariable, um sie im Chroot verfügbar zu machen.


chrootDas geht jetzt nur, wenn ich vermute, dass das Skript von einem normalen Benutzer rootausgeführt wird, der Eigentümer des Agentenprozesses ist. Wenn das zutrifft, muss noch eine weitere Sache getan werden, nämlich die Übergabe der Umgebungsvariable an das Skript zuzulassen. Bearbeiten Sie dazu (der genehmigte Mechanismus ist so ) und fügen Sie Folgendes hinzu:sudosudo/etc sudoerssudo visudo

Defaults env_keep+=SSH_AUTH_SOCK

/etc/sudoersDiese Änderung muss auch innerhalb des Chroots vorgenommen werden , wenn sudoinnerhalb des Chroots verwendet wird (d. h. um von rootzu zu wechseln alice).

Hier ist ein Beispiel für einen Agent-Socket innerhalb eines Chroots, der von einem normalen Benutzer angezeigt wird.

$ ls -l $SSH_AUTH_SOCK
srwxr-xr-x 1 alice root 0 Feb  1 15:06 /tmp/ssh-q1ntaubl6I2z/agent.1443

verwandte Informationen