
如果我有一個伺服器 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@serverA
user2@serverB
serverA
/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。