Calvert's murmur

升級你的 SSH 金鑰!

2016-10-05

約 5011 字 / 需 27 分鐘閱讀

原文:Gert van DijkUpgrade your SSH keys!

無論你是軟體開發人員或系統管理員,我敢打賭你正在使用 SSH 金鑰。比起使用密碼來推送提交到 Github 或是管理 Unix 系統,透過 SSH 公開金鑰驗證是最佳的方法。然而,隨著時光飛逝,很多人都使用舊金鑰而沒有意識到需要產生一個新的來提供私密資料更好的保護。在這篇文章,我將示範如何平穩的轉換到 Ed25519 金鑰、你為什麼會想要它以及展示一些技巧和訣竅。

長話短說,使用 ssh-keygen -o -a 100 -t ed25519 來產生新的金鑰並指定一個高強度的通關密語,如果你需要平穩的轉換,請繼續往下閱讀。

我計劃發佈更多 SSH 技巧和訣竅,所以請關注我的部落格。這篇文章的重點是關於作為使用者公開金鑰驗證的 SSH 金鑰。

DSA 和 RSA 1024 位元已經廢止

如果你已經使用預設選項建立金鑰超過四年,它可能不安全(RSA < 2048 位元)。更糟的是,我最近看到了推特迷、同事和朋友還在使用 DSA 金鑰(OpenSSH 格式裡的 ssh-dss 類型)。那是一種類似於 RSA 的金鑰類型,但長度受限於 1024 位元且被推薦了很長一段時間。它顯然不安全,且被最近的 OpenSSH 版本以正當理由拒絕(請參見 7.0 更新日誌)。

難過的是,我看到關於如何重新啟用支援 DSA 金鑰的文章,而不是轉移到一種更安全的金鑰類型。真的,依照指示更改 PubkeyAcceptedKeyTypesHostKeyAlgorithms 的設定是不明智的(host keys are for a later post)。取而代之,升級你的金鑰!

確定你目前的狀況

列出你的所有金鑰:

$ for keyfile in ~/.ssh/id_*; do ssh-keygen -l -f "${keyfile}"; done | uniq
  • DSA 或 RSA 1024 位元:不安全的
  • RSA 2048:建議更改
  • RSA 3072/4096:好極了,但是 Ed25519 有一些好處!
  • ECDSA:要看情況,建議更改
  • Ed25519:哇!太酷了!但是可以抵抗暴力破解嗎?

平穩的轉換,我保證。

你可能在想⋯「我用金鑰很久了,我不想現在到處更改。」很有道理,但你不需要到處更改!好消息是,你可以有多個金鑰在系統上,而且你的 SSH 客戶端會自動選擇正確的金鑰給正確的系統。

這是 SSH 協定的一部分,它可以提供多個金鑰,而伺服器會挑選一個,你的客戶端必須透過質詢證明來擁有私鑰。加入一些參數(-vvv)在 SSH 連線指令來觀看運作情形。此外,若有使用 SSH 金鑰管理器,你可以載入多個金鑰,它會識別所有金鑰。很簡單吧。

你會喜歡 Twisted Edwards curve

最常見的金鑰類型是 RSA,也被稱為 ssh-rsa。它的相容性很好但也緩慢,若使用位元長度小於 2048 位元建立,具有潛在危險性。我們剛剛得知你的 SSH 客戶端可以處理多個金鑰,所以趕緊使用最新快速的橢圓曲線加密法,並享受它所提供非常緊湊的金鑰格式!

Ed25519 金鑰很短。非常短。如果你已經習慣了從系統複製多行字元到其它系統,你會對於它的大小感到驚喜。公鑰的長度僅有 68 個字元。驗證速度也比高強度的 RSA(3072+ 位元)更快。

Ed25519 金鑰可透過在 ssh-keygen 指令加上 -t ed25519 選項來產生。

Ed25519 是使用 Twisted Edwards curve 實作的 EdDSA。

增加對暴力破解密碼的抵抗

當產生金鑰對時,會詢問你一個密碼短語來加密私鑰。若你將永遠失去私鑰,它應該保護他人冒充你,因為它會被密碼短語加密。要真正防止這種情況,應該確保防止密碼短語容易暴力破解。

OpenSSH 金鑰產生器提供了兩種選項,以抵抗暴力破解密碼:使用新的 OpenSSH 金鑰格式並增加金鑰推導函數的使用次數。它會降低解鎖金鑰的速度,但也防止了惡意使用者高效的暴力破解。在你的系統實驗推倒函數的使用次數,約從 100 次開始。在我的系統大約需要 1 秒來解密,且每天用金鑰管理器載入一次。在我看來,是可以接受的。

透過 ssh-keygen 使用 -o 選項並利用 bcrypt 所搭載的嶄新金鑰推導函數建立新的 RFC4716 金鑰格式。使用 -a <num> 選項指定推導函數的使用次數。

事實上,當建立一個 Ed25519 金鑰時,-o 選項看來是預設值。

OpenSSH 的手冊並沒有真正關於「新」格式的解釋。我發現 www.tedunangst.com 內的這篇文章非常有用:「新的 OpenSSH 金鑰格式及 bcrypt pbkdf」。

產生新的吸引人的 Ed25519 金鑰

提示:使用相同的密碼短語在你所有的金鑰類型來獲得更多便利性。(參見:知道多個金鑰的 SSH 客戶端。)

$ ssh-keygen -o -a 100 -t ed25519
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/gert/.ssh/id_ed25519.
Your public key has been saved in /home/gert/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256: [...] gert@hostname
The key's randomart image is: [...]

注意那行「Your identification has been saved in /home/gert/.ssh/id_ed25519」。你現在的 RSA/DSA 金鑰都在相同的 ~/.ssh 資料夾內。如同其它金鑰,你可以複製在 ~/.ssh/id_ed25519.pub 的公鑰到目的主機以便驗證。

知道多個金鑰的 SSH 客戶端

所有在預設路徑內的金鑰會被 SSH 客戶端應用程式自動偵測,包含透過 ssh-add 的 SSH 金鑰管理器。所以,如果你像以前一樣使用 ssh、scp、rsync 等應用程式⋯

$ ssh user@host

現在將提供多個公鑰給伺服器,伺服器會對匹配的項目要求證明所有權以便驗證。你日常使用的 ssh-add 指令不會改變,且自動找到 Ed25519 金鑰:

$ ssh-add
Enter passphrase for /home/gert/.ssh/id_rsa:
Identity added: /home/gert/.ssh/id_rsa (gert@hostname)
Identity added: /home/gert/.ssh/id_ed25519 (gert@hostname)

它不僅找到這些金鑰,也載入它們僅透過輸入一次密碼短語(因為是相同的)!

我們現在已經達成重要的目標。在沒有改變你任何的日常工作下,我們可以慢慢的更改原端主機上現有的設定來接受 Ed25519 金鑰。在此期間 RSA 金鑰仍然可運作。很棒對吧!?

變更或設定密碼短語

如果你害怕這會改變你的金鑰,別擔心。使用密碼短語加密的金鑰對私有部分,僅存在於你的本地機器上。只要你喜歡,可以經常改變它。這個建議是防止金鑰落入不法分子手中時遭到濫用。重複所有的金鑰檔案,以確保新的金鑰格式使用 100 次 bcrypt KDF:

$ ssh-keygen -f ~/.ssh/id_rsa -p -o -a 100

升級你現在的 RSA 金鑰

現在使用 Ed25519 在大多數情況下會(也應該)正常運作,但是舊式系統可能不支援。最好的應急辦法是使用高強度 RSA 金鑰對。

雖然 OpenSSH 客戶端支援多個 RSA 金鑰,它需要設定或命令列選項來指定路徑,所以相當容易出錯。取而代之,我建議你升級現有的金鑰,這樣做會讓事情變得簡單。根據你目前的 RSA 金鑰強度,你可以立即或悠閒的更新。

如果你仍然有弱的 RSA 金鑰,將它從標準路徑移出來並產生一個長度 4096 位元的新金鑰:

$ mv ~/.ssh/id_rsa ~/.ssh/id_rsa_legacy
$ mv ~/.ssh/id_rsa.pub ~/.ssh/id_rsa_legacy.pub
$ ssh-keygen -t rsa -b 4096 -o -a 100

如果你使用金鑰管理器,手動將其指定到所有的金鑰:

$ ssh-add ~/.ssh/id_rsa ~/.ssh/id_rsa_legacy ~/.ssh/id_ed25519

一旦你完成了所有遠端目標的更新,你可以回到便利的方式,讓它自動找到新的 RSA 和 Ed25519 金鑰;只要忽略金鑰檔案參數。

支援 Ed25519 的軟體

自 OpenSSH 6.5 開始支援,在提供給工作站的 Unix 作業系統也已經採用。Ubuntu 14.04+、Debian 8+、CentOS/RedHat 7+ 等等都支援它了。(如果你有關於 Mac OS X 的詳細訊息,請留個訊息,無法快速搜尋到它)。某些軟體如自訂的桌面版金鑰管理器也許有幾個不喜歡新的金鑰的原因(見下文「我的 Gnome-keyring 不再運作」)。

順帶一提,Github 上也運作的很好。不幸的是,Launchpad 和 Gerrit 程式碼審查看來需要 RSA 金鑰。在 Windows 使用 PuTTY 嗎?見下文。

我的 Gnome-keyring 不再運作

Gnome-keyring 被用在 Ubuntu Unity,無法讀取新的 RFC4716 格式金鑰,但回報成功。這是臭蟲。更多細節在我的 AskUbuntu Q&A 文章。我建議停用 Gnome keyring 作為 SSH 金鑰管理器,改用普通的 OpenSSH 金鑰管理器來代替。

我在 Windows 使用 PuTTY

抱歉,我沒有使用 PuTTY,但是首先要確定已經升級。根據願望清單項目建議,從 2015 年末版本開始支援 Ed25519。一般來說,我對於它實作的安全功能的速度不是太興奮。

這是最安全的 SSH 金鑰對?

我們已經採取了一些重要措施,但是離最安全還很遠。在處理高保證環境時,如本文所述,因為在記憶體中保存著未加密的私鑰,我強烈反對使用金鑰。取而代之,使用安全硬體(智慧卡)來避免洩露金鑰甚至從記憶體轉存。它未涵蓋在此文章,主要是因為它需要你購買硬體,其次是因為依賴於設備的限制。一個很好的解決方案是利用可能已經內建在你電腦的可信賴平台模組,不過那肯定值得用其它文章來解說。