跳至主要内容

[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

資料來源