# 剩下的基礎指令 + ssh
[TOC]
* 遠端連線
* 當需要更好的運算能力
* 管理主機更加方便
* 遠端連線伺服器,使用服務
* SSH
- **S**ecure **Sh**ell 安全外殼協定
- 解決 telnet 不安全的問題
- 走port 22
- 使用非對稱加密進行身份驗證,確保語法安全:使用者在本地生成一對公私鑰(私鑰保密,公鑰上傳至伺服器),連線時伺服器以公鑰驗證私鑰持有者身份,無需傳送密碼,有效避免明文洩露風險。
### 不同加密方式
* 對稱式加密
- 雙方使用 **同一把密鑰** 進行加解密
- 優點:速度快,適合大量資料傳輸
- 缺點:需要事先安全交換密鑰
* 非對稱式加密
- 使用 **一對鑰匙**:公鑰 (Public Key) 與 私鑰 (Private Key)
- 公鑰:任何人都能用來加密
- 私鑰:只有持有者能解密
- 優點:不用事先交換密鑰,就能安全建立連線
- 常用於金鑰交換與身份驗證
數位簽章
假如今天A想傳訊息給B,那會先將原文訊息做雜湊函數得出一串雜湊值,然後用A的私鑰做加密將它變成數位簽章,此時原文訊息則可以用B的公鑰加密成密文,A再把密文以及數位簽章一併傳送給B。
而B收到以後,用自己的私鑰解開密文獲得原文訊息後,再用相同的雜湊函數產生雜湊值,當與用A的公鑰來解開數位簽章的雜湊值相符,就可以確定是A本人傳送的。

Hash 雜湊函式
>$$ H(x) = x \mod B $$
ssh連線
1. TCP連線
2. 版本交換
3. client驗證server的host public key
4. 透過非對稱金鑰演算法交換金鑰,產生session key並用它進行對稱式加密,開始在加密通道中傳訊
* ssh 不是對稱式加密也不是非對稱式加密
### 基礎操作
安裝
* 更新軟體的最新資訊及列表: `sudo apt update`
* 安裝 server 端套件: `sudo apt install openssh-server`
* 同時安裝 server 及 client: `sudo apt install ssh`
`apt update `:根據系統列表抓取來源,更新列表本身
`apt upgrade`:把已安裝軟體做更新、升級
`` :過去自動安裝,是否更改設定檔
### 確認 server 狀態
* 查看<服務>狀態
* `sudo systemctl status <服務>`
e.g. ssh `sudo systemctl status ssh`
* 查看 ssh 佔用 port
* `sudo ss -ltpn`
* `-l`: 列出傾聽狀態(listening)的 sockets(可當作聆聽正在使用之服務)
* `-t`: 只列出 TCP 的 sockets
* `-p`: 顯示使用 sockets 的程式資訊
* `-n`: 不要嘗試把 port 號解析成服務名稱
* http 占用 port 80;
https 占用 port 443
### 開啟關閉與重啟 server
在做任何設定黨服務的時候都要記得去開始
`sudo systemctl start ssh`:開始
`sudo systemctl stop ssh`:停止
`sudo systemctl restart ssh`:重新啟動;關掉再打開
### 由 client 登入
* 登入本機
* `ssh localhost`
* `ssh 127.0.0.1`
* `ssh [username]@127.0.0.1`
* 使用 `ssh [username]@127.0.0.1` 可以通過 SSH 連接到本地電腦。
* `127.0.0.1` 是本地回送地址,通常等同於 `localhost`(可在 `/etc/hosts` 檔案中確認)。
* `127.0.0.1/8` 是保留的 IP 範圍,發送到這個地址的資料封包不會離開本機。
* `localhost` 是一個頂級域名,禁止任何網域註冊使用。
* `ssh [username]@[hostname]`
ssh 連線到指定server
* `-p [port num]` 改server port號,在大多數情況下不建議改port號,並不會提升安全性,也會造成管理困難
* `-v` 偵錯模式連線,建議連線時加上此option
* `ssh [username]@[hostname] '[cmd]'`
執行單行指令
* `-f` 背景執行
- `passwd`:更改密碼
- 用法:`sudo passwd user`
- user 是對應的使用者名字
- 退出連線
- `exit`
- `logout`
- `Ctrl+D`
* 產生公/私鑰金鑰對
`ssh-keygen -t ed25519`
* 私鑰會存在 `~/.ssh/id_ed25519` -> 自己留著,不能給別人的
* 公鑰會存在 `~/.ssh/id_ed25519.pub` -> 傳給別人的
| `RSA` | `ed25519` |
| ---------------------------------------------------------------------------- | --- |
| 為三個人名的縮寫,相容性最好,支援稍舊的版本,1024-16384 bits,預設2048 bits | 生成金鑰更快、安全性更好,256 bits |
| 建立在「大整數分解困難」上,為安全性只能一直加大鑰匙長度 | 建立在「橢圓曲線離散對數問題」 |
- 把剛剛的公鑰放到遠端 server
```
ssh-copy-id -i ~/.ssh/id_ed25519.pub s${學號}@moli.lsa.tw
```
> @bs10081 :應該在每台電腦上生成 SSH Key,而不是生成一份以後放到每一台電腦(1Password 這種密碼管理器除外)
## Forward Agent

範例狀況:員工(User) severA(網站)、severB(後端)為公司
* severA不具備金鑰,為了資訊安全也關閉密碼方式登入severB
* severB為後端伺服器禁止外部IP連入
* severB具有User的公鑰
* 實例:員工居家辦公要透過severA連入severB獲取資料
流程:
1. User本地端有一個ssh-agent內含forwarding 功能,可不透過網路傳送金鑰讓遠端sever使用地端金鑰進行驗證
2. User連上severA例如ssh -A seal@192.1168.0.1(加上A開啟agent forwarding)
3. 要再繼續往後端severB連時,會自動透過SSH通道,用本機金鑰遠端認證
4. User agent幫忙完成簽章後傳回結果
關鍵點:
- 私鑰 **永遠不會離開本地電腦**。
- 遠端機器只能透過 SSH 通道「借用」你的 agent 做簽章。
- 如果 serverA 被入侵,攻擊者可能利用已建立的 SSH 通道來嘗試連入 serverB。
> @bs10081: 都沒人寫共筆,你們期中考要完蛋了 :)
> 某某好心人:LSA server 地址是 `ssh -v s${學號}@moli.lsa.tw`
> @bs10081: 👆 `${}` 代表你需要自己修改這個地方變成你自己的學號,而不是寫 `ssh -v s${學號}@moli.lsa.tw`,例如 `ssh -v s110213027@moli.lsa.tw`,實務上,只要見到 `${}`、`<username>`、`example.com`、`John Doe` 都是「記得要改成自己的」的意思。