學習案例:設定 Ubuntu 伺服器的 SSH 金鑰安全認證
# 實戰情境:設定 Ubuntu 伺服器 (172.30.0.199) 的 SSH 金鑰安全認證
## 概述
本教學模擬一個常見的內部訓練情境。指導者已備妥一台全新的 Ubuntu 伺服器,學員需從自己的 Ubuntu 電腦,透過私有網路連線至該伺服器,並完成從密碼登入到金鑰認證的安全升級。
### **情境設定**
* **指導者提供資訊:**
* 伺服器 IP 位址:`172.30.0.199`
* 初始登入帳號:`ubuntu`
* 初始登入密碼:(指導者提供)
* **學員端 (您的電腦):**
* 作業系統:Ubuntu Linux
* 角色:跟隨本指南操作,連線至伺服器。
---
## 步驟一:【前置作業】網路環境確認
在嘗試連線之前,必須先確認您自己的電腦與目標伺服器在網路上是「可溝通」的。
### **1.1 檢查自身網路座標**
* **問題:** 「在連線到別台電腦前,我得先知道我自己的 IP 位址是什麼,以及我所在的網路環境為何?」
* **操作 (在您的 Ubuntu 電腦上執行):**
```bash
ip a
```
* **解說:** 找出您電腦的網路卡(如 `ens18`, `eth0`),記下其 `inet` 後面的 IPv4 位址。
### **1.2 確認與目標伺服器的連線**
* **問題:** 「我知道我的位置了,那目標伺服器在網路上『活著』嗎?它的 SSH 服務有在聽嗎?」
* **操作 (在您的 Ubuntu 電腦上執行):**
1. **測試網路是否通暢 (Ping):**
```bash
ping -c 4 172.30.0.199
```
2. **測試 SSH 服務端口是否開啟 (Netcat):**
```bash
nc -zv 172.30.0.199 22
```
---
## 步驟二:【首次連線】使用密碼登入
網路確認無誤後,我們使用指導者提供的臨時帳號密碼進行第一次登入。
* **問題:** 「如何使用帳號密碼,從我的電腦登入到目標伺服器?」
* **操作 (在您的 Ubuntu 電腦上執行):**
```bash
ssh ubuntu@172.30.0.199
```
* **解說:** 依提示輸入 `yes` 及密碼即可登入。
---
## 步驟三:【安全升級】設定 SSH 金鑰認證
### **3.1 (用戶端) 產生金鑰對**
* **問題:** 「如何建立一把專屬於我的、無法被仿冒的數位鑰匙?」
* **操作 (在您的 Ubuntu 電腦上執行):**
```bash
ssh-keygen -t ed25519
```
* **解說:** 連續按三次 `Enter` 接受預設值,即可在 `~/.ssh/` 目錄下產生私鑰 (`id_ed25519`) 和公鑰 (`id_ed25519.pub`)。
### **3.2 (伺服器端) 部署公鑰**
* **問題:** 「如何將我的『公鑰』,安裝到伺服器上我這個 `ubuntu` 帳號的門上?」
* **操作 (在您的 Ubuntu 電腦上執行):**
```bash
ssh-copy-id ubuntu@172.30.0.199
```
* **解說:** 依提示輸入一次密碼,指令會自動完成公鑰的複製與權限設定。
### **3.3 (用戶端) 測試金鑰登入**
* **問題:** 「新鎖裝好了,效果如何?」
* **操作 (在您的 Ubuntu 電腦上執行):**
1. 首先,在伺服器上輸入 `exit` 登出。
2. 然後,再次執行登入指令 `ssh ubuntu@172.30.0.199`。
* **預期結果:** 您應能直接登入成功,無需輸入密碼。
---
## 步驟四:【原理詳解與安全強化】
### **4.1 金鑰認證機制解說**
* **問題:** 「為什麼金鑰登入不需要密碼?它到底是如何運作的?」
* **原理:**
1. **公鑰 (Public Key)** 相當於一把公開的「鎖芯」,您已將其安裝在伺服器的 `~/.ssh/authorized_keys` 檔案中。
2. **私鑰 (Private Key)** 相當於與該鎖芯**唯一配對**的「鑰匙」,由您妥善保管在自己的電腦上。
3. 登入時,伺服器用您的公鑰產生一個隨機「挑戰」,只有您電腦上的私鑰能解開此挑戰。因為私鑰從未在網路上傳輸,所以此方式遠比可能被猜測或攔截的密碼安全。
### **4.2 安全強化操作**
* **問題:** 「如何徹底關閉不安全的密碼登入功能?」
* **操作 (在已登入的伺服器上執行):**
1. **編輯 SSH 設定檔:**
```bash
sudo nano /etc/ssh/hd_config
```
2. **修改參數:** 找到 `PasswordAuthentication` 這一行,將其值改為 `no`。
```ini
PasswordAuthentication no
```
3. **儲存並重啟服務:** 按 `Ctrl+X`, `Y`, `Enter` 儲存,然後執行:
```bash
sudo systemctl restart ssh
```
* **最終驗證 (警告!):** 在重啟服務前,請務必開啟一個新終端機視窗,並成功透過金鑰登入,以防自己被鎖在伺服器之外。
留言