跳轉到內容

網際網路技術/SSH

來自華夏公益教科書,為開放世界提供開放書籍

SSHTelnetrsh 的安全替代品。客戶端和伺服器之間所有通訊都已加密。要在大多數 Unix 作業系統中訪問 SSH 客戶端(通常為 OpenSSH),請在終端視窗中鍵入 ssh user@host.com。如果您沒有指定使用者名稱,則將使用輸入該命令的使用者($USER)。在 Windows 中,您需要下載第三方實用程式,例如 PuTTY 或 Cygwin。在 ssh(1) 手冊頁中查詢更多資訊。在其他作業系統(例如智慧手機)上,您需要使用基於 Web 的客戶端。Android 有幾個 SSH 應用程式,包括 ConnectBot、Dropbear、ServerAssistant 和 Telnet / SSH 簡單客戶端。

SSH 實際上遠不止一種安全訪問遠端 shell 的方式。它可以用於許多其他安全傳輸資訊的方式。

使用 SSH

[編輯 | 編輯原始碼]

安全 shell 客戶端方便地稱為 ssh。它通常用於訪問遠端主機。ssh 的典型用法是

ssh user@host

這意味著客戶端打算以 user 身份登入到 host 機器。成功驗證後,將在客戶端和 host 之間建立 SSH 會話。

Rsync 和 SFTP 是傳輸檔案的兩種推薦方法,因為 SCP 存在無法修復的缺陷。

使用 SFTP

[編輯 | 編輯原始碼]

SFTP 與 FTP 沒有任何 關係。SFTP 只是像 FTP 一樣工作,這意味著您像使用 FTP 一樣使用它。使用 SFTP 只需要 SSH 伺服器。FTP 伺服器與 SFTP 無關。檔案預設情況下以二進位制格式傳輸。

sftp user@host

使用 Rsync

[編輯 | 編輯原始碼]

"rsync" 不是 SSH 套件的一部分,但幾乎無處不在。在傳輸到或從遠端系統傳輸時,它使用 SSH 來保護連線。

rsync file user@host:/path/

或者

rsync user@host:/path/file .

"rsync" 最棒的功能之一是,如果目標上存在檔案的早期版本,它只會傳輸任何更改。這樣可以節省時間和頻寬。"rsync" 有很多有用的選項,包括 -a 選項,該選項將遞迴複製與保留時間、屬性、所有者和組等結合在一起。

使用 SCP

[編輯 | 編輯原始碼]

SSH 套件仍然包含一個整潔的實用程式 "scp",它代表安全複製,它是一種在機器之間複製檔案的好方法。在最新版本中,它是一個 SFTP 包裝器,但它的工作方式幾乎與預設的 unix cp 命令完全相同。scp 還允許您將檔案從遠端主機複製到遠端主機。scp 的一個示例

scp user@host.com:~/files/ . 表示將 host.com 機器上使用者主目錄中的 files/ 目錄中的檔案(它將複製 files/ 目錄中的所有檔案)複製到 CWD(當前工作目錄)。

另一個很好的用途是使用它來加密從一臺機器到另一臺機器的任何資料的傳輸。作為一個極端的例子,您可以使用 SSH 來遠端將磁碟從一臺機器移動到另一臺機器(類似於 ghost,但安全)。這可能不是 SSH 的最佳用途,也不是在網路上從一臺機器到另一臺機器傳輸資料的最快方法,但這說明了 SSH 的強大功能。

scp,又名安全複製,工作方式與 rcp 相同。

  • 複製到遠端主機 - 您必須使用冒號。REMOTE_PATH 不是必需的,所有 REMOTE_PATH 都相對於使用者的主目錄。
    scp FILE_PATH user@host:REMOTE_PATH
  • 從遠端主機複製,
    scp user@host:REMOTE_PATH LOCAL_PATH

注意:如果您的檔名包含空格,請使用以下方式使用 scp:-

  • 檔名是 /media/sda6/Tutorials/Linux Unix/linux_book.pdf,目標目錄是 home/narendra/data
    • $scp user@host:"/media/sda6/Tutorials/Linux\\ Unix/linux_book.pdf" /home/narendra/data
  • 檔名是 /home/narendra/linux_book.pdf,目標目錄是 /media/Tutorials/Linux Unix/
    • $ scp /home/narendra/linux_book.pdf user@host:"/media/Tutorials/Linux\\ Unix/"

注意:如果您想複製整個目錄,請使用

  • scp -r user@host:"<syntaxhighlight_dirname>" <destination_dirname>

建立 SSH 金鑰

[編輯 | 編輯原始碼]

儘管 SSH 可以使用密碼,但這樣做並不推薦,並且許多伺服器不允許密碼登入。相反,請使用金鑰 - 這更安全,也更方便。

要建立 SSH 金鑰,

大多數現代 Unix 系統都包含 OpenSSH 客戶端。要生成金鑰,請執行

$ ssh-keygen

這將把您的私鑰儲存在$HOME/.ssh/id_rsa中,並將您的公鑰儲存在$HOME/.ssh/id_rsa.pub中。您可以使用不同的檔名,但這些是預設檔名,因此最好不要更改它們。

許可權

[編輯 | 編輯原始碼]

由於私鑰的安全至關重要,因此如果檔案許可權不安全,SSH 將無法正常工作。SSH 將以適當的許可權建立檔案和目錄,但有時會出現問題。要解決許可權問題

$ chmod 600 ~/.ssh/KEY ~/.ssh/KEY.pub
$ chmod 700 ~/.ssh

建立信任

[編輯 | 編輯原始碼]

要使用 SSH 金鑰登入到遠端伺服器,您需要將公鑰放在該伺服器的授權金鑰列表中。

換句話說,您需要將本地 ~/.ssh/id_rsa.pub 檔案的副本追加到遠端 ~/.ssh/authorized_keys 檔案的末尾。

傳輸方法 A:ssh-copy-id

[編輯 | 編輯原始碼]

最簡單的方法是使用 ssh-copy-id。這需要某種替代形式的身份驗證,通常是密碼(因為您還沒有在伺服器上獲得金鑰,因此您還不能使用金鑰身份驗證)。

ssh-copy-id -i ~/.ssh/KEY user@host.example.net

傳輸方法 B:分步操作

[編輯 | 編輯原始碼]

手動執行上述 ssh-copy-id 命令自動為您執行的每個步驟,這種方法比較麻煩

  • 首先,在目標伺服器上建立遠端 ~/.ssh 資料夾(如果尚不存在)。
ssh user@host "mkdir ~/.ssh && chmod 700 ~/.ssh"
  • 接下來上傳您的公鑰(而不是您的私鑰)。
cd ~/.ssh
sftp user@host.example.net:.ssh
put KEY.pub
  • 然後將您的公鑰追加到伺服器的授權金鑰列表中
ssh user@host.example.net
cat ~/.ssh/KEY.pub >> ~/.ssh/authorized_keys
rm ~/.ssh/KEY.pub

高階 *nix 使用者可以在一行中完成所有這些步驟

cat ~/.ssh/id_rsa.pub | ssh user@host.example.net "cat >> ~/.ssh/authorized_keys"

SSH 個人配置

[編輯 | 編輯原始碼]

您不需要設定~/.ssh/config檔案,但它使身份驗證更容易。重要的是指定您的使用者名稱和您的私鑰 - 如果在配置檔案中指定了此項,則無需在命令列中提供。使用 HostName,您可以將 ssh 命令縮短為

$ ssh servername
#Specific configuration applied to one host
#This configuration applies specifically to a host which uses Windows Domain login
Host Short_Name
        HostName server1.example.com
        User domain\username
        IdentityFile ~/.ssh/KEY

# Use this login as default for all hosts in the one domain
# It will look for a key with the hostname in the key's file name
Host *.example.com
        User domain\username
        IdentityFile ~/.ssh/%h_KEY

# Generic configuration that applies to my private LAN.
# Of note, the options to forward X11 lets you run remote graphical 
# programs while viewing and interacting with them locally.
Host localnetwork 192.168.1.0/24
        User USERNAME
        IdentityFile ~/.ssh/key_37_rsa
        AddKeysToAgent yes
        ForwardX11 yes
        # In a pesky lab environment, add the following to your config
        # CheckHostIP no

# Catch-all settings which apply these settings to all hosts, 
# if the particular option has not yet already been set.
# If there are a lot of keys in the SSH agent, then IdentitiesOnly is needed
Host *
        IdentitiesOnly yes
        ServerAliveCountMax 2
        ServerAliveInterval 20

您現在可以使用 ssh Short_Name 僅連線到 server1.example.com。配置選項是根據首次匹配原則選擇的,因此將非常具體的規則放在開頭,將更通用的規則放在結尾。

使用 SSH 代理

[編輯 | 編輯原始碼]

大多數桌面環境現在自動提供 SSH 代理。因此,如果您想檢視詳細資訊,請查詢環境變數$SSH_AUTH_SOCK$SSH_AGENT_PID,但只有前者用於連線到它,並且必須對需要連線到代理的任何程式可用。

金鑰可以輕鬆地手動新增到代理中,

ssh-add ~/.ssh/KEY

或者,它們可以在首次使用時透過在客戶端配置檔案中適當的規則集中將 AddKeysToAgent 設定為“yes”來自動新增。

但是,請記住,一旦代理中超過六個金鑰,就必須採取特殊措施來防止代理嘗試錯誤的金鑰並以錯誤的順序防止登入。具體來說,應將 IdentitiesOnly 設定為每個主機的“yes”,理想情況下應使用客戶端配置檔案。見下文。

SSH 與 Telnet 和“rsh” 之間最顯著的區別在於安全性。SSH 使用 RSAEcDSAEd25519 用於 公鑰密碼術

  • 您嘗試連線到的伺服器或域會為客戶端生成一對金鑰(公鑰和私鑰)。
  • 首次嘗試連線時,會將公鑰提供給客戶端。相應的私鑰是機密,並儲存在伺服器上。
  • 客戶端透過公鑰加密資料包,並使用儲存在那裡的相應私鑰解密這些資料。

伺服器到客戶端的通訊也以相同的方式實現 - 伺服器使用客戶端的公鑰加密,客戶端使用其私鑰解密。

使用公鑰密碼術設定 OpenSSH

[編輯 | 編輯原始碼]

以下假設對伺服器具有物理訪問許可權或某種帶外等效許可權。

使用發行版的包管理器,在伺服器上安裝 sshd(或 openssh-server),並在客戶端上安裝 ssh(或 openssh-client)。它們很可能已經安裝,因為它們通常是伺服器和工作站發行版預設安裝的一部分。確保以下內容位於伺服器上的 /etc/ssh/sshd_config 中,並且未被註釋掉。也就是說,它們前面沒有 #

PubkeyAuthentication yes
PasswordAuthentication no
  1. 在伺服器上,
    1. 在伺服器上開啟 TCP 埠 22 以進行傳入連線。這取決於您的防火牆。非標準埠。
    2. 如果伺服器位於使用 DHCP 的路由器後面
      1. 停止使用 DHCP,並將靜態 IP 地址分配給您的伺服器。如果您不知道如何操作,請參閱 Gentoo 手冊或 Arch Linux Wiki 以獲取說明。
      2. 將路由器上的外部 TCP 埠 22(或另一個埠)轉發到伺服器上的埠 22。
  2. 在客戶端上,建立並測試客戶端金鑰對
    1. 在客戶端命令列上,執行 ssh-keygen -f ~/.ssh/server.key(“rsa” 是預設值,不需要顯式指定“rsa”)。考慮使用 -C 選項在金鑰對上添加註釋。
    2. 將公鑰複製到可移動介質中,並將該介質傳輸到伺服器並將其掛載。將公鑰複製到伺服器,例如將其複製到伺服器上的 ~/.ssh/server.key 中。然後將金鑰追加到 authorized_keys 檔案中,cat ~/.ssh/server.key >> ~/.ssh/authorized_keys
    3. 回到客戶端,測試新金鑰是否有效:ssh -i ~/.ssh/server.key serve.example.com
  3. (重新)啟動 sshd 服務。
  4. 使用金鑰從客戶端再次登入

提示:如果您在伺服器上登入的使用者名稱與您當前在客戶端使用的使用者名稱相同,則無需指定在伺服器上登入的使用者名稱。

SSH 作為代理

[編輯 | 編輯原始碼]

如果您能夠建立 SSH 連線,則可以(很可能)將該連線用作 SOCKS5 代理,而無需在遠端計算機上進行任何額外設定。然後,可以透過 SSH 連線安全地隧道化流量。如果您使用的是無線連線,則可以使用此方法有效地保護所有流量免遭窺探。您還可以使用此方法繞過 IP 限制,因為您將顯示為從遠端計算機連線。請注意,除非採取特定措施,否則 DNS 流量不會被隧道化。

選擇一個較大的埠號(大於 1024,以便您可以將其用作非 root 使用者)。這裡我選擇 1080,這是標準的 SOCKS 埠。使用 -D 選項進行動態埠轉發。

ssh -D 1080 user@host

就是這樣。現在,只要 SSH 連線保持開啟狀態,您的應用程式就可以在您自己的計算機(localhost)上使用埠 1080 上的 SOCKS 代理。例如,在 Linux 上的 Firefox 中

  • 轉到編輯 -> 首選項 -> 高階 -> 網路 -> 連線 -> 設定...
  • 選中“手動代理配置”
  • 確保取消選中“對所有協議使用此代理伺服器”
  • 清除“HTTP 代理”、“SSL 代理”、“FTP 代理”和“Gopher 代理”欄位
  • 輸入“127.0.0.1”作為“SOCKS 主機”,輸入“1080”(或您選擇的任何埠)作為埠。

從您的瀏覽器使用 SSH

[編輯 | 編輯原始碼]

即使您沒有安全的 shell 客戶端,您也可以使用支援 javascript 的瀏覽器從瀏覽器中使用 ssh。為此,您必須在執行 SSH 伺服器的系統上安裝 AnyTerm、AjaxTerm 或 WebShell,或使用第三方服務,例如 WebSSH

SSH 反向隧道

[編輯 | 編輯原始碼]

使用反向隧道,您可以將遠端計算機(例如 AWS 上的計算機)用作本地計算機的入口點。因此,對遠端計算機 IP 上該特定埠的請求將被轉發到您的本地計算機,並返回響應。它被稱為**反向**隧道,因為這不是您的本地計算機向遠端計算機上的該埠傳送資料,而是**從遠端到本地**傳送資料。

用例:如果您的計算機位於 NAT 後面 - 沒有公網 IP 地址(或不是本地靜態 IP 地址) - 但您仍然希望將本地 HTTP 伺服器或某些資料庫或其他特定服務提供給公眾。

另一個用例:如果 torrent 播種,因為使用公網 IP 地址,更多計算機將能夠獲取您的合法資料。

這樣的命令可以設定一個反向隧道,其中遠端計算機上的埠 63368 透過 SSH 反向隧道轉發回源計算機上的埠 8000,透過在埠 4160 上連線 SSH。

ssh -R 63368:localhost:8000 -p 4160 host.example.net

格式為

ssh -R port-incoming:localhost:port-local -p port-for-for-connecting host.example.net

遠端計算機的 /etc/ssh/sshd_config 可以包含以下內容

AllowTcpForwarding yes
AllowAgentForwarding no
AllowStreamLocalForwarding yes
PermitTunnel yes
GatewayPorts yes	# optional, for external visibility

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書