[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
資料夾中:
la -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 -d ~/.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
將 SSH 公鑰加到遠端主機
使用 ssh-copy-id
這個 helper 指令,可以幫助我們把 SSH 的公鑰複製一份到遠端主機上:
# ssh-copy-id <username>@<remote-host>
$ ssh-copy-id root@192.168.1.4
使用
ssh-copy-id
指令時,很有可能需要輸入遠端主機的密碼。
實際上 ssh-copy-id
做的事情如下:
ssh wavinfo@192.168.1.4 # 登入遠端主機
cd ~/.ssh # 進入 .ssh 資料夾
vim authorized_keys # 允許的 keys 會被存放在 `authorized_keys` 這隻檔案
大家的公鑰都會被放在
~/.ssh/authorized_key
這支檔案中。
# ~/.ssh/authorized_key
ssh-ed25519 AAAAC... calvert
ssh-rsa AAAAB3...w== Calvert_for_mongodb
ssh-rsa AAAAB3...Q+7 Andy
ssh-rsa AAAAB3...eprEQ== Aaron
其他
管理 SSH passphrase
你可以保護你的 SSH Keys 並設定 authentication agent (ssh-agent),所以就不需要在每次使用 SSH Keys 的時候都要輸入 passphrase。
新增或編輯 passphrase
# Start the SSH key creation process
$ ssh-keygen -p
設定 SSH Config
在自己的電腦上,如果經常有登入 SSH 的需要,可以建立一支 ~/.ssh/config
檔:
# ~/.ssh/config
Host wavinfo
HostName 192.168.1.4
User root
IdentityFile ~/.ssh/id_rsa
Port 22
如此可以用 wavinfo
這個 alias 便可以連進指定的主機
ssh wavinfo
將檔案在本機和遠端主機間複製 scp
keywords: scp
複製檔案
透過 scp
這個指令可以將本機的檔案複製到遠端主機上:
# scp <file> <username>@<hostname>:<path>
$ echo > foo.text
$ scp foo.text wavinfo@192.168.1.4:~/ # 從本機複製到遠端主機根目錄
$ scp wavinfo@192.168.1.4:~/foo.text ./foo.text # 從遠端主機複製到本機
$ scp -i ~/.ssh/another_key -p 2002 foo.text wavinfo@192.168.1.4:~/ # 指定 identity 和 port
複製資料夾
搭配 -r
可以複製整個資料夾:
mkdir foo
echo bar > foo/bar.text
scp -r foo wavinfo@192.168.1.7:~/
本機的 known_host 和遠端主機上的 fingerprints
在本機的 ~/.ssh/known_hosts
檔案中,記錄了所有過去曾經透過 SSH 連結到的遠端主機。ㄉ
如果想要知道遠端主機的 fingerprints 可以先透過 SSH 連進遠端主機後,輸入:
# 先連進遠端主機後輸入
$ ssh wavinfo@192.168.1.4
$ ssh-keygen -l -f /etc/ssh/ssh_hosts_ecdsa_key.pub
如果想要清楚本機連線到某一遠端主機的紀錄,可以輸入:
ssh-keygen -R 192.168.1.4
檢視遠端主機上的 log 檔
主機上登入記錄的 log 檔位於 /var/log/auth.log
:
ssh wavinfo@192.168.1.4
vim /var/log/auth.log
或者可以輸入指令 lastlog
lastlog # 檢視主機上最近的登入紀錄
lastlog -u <username> # 檢視某一使用者最近的登入紀錄
設定遠端電腦上的 SSH 配置
遠端電腦上關於 SSH 的配置通常放在 /etc/ssh/sshd_config
這隻檔案內。
vim /etc/ssh/sshd_config # 修改配置檔
service ssh restart # 重新載入 ssh
Public Key
在 Public Key 內容的最後,「空格」後的內容可以視為註解,因此可以隨意修改:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCkiWTEB08rCV47ttssgiTqyrKtjUGOLudDftgGMLY0+ewrNOoKBEgutn/n4zvOqUCIytmQVi9kS/4gAb6xW4JUSop0Xl449r7XB9N1LT3xEF2Srldy0Vz3qijLX/9juQkju7GYUIw+EeyqNKgQhRoWZWN6dBjBPs+hb4GTKEX3g+P6yxEICbR+nc2AnvvhSpmNbFqDFGrU28Ak6+tKoHe7XDwyyNPj1/mx+qr6bY57V4rFO+XEiz9RlmZYKQLgQdg8Upf8aXVMtf1N43I+tIEjtOjJ7in5kTNyx49VQrWdodVQYiQHFyRLdWe8Aqk+9YbrS20tTdT8vcAXzX+1Z7G0D8Nqb9kEk2n1xDKZd7H13hO3ljp1lrnIkY8KhPb1lRBma6ssRMyjuHFAvAqEXzA6NJVK3iYgrPZws0arYobv0QTOpCEFfy+0lGBt/bQn8P9TCSyybJRqqY4lwGEPhyHFLP4uticyTkXZKeTwjt0wB1/J2nUcZs+1RIUIBjQ+5Sc1YMUcaBWEZ+A1gMFvOLuppboVu5y+OKUHYNRHfRZ9VCbtl5FKnJQRwjwkdJCw+VyCaY3BIGfD7Erb5bEO4f63ZKNP+Bc6eHNykB1m6gInajno5pxbgPK6XH84dhtGIb50kdtV/PFcA8IkU060xJw6Ci7ECyt7TOPk0fAhjeprEQ== pjchender@gmail.com
資料來源
- SSH Command
- SSH 原理與運用(一):遠程登錄 @ 阮一峰的網絡日誌
- SSH 證書登錄教程 @ 阮一峰的網絡日誌
- 升級你的 SSH 金鑰! @ Calvert's murmur
- Connecting to Github with SSH @ Github