
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, socat
solange die Berechtigungen richtig eingestellt sind. Vorausgesetzt, Sie verwenden ein Skript zum Starten des Chroots, wird der folgende Codeausschnitt verwendet, socat
um 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 uid
und gid
des Benutzers fest (Aliceim Beispiel) innerhalb des Chroots, der auf den Agenten zugreifen können soll. Anschließend wird dieses Verzeichnis erstellt und ein socat
auf 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 socat
PID, damit sie beim Beenden des Chroots abgebaut werden kann. Abschließend exportiert es die SSH_AUTH_SOCK
Variable, um sie im Chroot verfügbar zu machen.
chroot
Das geht jetzt nur, wenn ich vermute, dass das Skript von einem normalen Benutzer root
ausgefü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:sudo
sudo
/etc sudoers
sudo visudo
Defaults env_keep+=SSH_AUTH_SOCK
/etc/sudoers
Diese Änderung muss auch innerhalb des Chroots vorgenommen werden , wenn sudo
innerhalb des Chroots verwendet wird (d. h. um von root
zu 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