SSH agent forwarding 可以讓本地的 SSH Key 在遠端 Server 上進行轉送,也就是當你需要在選端 Server 上使用 SSH Key 時,就不需要將你的 key pair 手動複製到 server 上,是個暨方便又安全的作法。
舉例來說,首先 SSH 登入進 Server1,接著在 Server1 上登入 Server2 時,就會自動使用你本地的 SSH Key:
Local —(SSH)—> Server1 —(SSH)—> Server2
那要怎麼使用:
首先需要將要 forwarding 的 private key 加到清單裡面:
ssh-add
用
ssh-add -L
可以檢查這個清單。接著:
方法一:每次要 Local 連上 Server 時,加上 -A 參數:
ssh -A user@{you server1 ip}
方法二:修改 ~/.ssh/config 設定,加上 ForwardAgent yes,這樣就不需要每次連都加上 -A 參數。例如
Host server1
HostName 106.187.36.122
ForwardAgent yes
實務上有什麼應用呢? 這裡舉兩個常用的例子:
Bastion Host
在 AWS 的架構課中,每次講 VPC 就會提到 Bastion host 的概念,也就是整組內部網路只開放一台 server 可以從外部做 SSH 連線,如果需要 SSH 連線其他機器,都必須透過這一台 Bastion host 轉過去。這樣做的目的當然是為了安全性,我們可以特別加強這一台 Bastion host 的安全,例如鎖外部 IP 或是裝 SELinux 等等,這一台的用途就專門只做 SSH 連線,畢竟越簡單越容易防護,更細節的 OS 防護原則可以參考 OS Hardening Principles。
既然 SSH 連線都必須透過這台 Bastion host,那麼 SSH agent forwarding 這招就很好用了,就不需要、也不應該把 private key 放到 Bastion host 上面。
Git Deployment
如果你有用 Git 版本控制系統的話,你的應用程式佈署也很可能需要在 Server 上把 Source Code 從 repository 拉下來,這時候就會需要 SSH 的權限。
以前小時候不懂事,總是在 Server 上生出一組部署專用的 SSH key pair,然後在 Github 上設定這組 key 可以讀取 repository。後來發現這完全是多餘又增加安全風險。既然有權限佈署,那麼也就表示你應該就有權限可以讀取 source code,那就用你自己的 SSH key 就好啦,就不需要在 server 上擺一組 SSH key pair 了。
如果是用 Ruby 的 capistrano 做部署的話,只要設定一下就可以了:
set :ssh_options, {
forward_agent: true
}
這樣在佈署程序中就會用到你自己的 SSH key 去 Github 拉 source code 了。