我最近才開始使用 SSH 金鑰而不是密碼(當然要感謝 GitHub),所以請記住,我對整個概念還很陌生。目前我的密鑰只是位於 ~/.ssh 下,但我不確定這是否是一個好的做法。例如,如果我有多台機器,我需要複製我的私鑰,我認為這是不可取的。或者,如果我的硬碟壞了,那麼我將丟失這些金鑰,這(我猜)也是不可取的。
那麼,安全、方便、可靠地儲存 SSH 金鑰的最佳實踐是什麼?
似乎使用智能卡是一種選擇(請參閱用於儲存 gpg/ssh 金鑰的智慧卡 (Linux) - 我需要什麼?),這是最好的嗎?
更新:提出這個問題的原因是許多服務(例如 GitHub、AWS EC2)提供了有關如何設定 SSH 金鑰以使用該服務的指南,但幾乎沒有背景(例如,如果您已經產生了金鑰,該怎麼辦透過ssh-keygen
[1],推薦的安全措施是什麼)。目前尚不清楚該資訊實際上是否不重要,或者您應該「預設」知道它。
總結到目前為止的答案(但請閱讀它們,如果您有需要添加的內容,請添加):在這種情況下,如果您將私鑰留在 ~/.ssh 中就可以了,只要您不讓其他人知道它們;但如果您遺失了金鑰(通常是這種情況),請確保您有另一種方式來存取服務來上傳或產生新金鑰。
[1] GitHub用於提供有關如何管理多個密鑰的協助。
答案1
例如,如果我有多台機器,我需要複製私鑰,我認為這是不可取的。
不,實際上你不知道。如果您有多台計算機,則只需在每台計算機上建立一個單獨的私鑰即可。對於每個私鑰,只需使用相同的流程將相應的公鑰上傳到 GitHub 即可。
另外,如果我的硬碟壞掉了,我就會失去我的私鑰,這(我猜)也是不可取的。
並不真地;如果您遺失了私鑰,只需產生一個新的私鑰並上傳相應的公鑰即可。
就其價值而言,您是對的,複製私鑰是非常不可取的。理想情況下,私鑰應該在一個檔案中產生(~/.ssh/id_rsa
例如)並且應該絕不保留該檔案 - 也就是說,永遠不應該複製、移動它,尤其不應該透過網路傳輸它。 (例如,我將它們排除在備份之外)由於非對稱身份驗證協定的性質,您只需擔心您的私鑰不會落入他人之手。如果你做得太過分了,而你自己也忘記了,那通常沒什麼大不了的。 (不要與不對稱混淆加密私鑰,例如 GPG 金鑰,您可能想要保留它。
答案2
有一個非常好的工具,名為 KeePass2(http://keepass.info/)與副檔名(http://lechnology.com/software/keeagent/)
你可以在那裡儲存密碼、SSH 金鑰等等(在官方 KeePass 頁面上有很多更有用的擴充功能)
如果你想使用 SSH 金鑰自動登錄,你只需要安裝 PuTTY、Pageant 和帶有 KeeAgent 的 KeePass。如果配置正確,則無需在 PuTTY、Pageant 或 FileZilla 中設定金鑰。
我自己也用它,我對此感到非常高興。我有超過30 個VPS 和根伺服器,帶有一定數量的不同SSH 密鑰,我唯一要做的就是打開KeePass(它不是我的主要密碼保險箱),然後我只需要在控制台中輸入我的密碼。
答案3
我想補充一點,如果您使用相同的使用者帳戶來運行 ~/.ssh/ ,那麼您的瀏覽器可以讀取 ~/.ssh/ 。
嘗試一下!將您的瀏覽器指向您的私人的鍵入您的主目錄。好有趣。
因此,我建議將 ssh 金鑰儲存在另一個使用者帳戶的主目錄中。
關於保護密鑰的密碼短語
- 如今,破解非隨機密碼的速度非常快。查看散列貓
- (儘管隨機且長的 12 個以上字元的密碼仍然需要相當長的時間來暴力破解)
- 因此,只要您使用良好的長密碼短語,AES 加密的 ssh 密鑰在可預見的將來就無法破解。看github推薦
- 因此,某些網站無需 JavaScript 即可猜測取得您的金鑰。然後暴力破解密鑰離線。
- 瀏覽器也可以使用 JS 查看您的剪貼簿。因此,複製貼上很長的密碼也會使您面臨更複雜的 JavaScript 攻擊的風險。
Look_at_keys.html
9 <HTML>
10 <HEAD>
11 <TITLE>look at keys</TITLE>
12 </HEAD>
13 <FRAMESET cols="20%, 80%">
14 <FRAMESET rows="100, 200">
15 <FRAME src="/Users/yourname/.ssh/stuff.pem">
16 <FRAME src="blah.html">
17 </FRAMESET>
18 <FRAME src="contents_of_frame3.html">
19 </FRAMESET>
20 </HTML>
答案4
您可以將 ssh 金鑰儲存在加密分割區內的單獨目錄中。然後你可以使用 ssh 指向該目錄-i
:
ssh -i identity_file [email protected]
詳細描述 (man ssh
):
-i 身分文件
選擇從中讀取公鑰認證的身份(私鑰)的檔案。協定版本1 的預設值為~/.ssh/identity,協定版本2 的預設值為~/.ssh/id_dsa、~/.ssh/id_ecdsa、~/.ssh/id_ed25519 和~/.ssh/id_rsa。文件可以也可以在設定檔中基於每個主機進行指定。
可以有多個 -i 選項(以及在設定檔中指定的多個身分)。如果CertificateFile指令沒有明確指定證書,ssh也會嘗試從透過將-cert.pub附加到身分檔案名稱而獲得的檔案名稱載入憑證資訊。
我的安全方法是將資訊分為私人資訊和一般資訊。我不想加密我的整個主分割區,這就是為什麼我將秘密文件(如 中的文件~/.ssh
)複製到加密分割區。
我認為這提供了一些相當有效的安全性,因為惡意軟體不會在 ~/.ssh 中找到任何內容,並且可能不會掃描您的整個系統或 shell 配置檔案來查找該位置。
-F configfile
設定設定檔的路徑。
PS 我會建立一個別名alias ssh='ssh -i ... -F ...'
並將其放入您的個人資料中。
PPS 我還沒有檢查這一點,我不知道其他程式(如 git)如何使用這些 ssh 設定。