<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Key-Management on Commentary of Takao</title><link>https://takao.blog/zh-tw/tags/key-management/</link><description>Recent content in Key-Management on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Commentary of Takao</copyright><lastBuildDate>Thu, 20 Jun 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://takao.blog/zh-tw/tags/key-management/index.xml" rel="self" type="application/rss+xml"/><item><title>使用 Vaultwarden 和 Bitwarden SSH 代理程式管理 SSH 金鑰</title><link>https://takao.blog/zh-tw/web/vaultwarden-ssh-key/</link><pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/zh-tw/web/vaultwarden-ssh-key/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vaultwarden-ssh-key-zh-tw.png" alt="Featured image of post 使用 Vaultwarden 和 Bitwarden SSH 代理程式管理 SSH 金鑰" /&gt;&lt;h2 id="為什麼將-ssh-金鑰儲存在密碼管理器中"&gt;為什麼將 SSH 金鑰儲存在密碼管理器中
&lt;/h2&gt;&lt;p&gt;SSH 金鑰是對遠端伺服器、Git 供應商和內部基礎架構進行身份驗證的黃金標準。然而，大多數開發人員將它們儲存為普通檔案在 &lt;code&gt;~/.ssh/&lt;/code&gt; 下 - 不受保護、未同步且未經審核。將 SSH 金鑰移至 Vaultwarden（或 Bitwarden）解決了三個基本問題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;集中管理&lt;/strong&gt;：所有金鑰都位於一個保管庫中，而不是分散在各個電腦上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨裝置同步&lt;/strong&gt;：新增一次金鑰；它會自動出現在每個裝置上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;審計追蹤&lt;/strong&gt;：伺服器會記錄每個按鍵存取和用戶端操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bitwarden SSH 代理程式彌合了鎖定的保管庫和透明地使用 SSH 金鑰的日常需求之間的差距。&lt;/p&gt;
&lt;h2 id="bitwarden-ssh-代理程式概述"&gt;Bitwarden SSH 代理程式概述
&lt;/h2&gt;&lt;p&gt;Bitwarden SSH 代理程式是一個輕量級守護程序，它透過標準 &lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; 介面公開儲存在保管庫中的 SSH 金鑰。當 &lt;code&gt;ssh&lt;/code&gt; 或 &lt;code&gt;git&lt;/code&gt; 需要金鑰時，它會與代理程式通信，代理請求 Bitwarden CLI (&lt;code&gt;bw&lt;/code&gt;) 從保管庫中取得對應的私鑰。金鑰材料永遠不會接觸磁碟 - 它位於加密的保管庫中，僅在需要時在記憶體中解密。&lt;/p&gt;
&lt;p&gt;此方法適用於任何 OpenSSH 相容客戶端：&lt;code&gt;ssh&lt;/code&gt;、&lt;code&gt;scp&lt;/code&gt;、&lt;code&gt;rsync&lt;/code&gt;、&lt;code&gt;git&lt;/code&gt;、&lt;code&gt;mosh&lt;/code&gt; 以及使用 SSH 代理協定的 GUI 工具。&lt;/p&gt;
&lt;h2 id="先決條件"&gt;先決條件
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;要求&lt;/th&gt;
					&lt;th&gt;筆記&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Vaultwarden 伺服器（自架）或 Bitwarden 雲端&lt;/td&gt;
					&lt;td&gt;CLI 登入需要 API 端點&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bitwarden CLI (&lt;code&gt;bw&lt;/code&gt;)&lt;/td&gt;
					&lt;td&gt;官方命令列客戶端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OpenSSH 用戶端&lt;/td&gt;
					&lt;td&gt;隨 Linux、macOS 和 Windows 10+ 一起提供&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; 支援&lt;/td&gt;
					&lt;td&gt;各大平台皆可&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="安裝-bitwarden-cli"&gt;安裝 Bitwarden CLI
&lt;/h2&gt;&lt;h3 id="linux--macos"&gt;Linux / macOS
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Download the CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -Lo bw.zip &lt;span style="color:#e6db74"&gt;&amp;#34;https://vault.bitwarden.com/download/?app=cli&amp;amp;platform=linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unzip bw.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo install bw /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm bw.zip bw
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="windowspowershell"&gt;Windows（PowerShell）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Using winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget install Bitwarden.CLI
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Or download manually&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Invoke-WebRequest -Uri &lt;span style="color:#e6db74"&gt;&amp;#34;https://vault.bitwarden.com/download/?app=cli&amp;amp;platform=windows&amp;#34;&lt;/span&gt; -OutFile bw.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Expand-Archive -Path bw.zip -DestinationPath C:\tools\bw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$env:Path += &lt;span style="color:#e6db74"&gt;&amp;#34;;C:\tools\bw&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;驗證安裝：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bw --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="配置-ssh-代理"&gt;配置 SSH 代理
&lt;/h2&gt;&lt;p&gt;Bitwarden CLI 包含一個以 &lt;code&gt;bw serve&lt;/code&gt; 開頭的內建 SSH 代理伺服器：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Start the agent (runs in foreground — use a terminal multiplexer or daemonize it)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bw serve --port &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;對於持久性後台會話，請建立專用使用者服務或使用 &lt;code&gt;screen&lt;/code&gt; / &lt;code&gt;tmux&lt;/code&gt;。在有 systemd 的 Linux 上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Description&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Bitwarden SSH Agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;After&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;network.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ExecStart&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/usr/local/bin/bw serve --port 8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Restart&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;on-failure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;User&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;youruser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;WantedBy&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;default.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;環境設定&lt;/strong&gt; — 將 &lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; 指向代理程式的 Unix 套接字：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export SSH_AUTH_SOCK&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style="color:#e6db74"&gt;/.bitwarden-ssh-agent.sock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;將此行新增至您的 &lt;code&gt;~/.bashrc&lt;/code&gt;、&lt;code&gt;~/.zshrc&lt;/code&gt; 或 shell 設定檔中，以便它在會話中保持不變。&lt;/p&gt;
&lt;h2 id="將-ssh-金鑰新增至-vault"&gt;將 SSH 金鑰新增至 Vault
&lt;/h2&gt;&lt;p&gt;Vaultwarden 支援專用的 &lt;strong&gt;SSH 金鑰&lt;/strong&gt; 專案類型，該類型將私鑰及其對應的公共金鑰儲存為單一保管庫條目。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;開啟您的保管庫（Web UI 或用戶端）。&lt;/li&gt;
&lt;li&gt;按一下 &lt;strong&gt;新增項目&lt;/strong&gt; → &lt;strong&gt;SSH 金鑰&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;填寫欄位：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;名稱&lt;/strong&gt;：例如“GitHub 部署金鑰”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;私鑰&lt;/strong&gt;：貼上完整的 PEM 或 OpenSSH 私鑰（包括 &lt;code&gt;-----BEGIN OPENSSH PRIVATE KEY-----&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公鑰&lt;/strong&gt;：貼上對應的&lt;code&gt;.pub&lt;/code&gt;檔案內容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果密鑰受密碼保護，請在自訂欄位中附加密碼&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;保存該項目。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;此金鑰現已在 Vaultwarden 保管庫中進行靜態加密，可供登入相同帳戶或組織的每台裝置使用。&lt;/p&gt;
&lt;h2 id="使用金鑰進行-git-操作"&gt;使用金鑰進行 Git 操作
&lt;/h2&gt;&lt;p&gt;一旦代理程式運行並且您的保管庫解鎖，&lt;code&gt;git&lt;/code&gt; 就會透明地使用儲存在 Vaultwarden 中的 SSH 金鑰：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Clone a repository using SSH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone git@github.com:username/private-repo.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在幕後，&lt;code&gt;git&lt;/code&gt; 呼叫 &lt;code&gt;ssh&lt;/code&gt;，它與 SSH 代理套接字通信，後者中繼到 &lt;code&gt;bw serve&lt;/code&gt;，後者從保管庫獲取密鑰。沒有提示，沒有檔案複製，沒有手動&lt;code&gt;ssh-add&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;相同的流程適用於 &lt;code&gt;git fetch&lt;/code&gt;、&lt;code&gt;git push&lt;/code&gt;、&lt;code&gt;git pull&lt;/code&gt; 以及透過 SSH 的任何其他遠端操作。&lt;/p&gt;
&lt;h2 id="透過-ssh-存取伺服器"&gt;透過 SSH 存取伺服器
&lt;/h2&gt;&lt;p&gt;以同樣的方式連接到任何遠端伺服器：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh user@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;代理自動協商正確的密鑰。如果保管庫中有多個金鑰，SSH 會嘗試每個金鑰，直到伺服器接受一個金鑰 - 如果需要，可透過 &lt;code&gt;~/.ssh/config&lt;/code&gt; 和 &lt;code&gt;IdentitiesOnly&lt;/code&gt; 進行設定。&lt;/p&gt;
&lt;h3 id="管理多個密鑰"&gt;管理多個密鑰
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;~/.ssh/config&lt;/code&gt; 將特定鍵固定到特定主機：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_ed25519_vault

Host personal-server
 HostName 192.168.1.100
 IdentityFile ~/.ssh/id_rsa_internal
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這些 &lt;code&gt;IdentityFile&lt;/code&gt; 路徑是像徵性的 - 代理根據儲存在保管庫中的金鑰解析它們。&lt;/p&gt;
&lt;h2 id="安全考慮"&gt;安全考慮
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主密碼 + 2FA&lt;/strong&gt;：每次密鑰存取都需要一個未鎖定的保管庫。如果保管庫被鎖定，&lt;code&gt;bw serve&lt;/code&gt; 無法解密金鑰。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;金鑰永遠不會接觸磁碟&lt;/strong&gt;：私鑰材料在記憶體中解密並透過代理套接字提供 - 它永遠不會寫入檔案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;會話逾時&lt;/strong&gt;：設定 &lt;code&gt;bw&lt;/code&gt; 會話逾時，以便保管庫在不活動後自動鎖定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;審核日誌&lt;/strong&gt;：Vaultwarden 記錄每次登入、專案存取和同步事件。您可以查看誰訪問了哪個密鑰以及何時訪問。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="撤銷存取權限"&gt;撤銷存取權限
&lt;/h2&gt;&lt;p&gt;當團隊成員離開或裝置遺失時，透過從包含 SSH 金鑰的 Vaultwarden 組織或集合中刪除使用者來撤銷存取權限。由於密鑰永遠不會儲存在本地（僅由代理臨時快取），因此撤銷是即時的 - 該密鑰根本無法再被該用戶解密。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;開啟 Vaultwarden 管理面板。&lt;/li&gt;
&lt;li&gt;導航至 &lt;strong&gt;管理&lt;/strong&gt; → &lt;strong&gt;使用者&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;從組織中刪除使用者（或調整收集權限）。&lt;/li&gt;
&lt;li&gt;使用者的 &lt;code&gt;bw serve&lt;/code&gt; 將無法在下次操作中取得密鑰。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="概括"&gt;概括
&lt;/h2&gt;&lt;p&gt;Bitwarden SSH 代理程式將 Vaultwarden 從密碼管理器轉變為基於 SSH 工作流程的完整憑證中心。金鑰在保管庫中保持加密狀態，跨裝置同步，並透過標準 SSH 代理介面按需提供服務。與主密碼和 2FA 結合，此設定比傳統的 &lt;code&gt;~/.ssh/&lt;/code&gt; 金鑰檔案提供更好的安全性和便利性。&lt;/p&gt;</description></item></channel></rss>