socat を使用して ssh-agent ソケットを chroot に転送できますか?

socat を使用して ssh-agent ソケットを chroot に転送できますか?

私はリモートサーバーにカスタム Debian 環境を構築しており、SSH 経由で接続しています。これには、debootstrap 環境を構築し、その環境に chroot してカスタムインストーラーを実行することが含まれます。カスタムインストールプロセスの一部として、インストーラーが chroot 環境から別のリモートサーバーに ssh で接続できるようにする必要があります。そのためには、ssh-agent の SSH 認証情報を再利用する必要があります。chroot が知っていること。

どうすればいいのか全く思いつきません。原則として、私は考える次のように chroot を呼び出す前に、socat を使用して $SSH_AUTH_SOCK を chroot 環境に転送できるはずです。

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

しかし、chroot 内で ssh を使用しようとするとすぐに socat からのパイプが壊れてしまいますが、これは (ある意味では) 理解できることだと思います。

これを回避する方法はあるでしょうか?chrootする前にSSHマスターソケットを設定し、chroot内のすべてにそれを使用するという代替策がありますが、インストーラのかなり侵入的な書き換えが必要になるので、本当にその計画には乗り気ではない。

アップデート

ソケットへのハードリンクを作成するだけで、必要な効果が得られることがわかりました。正直、それが機能するとは思っていませんでした。

答え1

SSH エージェントを chroot に転送することはできますが、いくつかの手順を踏む必要があります。最初の手順は、chroot 内でソケットにアクセスできるようにすることです。2 番目の手順は、chroot 内のユーザーにその旨を通知することです。

ソケットを使用できるようにするには、権限が適切に設定されている限り、OP の提案を使用するのが効果的ですsocat。chroot を起動するスクリプトを使用していると仮定すると、次のスニペットを使用してsocatchroot でエージェント ソケットを提供します。

# 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

ユーザーのuidgidアリスchroot 内のディレクトリ (この例では) からエージェントにアクセスできるはずです。次に、そのディレクトリを作成し、socatOP とほぼ同じ方法で を確立します。追加されているのは、user=${_owner%:*}chroot 内のソケットに uid を設定する pirceです。アリスアクセスできます。

次に、socatchroot の終了時に PID を破棄できるように PID を記憶します。最後に、SSH_AUTH_SOCK変数をエクスポートして、chroot 内で使用できるようにします。


現在、chrootは によってのみ実行できるのでroot、スクリプトはsudoエージェント プロセスを所有する通常のユーザーから によって実行されると推測します。これが正確であれば、もう 1 つ行うべきことは、sudoスクリプトに環境変数を渡すことを許可することです。これを行うには、 を編集し/etc sudoers(承認されたメカニズムは ですsudo visudo)、以下を追加します。

Defaults env_keep+=SSH_AUTH_SOCK

がchroot 内で使用される場合 (つまり、 から に切り替える場合) 、この変更は/etc/sudoerschroot 内でも行う必要があります。sudorootalice

以下は、通常のユーザーから見た chroot 内のエージェント ソケットの例です。

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

関連情報