[IS] 關於 SSH
TL;DR
登入主機
# 產生 SSH 金鑰
$ ssh-keygen -o -a 100 -t ed25519
$ chmod 400 my-key-pair.pem # 改變 private key 的權限
# 登入
$ ssh-add wavinfo.rsa # ssh-add <private_key>
$ ssh wavinfo@192.168.1.4 # 預設是 port 22
$ ssh -i ~/.ssh/id_ed25519 root@192.168.1.4
產生的金鑰會自動被存放在
~/.ssh資料夾中。
關於 SSH
SSH(遠端登入協定)是一項用來連接伺服器或網路設備,必且透過 CUI/GUI 來操控連線對象的通訊協定,同時也是該連線程式的名稱,必須搭配 TCP 使用,預 設的連接埠為 Port 22。
SSH 的特色在於處理作業採用加密機制,因此安全性高,可避免資料被竊取而外洩的情形。
操作流程是在自己的電腦先產生 SSH Key 並將它加到 ssh-agent 中,接著將產生的 SSH 產生的 public key 新增到 Github 的帳號內,接著就可以透過 SSH 與 Github 連線。
使用 SSH 登入
SSH 主要用於遠程登錄。假定你要以用戶名 user,登錄遠程主機 host,只要一條簡單命令就可以了:
# 先將公鑰和私鑰放到 ~/.ssh 資料夾內
$ ssh-add ~/.ssh/wavinfo_rsa
# 透過 ssh 登入遠程主機
# ssh <username>@<remote-host>
$ ssh wavinfo@192.168.1.4
$ ssh -p 2022 wavinfo@192.168.1.4 # 修改成 port 2022
$ ssh -i ~/.ssh/another_key wavinfo@192.168.1.4 # 使用其他 key 登入
登入後的流程可參考 SSH 原理與運用(一):遠程登錄 @ 阮一峰的網絡日誌。
「當遠程主機的公鑰被接受以後,它就會被保存在文件 /$HOME/.ssh/known_hosts 之中。下次再連接這台主機,系統就會認出它的公鑰已經保存在本地了,從而跳過警告部分,直接提示輸入密碼。
每個 SSH 用戶都有自己的 known_hosts 文件,此外系統也有一個這樣的文件,通常是 /etc/ssh/ssh_known_hosts,保存一些對所有用戶都可信賴的 遠程主機的公鑰。」 - SSH 原理與運用(一):遠程登錄 @ 阮一峰的網絡日誌。
使用 SSH 金鑰登入
SSH 支援安全性更高的「公開金鑰認證」。使用時需要先於客戶端建立一對公開金鑰(Public Key)和秘密金鑰(Private Key),並且先將公開金鑰儲存於目的端上(例如,Github 或伺服器主機)。連線時除了使用秘密金鑰外,亦可搭配**通行密語(pass-phrase)**更提升安全性。
檢查自己是否已有金鑰
在產生 SSH 金鑰時,可以檢查是否已有金鑰。金鑰檔會被存放在 ~/.ssh 資料夾中:
ls -al ~/.ssh
如果有找到該資料夾且裡面已有檔案,表示已有金鑰,金 鑰會分成公鑰(public) 和私鑰(private),檔案名稱會像這樣:
# ed25519 和 rsa 指的是加密方式
# .pub 表示是公鑰
id_ed25519
id_ed25519.pub
id_rsa
id_rsa.pub
產生 SSH 金鑰(Generate SSH Key)
Generating a new SSH key and adding it to the ssh-agent @ Github
透過 ssh-keygen 可以產生 SSH 金鑰:
# 產生 ed255519(優) 或 rsa4096(佳)
$ ssh-keygen -o -a 100 -t ed25519 -C "your_email@example.com"
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/user_ca -C "your_email@example.com"
# -t ed25519:指定密鑰演算法,這裡指定為 ed25519
# -b 4096:密鑰的位數
# -f ~/.ssh/user_ca:生成密鑰的位置與檔案名稱(預設會放在 ~/.ssh 資料夾中)
# -C:加上註解
透過上述的指令將會產生一對密鑰,分別是公鑰(foo.pub)和私鑰(foo)
如果有需要的話,也可以在為金鑰添加 passphrase,類似多一組密碼,每次使用時都要再輸入此 passphrase。
將 SSH 金鑰加到 ssh-agent(ssh-add)
透過 ssh-add 指令可以加 ssh 金鑰加到 ssh-agent,加到 ssh-agent 的好處是不用每次 push 或 pull 時都要打 passphrase:
# 在背景啟動 ssh-agent
$ eval "$(ssh-agent -s)"
# (或者)每次開啟 terminal 時將 SSH 金鑰加到 ssh-agent
$ ssh-add id_rsa
使用 MAC KeyChain 紀錄
如果不想每次開啟 Terminal 都要將 SSH 金鑰加到 ssh-agent ,可以透過 MAC 的 key chain 紀錄:
# ~/.ssh/config
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
接著將利用 --apple-use-keychain 加到 MAC keychain:
ssh-add --apple-use-keychain ~/.ssh/id_rsa
# 或者 -K (Load resident keys from a FIDO authenticator)
ssh-add -K ~/.ssh/id_rsa
如此,就不需要每次使用 SSH 時都要指定 對應的 key。
將 SSH 公鑰加到服務
將 SSH 公鑰上傳到 Github
利用 pbcopy 將公鑰複製到剪貼簿:
# Copies the contents of the id_rsa.pub file to your clipboard
$ pbcopy < ~/.ssh/id_rsa.pub
# $ cat ~/.ssh/id_rsa.pub | pbcopy # 這樣也可以
在服務網站的位置(例如 Github)點選 SSH and GPG keys > New SSH key/Add SSH key