> [name=SleepyMan212] > [time=Sun, Feb 14, 2021 4:37 PM] ###### tags: `linux` `ssh` `blog` # SSH-Agent 及 Proxy Jump ## Introduction ssh-agent 是 OpenSSH 的其中一部份,這次會介紹 ssh-agent 是什麼,如何保護你的 private key 的安全,以及如何安全的傳送(forwarding) private key。 ## ssh-agent 是什麼 它可以幫你管理登入 ssh-server金鑰,免除登入遠端伺服器要重複輸入密碼的麻煩。它會把 key, cert 等資訊存到 memory 裡 > 有些管理者會把密碼登入給關掉,只允許使用金鑰登入,以確保系統的安全性 <br> 它可以保護我們 key 的安全是因為它不做以下兩件事: * 它不會把 key 寫入硬碟裡 * 它不會允許你把 key 匯出 > 因為寫入硬碟裡金鑰可能會殘留在裡面, hacker 可以透過讀取硬碟想辦法從裡面得到金鑰 ### ssh 過程 ssh 的認證會在雙方握手(handshake)時完成 1. client 把 public key 交給 server 2. server 隨機生成一個短暫的字串交給 client,並要求 client 簽署此字串 3. client 要求 ssh agent 簽署,並傳送回 server 4. server 用 publick key 去檢查傳回來的字串是否一樣 5. server 確認 client 確實擁有 private key 在交握的過程中會短暫的使用新的 key 去加密過程,這些 key 不一定會在整個交握過程使用,途中可能會跟新。 <br> > private key 跟 public key 是成對的,一個像是鎖頭,一個像是鑰匙,只有正確的鑰匙才可以開鎖 ## ssh-agent 啟動 如果有裝 OpenSSH,可以用 `eval $(ssh-agent)` 來啟動 ssh-agent 啟動成功後應該會看到 ```shell= Agent pid XXXX ``` ### 簡單操作 |指令|作用| |---|----| |`ssh-add <file path>`|加入指定的 private key| |`ssh-add -l`|列出現在所有已加入的 private key| |`ssh-add -D`|把現在在 ssh-agent 裡的 private key 清空| <!-- ##### `ssh-add <file path>` 可以把指定的 private key 加入 ssh-agent ##### `ssh-add ` --> ## Agent Forwarding > ssh-agent forwarding 有安全性上的疑慮可以參考 [SSH Agent Forwarding considered harmful](https://heipei.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/) 有時候我們會有一台跳板主機(Bastion Host),需要先連上這台,才能連上後面的主機,但我們不希望把 private key 存到跳板主機上,這時候就可以用 ssh-agent local -> Bastion Host -> A 使用方法只要在 ssh 的時候加入 -A 的選項像是 `ssh -A user@host` <br> 在 ~/.ssh/config 裡加入 ForwardAgent 就會自動轉送 agent了 ```shell= Host serverA HostName 10.10.0.1 ForwardAgent yes ``` ### 建議方法 上述的情況也可以使用 ProxyJump 來達到一樣的效果 可以先在 ~/.ssh/config 設定: ```shell= Host A Hostname 10.10.101.5 User test Host B Hostname 10.10.4.92 User kwei ProxyJump A ``` 根據上述的設定,當我們要連上 B 的時候,我們需要先連上 A 才可以。 Proxy Jump 搭配上 ssh tunnel 或這是 port forwarding 實為方便。而且如果在每一台的主機放上自己的 public key 就不用一一打密碼了,除此之外 Proxy Jump 也不會讓中間的主機知道 private key ## Reference [SSH 免除重複輸入金鑰密碼教學:SSH Agent 與 Forwarding](https://blog.gtwang.org/linux/using-ssh-agent-forwarding-to-avoid-being-asked-passphrase/) [SSH Agent Explained](https://smallstep.com/blog/ssh-agent-explained/) [SSH agent forwarding 教學](https://blog.wu-boy.com/2016/10/ssh-agent-forwarding-proxycommand-tutorial/)