ssh-agent 轉發和 sudo 到另一個用戶

ssh-agent 轉發和 sudo 到另一個用戶

如果我有一個伺服器 A,我可以使用 ssh 密鑰登錄,並且我有能力“sudo su - otheruser”,我會丟失密鑰轉發,因為環境變數已刪除這個套接字只能由我的原始使用者讀取。有沒有一種方法可以透過「sudo su - otheruser」橋接金鑰轉發,這樣我就可以使用轉發的金鑰在伺服器 B 上執行操作(在我的情況下是 git clone 和 rsync)?

我能想到的唯一方法是將我的金鑰添加到 otheruser 和“ssh otheruser@localhost”的授權金鑰中,但這對於我可能擁有的每個用戶和伺服器組合來說都是很麻煩的。

簡而言之:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

答案1

sudo正如您所提到的,出於安全原因,環境變數被刪除。

但幸運的sudo是它是相當可配置的:env_keep由於/etc/sudoers.

對於代理轉發,您需要保留SSH_AUTH_SOCK環境變數。為此,只需編輯您的/etc/sudoers設定檔(始終使用visudo)並將env_keep選項設定為適當的使用者。如果您希望為所有使用者設定此選項,請使用Defaults以下行:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers更多細節。

現在您應該能夠執行類似的操作(前提是user1的公鑰存在於和~/.ssh/authorized_keys中,並且的文件設定如上所示):user1@serverAuser2@serverBserverA/etc/sudoers

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works

答案2

sudo -E -s
  • -E 將保護環境
  • -s 運行命令,預設為 shell

這將為您提供一個 root shell,其中仍會載入原始金鑰。

答案3

允許其他用戶$SSH_AUTH_SOCK在切換到檔案及其目錄之前,例如透過正確的 ACL 來存取它們。

此範例假設Defaults:user env_keep += SSH_AUTH_SOCK/etc/sudoers「主機」電腦上:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

更安全,也適用於非 root 用戶

答案4

您始終可以使用代理轉發 ssh 到 localhost,而不是使用 sudo:

ssh -A otheruser@localhost

缺點是您需要再次登錄,但如果您在 screen/tmux 選項卡中使用它,那隻是一次性的工作,但是,如果您與伺服器斷開連接,套接字將(當然)再次損壞。因此,如果您無法始終保持 screen/tmux 會話打開,那麼這並不理想(但是,SSH_AUTH_SOCK如果您很酷,可以手動更新您的環境變數)。

另請注意,使用 ssh 轉送時,root 始終可以存取您的套接字並使用您的 ssh 驗證(只要您使用 ssh 轉送登入)。因此請確保您可以信任 root。

相關內容