> [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/)