banner
niracler

niracler

长门大明神会梦到外星羊么?
github
email
steam_profiles
douban
nintendo switch
tg_channel
twitter_id

用三分鐘對你個人電腦上的 SSH 私鑰進行加密吧 - v1.0

背景 - 為什麼要使用 SSH 密鑰並對其加密?#

先來拋出三個理由,若不想看的可以直接跳到操作步驟。(不需 2 分鐘就能操作完)

第一点 - 應該使用 SSH 密鑰而不是密碼#

在日常的工作中,我們頻繁地與 gitrsync 和 ssh 等工具打交道,傳統的密碼身份驗證方式可能會變得麻煩且容易受到攻擊。可能會有以下問題:

  • 被窺探風險:傳統的密碼輸入方式可能會被窺視者觀察到,從而導致安全性問題。而使用 SSH 密鑰則無需輸入密碼,大大減少了窺探風險。
  • 密碼管理的複雜性:在多台遠程伺服器上使用不同密碼,可能會導致密碼的混淆和遺忘。而使用 SSH 密鑰,你只需要管理少數幾個密鑰對,大大簡化了密碼管理的複雜性。
  • 遠程伺服器的安全性:使用密碼登錄遠程伺服器存在被惡意攻擊者輕易攻擊的風險,而 SSH 密鑰的使用使得攻擊者更難偽造身份進行訪問,提高了遠程伺服器的安全性。

第二點 - 任何情況下 SSH 私鑰都要加密#

即使使用 SSH 密鑰,仍然需要注意私鑰的保護。不要貪方便不給 SSH 私鑰加密~~(很多人都是這樣吧?)

  • 私鑰是身份驗證的核心:它等同於你系統和數據的主門鑰匙。如果私鑰暴露,惡意方可能通過偽造你的身份來訪問系統、竊取敏感信息,甚至進行未授權的操作。
  • 私鑰可能會在非安全環境中存在:如在本地計算機、移動設備還是通過網絡傳輸,這些環境都是不安全的。通過加密私鑰,即使私鑰在未經授權的情況下被訪問,也不會立即暴露你的數據和系統。
  • 若設備遭到盜竊、丟失或被他人訪問:加密的私鑰會提供額外的安全層。即使惡意者能夠獲得私鑰文件,其加密狀態仍將阻礙其直接使用。
  • 惡意軟件和病毒:可能會掃描你的系統以尋找未加密的私鑰文件。例如大家電腦上總會有幾個盜版軟件吧?如果私鑰加密,它們無法輕易獲取到敏感信息,從而減少了受到攻擊的風險。

有時候甚至有人貪方便將明文私鑰用 QQ 還是什麼的來傳輸到另外的電腦,這其實是很危險的行為。這可是明文的私鑰~~

第三點 - 使用 SSH-Agent 減少輸入密碼的次數#

單純使用加密的私鑰其實並不能真正解決輸入密碼的問題,它只是將你所有的密碼扭成用同一個密碼而已。而且我們也不可能每一次 git pull 代碼都輸入一次私鑰的密碼吧。所以為了解決頻繁輸入密碼的繁瑣性以及密碼洩露的風險,我們此處引入 SSH-Agent。

它能夠 暫存儲解密的私鑰,使用戶只需在會話開始時輸入一次密碼,之後的連接將自動使用已解密的私鑰。從而大幅減少密碼輸入次數,避免了密碼被窺視或截獲的可能性。同時也對於需要頻繁與多個遠程伺服器互動的用戶,SSH-Agent 可以顯著提高工作效率

BOSS 語錄: agent 本質是把 key 加載到內存了,內存洩漏 key 的可能性是有,但是需要非常複雜的方式和漏洞,也要一定的權限,而且現在 os 都有內存地址隨機化來抵抗了

操作步驟#

對本地私鑰進行加密#

假設你本地已經有現成的 SSH 密鑰對了。(使用 GitHub 的大家應該都是有的,沒有的話可以使用 ssh-keygen 生成,或者看文末的 SSH 相關的文章)

下面這個就是對本地私鑰進行加密的命令<id_rsa_path> 是你本地的 ssh 私鑰的路徑,一般為 ~/.ssh/id_rsa

ssh-keygen -p -f <id_rsa_path>

好了,這就完成加密了。下一步就是啟動 ssh-agent。

使用 SSH-Agent 管理解密的私鑰#

這就是簡易的啟動 ssh-agent 並將你電腦上的默認的密鑰對加載到 agent 裡面的 Shell 代碼:

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent`
    ssh-add # <id_rsa_path>,不加就是用默認值
fi

但這種方式是有很多問題的,你重新開一個 Shell 的會話 agent 就要重新開了,並且你前面的會話結束的時候要是沒有關 agent,那麼該 agent 會一直存活在你電腦的進程裡面。

持久化 SSH-Agent 設置以實現便利和安全#

⚠️⚠️⚠️ 注意:該方案僅僅適合於個人電腦 ⚠️⚠️⚠️

要解決上述問題,我們建議將 SSH-Agent 的啟動設置添加到你的 shell 配置文件中,以便每次開啟終端會話時都能自動啟動 SSH-Agent 並加載你的私鑰。這將提供更大的便利性和安全性。

下面是示例代碼,請將它添加到你的 ~/.bashrc 或 ~/.bash_profile 文件中( zsh 則是 ~/.zshrc~/.zprofile,我個人是推薦放 rc 文件裡面的,畢竟很多情況下是觸發不了 login shell 的機制的):

fish 版本請看這裡

請加到這個文件裡面 ~/.config/fish/config.fish

set SSH_ENV_FILE "$HOME/.ssh/agent-environment"
set SSH_TIMEOUT 86400 # 24 hours in seconds

function ssh_start_agent
    ssh-agent -c -t "$SSH_TIMEOUT" > "$SSH_ENV_FILE"
    chmod 600 "$SSH_ENV_FILE"
    source "$SSH_ENV_FILE"
    ssh-add # [<id_rsa_path>] Change to your path
end

if test -f "$SSH_ENV_FILE"
    source "$SSH_ENV_FILE"
    if not ps -p "$SSH_AGENT_PID" > /dev/null
        ssh_start_agent
    end
else
    ssh_start_agent
end
SSH_ENV_FILE="$HOME/.ssh/agent-environment"
SSH_TIMEOUT=86400 # 24 hours in seconds

ssh_start_agent(){
    ssh-agent -t $SSH_TIMEOUT | sed 's/^echo/#echo/' > "${SSH_ENV_FILE}"
    echo "Initialising new SSH agent succeeded"
    chmod 600 "${SSH_ENV_FILE}"
    . "${SSH_ENV_FILE}"
    ssh-add # [<id_rsa_path>] Change to your path
}

if [ -f "${SSH_ENV_FILE}" ]; then
    . "${SSH_ENV_FILE}"
    if ! ps -p "$SSH_AGENT_PID" > /dev/null; then
        start_ssh_agent
    fi
else
    ssh_start_agent
fi

(這就是 stackoverflow 裡面的高分例子,稍微微調了一下有效時間,電腦一直不關機的話,一天需要打一次密碼。雖然會在 ssh forward 情況下存在問題,但個人電腦用是綽綽有餘了)

這段代碼將在每次開啟 shell 會話時檢查 SSH-Agent 是否已運行。如果沒有運行,它將自動啟動並加載你的私鑰。通過這種方式,你將始終享受到 SSH-Agent 帶來的便利和安全性。(真看不懂可以找找 ChatGPT,其實關鍵就在於用文件存起來了 SSH-Agent 的 SSH_AUTH_SOCK 等信息,讓其他的 shell 的會話也可以讀得到

好了,其實操作就上面那麼多

使用 ssh-agent 的注意事項#

當然,使用 ssh-agent 其實也不是說就真的特別安全然後沒有後顧之憂了,其實使用 ssh-agent 還是會有很多問題的。以下就是使用 ssh-agent 的一些注意事項:

  1. 切勿在其他人擁有 root 權限的計算機上運行 ssh-agent: 如果在受信任程度較低的計算機上運行 ssh-agent,惡意用戶可能通過 ssh-agent 訪問你的私密數據,從而危及你的安全。(日常不使用電腦的時候也要進行鎖屏,共用的電腦也不要運行)
  2. 代理連接轉發的謹慎使用ssh-agent 可以允許代理連接轉發,這在某些情況下非常方便。然而,只應該將代理連接轉發到你信任的計算機上,以防止你的私密數據被不可信的主機獲取。
  3. 登出時卸載密鑰和代理:在你登出計算機或退出 shell 會話時,請確保已卸載密鑰和 ssh-agent 以避免無授權的訪問。這可以通過使用 ssh-agent -k 命令來實現。

使用 ssh-agent 時,請遵循以上注意事項以確保你的私密數據和系統安全。

後記#

其實管理 ssh 密鑰的方案不單單是 ssh-agent ,還可以試一下用 1password 的 cli ,雖然說我沒怎麼用過。

這篇文章,怎麼說呢,其實也就只是我本人的一些安全記錄而已,很有可能是在班門弄斧。這一個後面應該會寫成一個系列吧,網路安全系列,盡量就是將我生活當中的一些網路安全的知識給用上。

注意:本文所述內容僅代表個人觀點和經驗分享,並非絕對準確的安全建議。如需更詳細和專業的安全建議,請諮詢安全專家或相關文獻資料。

參考資料#

  1. SSH 教程 - 網道: 關於 ssh 的基礎知識可以看阮一峰的這個教程
  2. 使用 ssh-agent,和如何安全地只輸入一次 ssh 密碼:裡面有提到了 ssh-agent 在堡壘機的轉發的場景,我這邊沒有對應的使用場景,於是我文章裡面就不提了
  3. 使用 ssh-agent 的陷阱,和如何安全使用代理:與上面文章是同一個作者,說到了一些使用 ssh-agent 的注意事項。

更新#

  • 2023-08-17 19:11 v0.7 添加 fish 版本的代碼
  • 2023-08-22 22:17 v0.8 被同事吐槽說是加粗的部分太多了,以至於文章看上去非常花里胡哨,影響觀感體驗。顧改之。
  • 2023-08-22 23:05 v1.0 微調移除了一點廢話,基本能有及格分數了。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。