socat 可以用來將 ssh-agent 套接字轉送到 chroot 嗎?

socat 可以用來將 ssh-agent 套接字轉送到 chroot 嗎?

我正在遠端伺服器上建立自訂 Debian 環境,並透過 SSH 連接到該伺服器。這涉及建立一個 debootstrap 環境,然後進入其中運行自訂安裝程式。作為自訂安裝過程的一部分,我需要安裝程式能夠從 chroot 環境 ssh 到另一個遠端伺服器,重新使用 SSH 憑證我的 ssh-agent外部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 中可訪問,第二個是告訴 chroot 中的使用者。

為了使套接字可用,socat只要權限設定正確,OP 的建議就可以使用。假設您使用腳本來啟動 chroot,以下程式碼片段用於socat在 chroot 中提供代理套接字:

# 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

它建立了用戶的uid和(gid愛麗絲在範例中)在 chroot 中應該能夠存取代理。然後它會建立該目錄並以socat與 OP 幾乎相同的方式建立一個目錄。新增的內容是user=${_owner%:*}pirce,它在 chroot 內設定套接字上的 uid,以便愛麗絲可以訪問它。

然後它會記住socatPID,以便在 chroot 退出時可以將其拆除。最後,它導出SSH_AUTH_SOCK變數以使其在 chroot 中可用。


現在,chroot只能透過我的猜測來完成,該腳本是由擁有代理進程的普通用戶root運行的。sudo如果這是準確的,那麼還需要做一件事,那就是允許sudo將環境變數傳遞到腳本中。為此,請編輯/etc sudoers(批准的機制是 so sudo visudo)並添加以下內容:

Defaults env_keep+=SSH_AUTH_SOCK

如果要在 chroot 中使用(即從 切換到),也需要/etc/sudoers在 chroot 中進行此更改。sudorootalice

下面是一般使用者檢視的 chroot 內代理套接字的範例。

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

相關內容