SSH利用Key登入

我想大家都知道 SSH 是什麼,也很多人應該已經會用 SSH Key 可以免輸入密碼就可以 SSH 登入。我想信大家用 github 應該都會用,但我今天不是要用 github 我要用 ubuntu 當作 SERVER, window 當做 client. 其實做法是一樣,github server 當作我自己 ubuntu server。

很多時候你用 github 可能一些 server 上運作可能你不太知道背後的運動是如何,今天可以介由者個範例可以理解更多以真實 server

請務必先安裝 openssh 能用

1
sudo apt install openssh-server
  • 公鑰跟私鑰是一組,這樣才可以連線,他們會做連結
    • Private Key 私鑰: 要存在你自己電腦
    • Public Key 私鑰: 要放在本地端要連到 Sever。

client 建 Key

這個方式是最常用的方式,就跟 github 一樣,本地端會建 private 和 public key,然後把 public key 傳到 server 上面並加入 Server 上的 ~/.ssh/authorized_keys 檔案中。)

以這個範例我本地端(Local/Client)要用 SSH 遠端到 Server 端,我需要把我的公鑰(public key)傳到 Server 這樣私鑰做連線會跟 Server 公鑰比對,是同一組就會連線。

  • 在 SSH 連線中,Client 會先產生一組公鑰(public key)和私鑰(private key)。
  • 公鑰會放到 Server 上,而私鑰只保留在 Client。

當 Client 嘗試連線時,會使用私鑰(private key)來進行驗證,而 Server 會利用它儲存的公鑰來驗證 Client 的私鑰是否正確,確認是同一對金鑰後,即可成功連線,我下面我教如何做到。

環境:

  • Local PC: window
  • Server PC: Ubuntu

這是一個基本架構,我 Client 是用 Window 當做範例,你也可以用 Linux 當作範例,指令會不一樣,我會提供。

Step1: 建立 Key

請檢查 home 資料夾有沒有 .ssh資料夾,如果沒有請建立因為
在本地建 Key 會產生公鑰跟私鑰 key 可以用下面方式建立 key,下面看你哪一個金鑰。

建立 SSH,正常有安裝 SSH 應該會有:

  • Linux: mkdir -p ~/.ssh
  • window: mkdir "$HOME\.ssh"

可以建立 KEY 方法或看下面有不同方式

1
ssh-keygen -t rsa -b 4096

Note:

-C "your_email@example.com" : 可以註解意思可以選部用填也沒關係
Enter file in which to save the key: 直接按 Enter 鑑就用預設,或輸入你想改檔名
Enter passphrase: 如果不輸入按 Enter 就是沒設密碼。

RSA 加密算法

優點:通用、相容性最好
缺點:金鑰越長,速度越慢;2048-bit 現在略嫌不夠安全
類型:非對稱加密(老牌)
金鑰長度:建議用 4096 bits

1
ssh-keygen -t rsa -b 4096

ED25519 加密算法

優點:小、快、安全性高
缺點:在舊系統(非常老)可能不支援

你也可以用下面比較加密比較強,可以建議用下面這個。

1
ssh-keygen -t ed25519

Step2: 檢查看 key 也建成功

請用 ls 會發生會建立公鑰跟私鑰,如果你上面沒改檔名稱他會用 Default:

  • id_rsa: 私鑰 private key
  • id_rsa.pub: 公鑰 public key

如果你是用 ED25519 加密算法檔名會是 id_ed25519

Step3 把公鑰傳到 Server

我們要把本機端產生的 Public key 內容,加入到 Server 上的 ~/.ssh/authorized_keys 檔案裡。 如果是手動處理,可以把公鑰檔(例如 id_rsa.pub)裡的內容複製出來,貼到 Server 的 authorized_keys 檔案中。

我們用這個指令把本機端產生的 Public key 內容,傳到 Server。你會發現傳上 Server 他已經是用 authorized_keys,請看下面途更清楚:

  • window 方式傳到 server (window method transfer public key to server)
1
type %USERPROFILE%\.ssh\id_rsa.pub | ssh chenchih@192.168.1.103 "cat >> .ssh/authorized_keys"
  • Linux 方式傳到 server (Linux method transfer public key to server)
1
ssh-copy-id -i id_rsa.pub root@192.168.1.103

你可以比對 local 端的 id_rsa.pub 跟 server 上的 pubic key authorized_keys 是一致:

Step 4 Server 修改 sshd config 用 key 登入

我們需要在 ubuntu sshd_config (ssh config 檔案) 密碼用 Key 來登入,預設他是用密碼登入。如果將來你想改成用密碼登入也是這樣做。

修改檔案 modify file: nano /etc/ssh/sshd_config

請把 #PasswordAuthentication no # 移除掉如下面。Default 是 用密碼登入 PasswordAuthentication yes#PasswordAuthentication no 是一樣意思就是 login as password

1
2
sudo nano /etc/ssh/sshd_config #edit sshd_config
PasswordAuthentication no

請重啟 ssh server(restart ssh server)

1
sudo systemctl restart sshd

Step 5 Remote SSH to server

現在我們可以在本地端用 SSH 連到 Server 不需要密碼,但是注意只能用 terminal or 終端機。

1
ssh username@hostname

Create ssh config

如果你有很多台 server,也就是說很多帳號,密碼等等要記,如果之前用過第三方工具如 Putty tera term 等等,他們有功能可以存這些設定。其實可以在本機端建立 ssh config,把這些資料放進去,就有一樣效果。

在本機端建立一個 .ssh/config 然後把你個 Server 相關帳號和 Host 放進去如下面。Host 可以隨便改你想要的名稱,這就會是你要登入用的名稱。我是用 test,所以我就會用 ssh test remote 到 server 上,很方便。如果你有很多台,這分常實用

1
2
3
4
Host test
HostName 192.168.1.103
User ServeraccountName
Compression yes

如果你有不想指定不同 Key 可以這樣加IdentityFile 如:

1
2
3
4
5
6
7
8
9
10
11
Host window
HostName 192.168.1.103
User ServeraccountName
IdentityFile ~/.ssh/realname_rsa
Compression yes

Host ubuntu
HostName 192.168.1.105
User ServeraccountName
IdentityFile ~/.ssh/realname_rsa_ubuntu
Compression yes

Server 建立 Key

放面的範例是最常用,但如果你用在 server 建 key,你就要把你的 private key 給對方,這種情況比較少會有人這樣用。這種方式比較多是用在系統上,如 router 等產品為了資安相關設定就會這樣做。那些產品都會有網頁,有些客戶不希望用密碼登入,因此就會這樣用。他會在她系統上建 public and private key,然後會給你 private key,你就可以透過他的 private key 連進它的系統,但你連進去也看無法看到 SSH 那一層。

Step1: Server 端建立 key

1
ssh-keygen -t rsa -b 4096

Step2: 把 public key 導入 authorized_keys

你只要是要讓對方連近來,就需要把 public key 改成 authorized_keys

1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Step 3 設定權限

個人覺得好像不需要做,可以 SKIP,如果不能連再來設,但我還是提以下:

1
2
3
4
chmod 700 /home/chenchih/.ssh
chmod 600 /home/chenchih/.ssh/authorized_keys
chmod 600 /home/chenchih/.ssh/id_rsa # Only if you copied id_rsa there
chmod 644 /home/chenchih/.ssh/id_rsa.pub

如果你用 root 身分修改上面權限,請登出 root 然後下一般帳戶的權限

1
sudo chown -R chenchih:chenchih /home/chenchih/.ssh

Step4 SSH 重啟

1
sudo systemctl restart sshd

Step5 把你的 private key 複製到本端

你有多方式可以做:

  • 複製 id_rsa 檔案 (FTP, SMB 等等),放在本端 .ssh目錄
  • 複製 id_rsa 檔案內容,在本端 .ssh目錄下建立檔案
1
2
3
4
5
#server(server)
cat id_rsa #copy private key
#local side
touch id_rsa
vi id_rsa #paste the private key content

Step 6 SSH 連線

這些做完就可以做連線

第三方工具 putty/terateam

上面方式都是用終端機,現在這裡我們要用第三方工具,我想信如果你們紀錄 log 或跑長時間等等可能都會用到第三方工具,但是如果要用 key 登入可能要做這些設定。它們的 key 檔案跟上面不太一樣。你也可以把登入改成密碼。接下來我來教如何用 putty and terateam 用 key login。我的範例會以本端的 public key 為主,也就是案例 1 位主,因為比較常用

Putty

請自行安裝 Putty,一定要安裝不可以用簡易版本或免安裝版本,我要用到 PuTTYgen.exe這個工具,如果你安裝就會把這個也安裝進去

如果你登入選對的 public key 會出現這樣錯誤訊息 No support authernication methods available

Step1 開啟 PuTTYgen.exe

他會在 putty.exe 一樣目錄 C:\Program Files\PuTTY\

Step2 選取你的 private key

請照下面照片做

如果你建 key 時有設定密碼,就不會出現圖片地 4 步

Step3 Save putty private key format

putty 有自己的 private key 格式,檔案會是 .ppk,請照下面照片做

Step4 putty 選取你剛剛存的 ppk 檔案

請照下面照片做,做完就可以連線

TeraTeam

Step1: 開啟 terateam

請點選 setup>ssh authentication>

Step2: 選取 private KEY 設定

請照下面圖選取 private key

Step3 SSH 連線

我在我的 private key 有設定密碼,所以會跳出要我輸入密碼。如果你沒設定就不會跳出來

Reference