我一直在 Debian 中為不同的帳戶(即 Digital Ocean、GitHub 和 Bitbucket)建立多個 SSH 金鑰,但它很快就會變得混亂。
列出 .ssh 資料夾中的內容,我得到:
digOcn digOcn.pub github github.pub id_rsa id_rsa.pub
(我使用id_rsa
Bitbucket 的密鑰。)
我做了這eval 'ssh-agent -s'
件事,然後“添加”鍵,如下所示:
ssh-add ~/.ssh/github
(然後輸入密碼)ssh-add ~/.ssh/id_rsa
(然後輸入密碼)ssh-add ~/.ssh/digOcn
(當我嘗試新增 時digOcn
,它顯示「權限被拒絕」。我不會試圖sudo
避免弄亂某些東西,而且因為其他按鍵不需要sudo
。)
這是令人困惑的部分:表演ssh-add -l
給了我這個:
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 /home/USER/.ssh/id_rsa (RSA)
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 /home/USER/.ssh/github (RSA)
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 github (RSA)
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 USER@COMPUTER_NAME (RSA)
是的,我過去曾添加過 SSH 金鑰,但我無法追溯我所做的事情。這可能就是為什麼兩者都有/home/USER/.ssh/github
和 github
。
我做錯了什麼?我應該如何組織我的 SSH 金鑰?
答案1
首先,不同的帳戶使用不同的金鑰並沒有什麼問題。對於互動式 shell 來說,這幾乎是大材小用,但是當您處理其他非互動式服務時,這樣做是有正當理由的。例如,幾年前 GitHub 開始允許使用更強的 SSH 金鑰,而 Bitbucket 則堅持使用較弱的金鑰一段時間。當時正確的做法是使用不同的金鑰來存取 GitHub 和 Bitbucket。
另一個例子是rsync
。例如,如果您用於rsync
將檔案部署到 Web 伺服器,那麼您可能需要專用的 SSH 金鑰。這些允許您設定與互動式帳戶通常使用的權限不同的權限。
回到管理多個金鑰的問題:SSH 允許您為不同的目的地設定不同的選項。為此,您需要編輯~/.ssh/config
以下文件:
Host bitbucket.org
User hg
IdentitiesOnly yes
IdentityFile /home/user/.ssh/bitbucket
Host github.com gist.github.com
User git
IdentitiesOnly yes
IdentityFile /home/user/.ssh/github
該文件~/.ssh/config
應該具有權限 0600(我現在不記得這是否是由 SSH 強制執行的,但這肯定不會有什麼壞處)。
當然,您也可以對互動式 shell 使用相同的機制,因此請設定遠端使用者名稱(如果與本機使用者名稱不同)、遠端連接埠、縮短主機名稱等內容。
Host sm
Hostname sphygmomanometer.example.com
User human
Port 2222
然後你就可以運行
ssh sm
代替
ssh -p 2222 [email protected]
也允許使用通配符:
Host *
ControlPath ~/.ssh/ctl-%u-%r-%h-%p
ControlMaster auto
ControlPersist 5m
請閱讀手冊以了解更多詳細資訊。
最後但並非最不重要的:不「做事eval 'ssh-agent -s'
」。與一般看法相反,這會帶來嚴重的安全隱患。正確的做法是這樣的:
ssh-agent /bin/bash
ssh-add
(然後在出現提示時輸入您的金鑰密碼)。僅此而已,不要逐個按鍵或任何其他方式進行操作。
這會執行一個新的 shell,在其中載入您的金鑰,當您想要撤銷存取權限時,只需使用exit
此 shell。如果您“執行該eval 'ssh-agent -s'
操作”,那麼身份驗證代理將在您登出後長時間運行,並且它們可以(並且最終將)用於未經授權的存取。
編輯:試試這個小實驗:
eval $(ssh-agent -s)
- 註銷,或終止終端
- 重新登錄,或開啟新終端
pgrep ssh-agent
沒有人會殺死這些ssh-agent
s,它們會一直徘徊直到下一次reboot
,準備被最新的惡意軟體使用。