Linux 之七 SSH、SSL、OpenSSH、OpenSSL、LibreSSL
??在上一篇博文 Linux 之四 Ubuntu 20.04 WiFi 無法使用、設(shè)置無法顯示、遠(yuǎn)程桌面、SSH、Git、PPA 等各問題記錄 中,曾試圖使用遠(yuǎn)程桌面功能來連接使用我的 Ubuntu 20.04,但實(shí)際情況是遠(yuǎn)程桌面卡的是慘不忍睹,無奈還是得用 SSH 遠(yuǎn)程登錄。
??在網(wǎng)上找了很多 SSH 相關(guān)的文章,好記性不如爛筆頭,這里整理一下,做個(gè)備忘錄!
SSH
??SSH 為 Secure Shell 的縮寫(雖然名字中有個(gè) Shell,但他實(shí)際并不是 Shell),由互聯(lián)網(wǎng)工程任務(wù)組(Internet Engineering Task Force,IETF)的網(wǎng)絡(luò)小組(Network Working Group)所制定一個(gè)網(wǎng)絡(luò)協(xié)議。SSH 是一種建立在應(yīng)用層基礎(chǔ)上的加密的網(wǎng)絡(luò)協(xié)議。但是,就和 SSL 類似,它有不是僅僅工作在應(yīng)用層(映射到 TCP/IP 模型)!如下圖是 OSI 參考模型與 TCP/IP 模型對(duì)比:
??SSH 的經(jīng)典用途是登錄到遠(yuǎn)程電腦中執(zhí)行命令。除此之外,SSH 也支持隧道協(xié)議、端口映射和 X11 連接。借助 SFTP 或 SCP 協(xié)議,SSH 還可以傳輸文件。
??SSH 協(xié)議有兩個(gè)主要版本,分別是 SSH-1 和 SSH-2,兩者不兼容。2006 年,SSH-2 協(xié)議成為了新的標(biāo)準(zhǔn),而且目前我們使用的 SSH 大多數(shù)都是 SSH-2 版本的 SSH,其標(biāo)準(zhǔn)主要有 :
- RFC 4250 – The Secure Shell (SSH) Protocol Assigned Numbers
- RFC 4251 – The Secure Shell (SSH) Protocol Architecture
- RFC 4252 – The Secure Shell (SSH) Authentication Protocol
- RFC 4253 – The Secure Shell (SSH) Transport Layer Protocol
- RFC 4254 – The Secure Shell (SSH) Connection Protocol
- RFC 4255 – Using DNS to Securely Publish Secure Shell (SSH) Key Fingerprints
- RFC 4256 – Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)
- RFC 4335 – The Secure Shell (SSH) Session Channel Break Extension
- RFC 4344 – The Secure Shell (SSH) Transport Layer Encryption Modes
- RFC 4345 – Improved Arcfour Modes for the Secure Shell (SSH) Transport Layer Protocol
關(guān)于 RFC:
此外,關(guān)于 SSH 的幾個(gè)專有名詞也需要區(qū)分一下:
- SSH: 通用術(shù)語,指 SSH 協(xié)議 或 基于 SSH 協(xié)議的軟件產(chǎn)品
- SSH-1: SSH 協(xié)議版本 1。SSH 協(xié)議有多個(gè)修訂版,其中最為大家熟知的是 1.3 和 1.5
- SSH-2: SSH 協(xié)議版本 2。這是由 IETF 的 SECSH 工作組的若干標(biāo)準(zhǔn)文件中定義名稱
- SSH1: 通常代指 Tatu Yl?nen 實(shí)現(xiàn)的 SSH 協(xié)議版本 1 的軟件名字
- SSH2: SSH Communications Security, Inc. (http://www.ssh.com) 實(shí)現(xiàn)的 SSH 協(xié)議版本 2 的軟件名字,這是一個(gè)SSH 協(xié)議版本 2 的商業(yè)版軟件實(shí)現(xiàn)
- ssh: 全部小寫的 ssh 是 OpenSSH 中實(shí)現(xiàn)的 SSH 客戶端的軟件名字,這也是如今我們使用最多的 SSH 軟件。
歷史
架構(gòu)
??SSH 的軟件架構(gòu)采用了服務(wù)器-客戶端模式(Server - Client),默認(rèn)的端口為 22。SSH 通過在網(wǎng)絡(luò)中創(chuàng)建安全隧道來實(shí)現(xiàn) SSH 客戶端與服務(wù)器之間的連接。整體架構(gòu)如下圖所示:
??SSH 協(xié)議有兩個(gè)主要版本,分別是 SSH-1 和 SSH-2,這兩個(gè)版本的協(xié)議是不兼容的!與 SSH-1 相比,SSH-2 進(jìn)行了一系列功能改進(jìn)并增強(qiáng)了安全性,還支持通過單個(gè)SSH 連接任意數(shù)量的 shell 會(huì)話。兩者架構(gòu)對(duì)比如下所示:
??SSH-1 被設(shè)計(jì)為一個(gè)整體,在這個(gè)單個(gè)協(xié)議中定義了多個(gè)不同的功能,而 SSH-2 則被設(shè)計(jì)為分成不同的模塊層,共由三種協(xié)議組成:
- Transport Layer Protocol: 該協(xié)議兼容服務(wù)器身份驗(yàn)證、私密性和完整性,具有完美的前向私密性。這一層可以提供可選的壓縮,并通過TCP/IP 連接運(yùn)行,但也可以在任何其他可靠的數(shù)據(jù)流之上使用。
- User Authentication Protocol: 該協(xié)議向服務(wù)器驗(yàn)證客戶端,并在傳輸層上運(yùn)行。
- Connection Protocol: 該協(xié)議通過用戶認(rèn)證協(xié)議將加密通道多路復(fù)用到多個(gè)邏輯通道。
OpenSSH
??SSH 只是一種協(xié)議,存在多種實(shí)現(xiàn),既有商業(yè)實(shí)現(xiàn),也有開源實(shí)現(xiàn)。目前,OpenSSH 是最流行的 SSH 實(shí)現(xiàn),而且成為了大量操作系統(tǒng)的默認(rèn)組件。OpenSSH 仍在積極維護(hù)中,而且已經(jīng)支持 SSH-2 協(xié)議。從 7.6 版開始,OpenSSH 不再支持 SSH-1 協(xié)議。官網(wǎng):https://www.openssh.com/ 。OpenSSH 主要包含以下工具:
- 客戶端工具 ssh、scp、sftp
- ssh:ssh 客戶端,是一個(gè)用于登錄到遠(yuǎn)程計(jì)算機(jī)并在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行命令的程序。
- scp:用于在網(wǎng)絡(luò)上的主機(jī)之間復(fù)制文件
- sftp:一個(gè)文件傳輸程序,類似于 ftp,它通過加密的 ssh 傳輸執(zhí)行所有操作。
- 密鑰管理工具 ssh-add、ssh-keysign、ssh-keyscan、ssh-keygen
- ssh-add:用于將私鑰標(biāo)識(shí)添加到身份驗(yàn)證代理(ssh-agent)。在沒有參數(shù)的情況下運(yùn)行時(shí),它會(huì)添加文件 ?/.ssh/id_rsa,?/.ssh/id_dsa,?/ .ssh/id_ecdsa,?/.ssh/id_ecdsa_sk,?/.ssh/id_ed25519 和 ?/.ssh /id_ed25519_sk。加載私鑰后,ssh-add 將嘗試從以-cert.pub 結(jié)尾的文件中加載相應(yīng)的證書信息。
- ssh-keysign:ssh 使用 ssh-keysign 訪問本地主機(jī)密鑰并生成基于主機(jī)身份驗(yàn)證所需的數(shù)字簽名。默認(rèn)情況下,該功能是被禁用的,且該程序一般不需要用戶調(diào)用,而是由 ssh 程序自動(dòng)調(diào)用。
- ssh-keyscan:用于收集其他主機(jī)的公共 SSH 主機(jī)鍵的實(shí)用程序。它旨在幫助構(gòu)建和驗(yàn)證 SSH_KNOKN_HOSTS 文件。
- ssh-keygen:OpenSSH 身份驗(yàn)證密鑰實(shí)用程序
- 服務(wù)端工具 sshd、sftp-server、ssh-agent
- sshd:即 OpenSSH Daemon,是 ssh 的守護(hù)程序,也即 SSH 的服務(wù)端程序。它通過不安全的網(wǎng)絡(luò)在兩個(gè)不受信任的主機(jī)之間提供安全的加密通信。
- ssh-agent:用來保存用于公鑰身份驗(yàn)證的私鑰。通過使用環(huán)境變量,它可以在使用 ssh 登陸其他計(jì)算機(jī)時(shí),定位并自動(dòng)處理身份驗(yàn)證。
- sftp-server:sftp 服務(wù)端程序,用來接收并處理來自 sftp 的連接。改程序通常也不需要由用戶調(diào)用,而是由 ssh 來調(diào)用
詳細(xì)的介紹及使用方法,可以參考 OpenSSH 官方文檔:https://www.openssh.com/manual.html。
??在這個(gè)架構(gòu)中,SSH 軟件分成兩個(gè)部分:向服務(wù)器發(fā)出請(qǐng)求的部分,稱為客戶端(client),OpenSSH 的實(shí)現(xiàn)為 ssh;接收客戶端發(fā)出的請(qǐng)求的部分,稱為服務(wù)器(server),OpenSSH 的實(shí)現(xiàn)為 sshd。
??目前,SSH 已經(jīng)成為了類 Unix 系統(tǒng)的標(biāo)配組件,直接在 Ubuntu 終端中輸入 ssh -V 就可以查看 Ubuntu 自帶了 ssh 客戶端的版本,我這里的版本號(hào)是 OpenSSH_8.2p1。
然而 Ubuntu 默認(rèn)并沒有安裝 ssh server,因此需要自己安裝:sudo apt-get install openssh-server,安裝之后,查看一下:
第一個(gè)查看安裝了 ssh 相關(guān)的包,第二個(gè)查看 ssh 服務(wù)器有沒有運(yùn)行(ssh-agent 表示 ssh-client 啟動(dòng),sshd 表示 ssh-server 啟動(dòng))!
??注意,第一次安裝之后,SSH 服務(wù)端會(huì)被默認(rèn)啟動(dòng),但是重啟電腦之后,SSH 服務(wù)端默認(rèn)不會(huì)自動(dòng)啟動(dòng)。手動(dòng)啟動(dòng)的命令為:sudo service ssh start。當(dāng)然,我們可以選擇將 SSH 服務(wù)端配置為開機(jī)自啟動(dòng)。
??在早期的 Linux 中,rc.local 是在系統(tǒng)初始化級(jí)別腳本運(yùn)行之后再執(zhí)行的,可以安全地在里面添加想在系統(tǒng)啟動(dòng)之后執(zhí)行的腳本。然而,在比較新的 Linux 發(fā)行版已經(jīng)沒有 rc.local 文件了,因?yàn)橐呀?jīng)將其服務(wù)化了。直接使用命令:sudo systemctl enable ssh 表示開機(jī)自啟動(dòng) SSH 服務(wù)端。下面是一些常用命令:
??根據(jù)網(wǎng)友介紹,目前也可以手動(dòng)添加 rc.local,在 exit 0 語句前加入:/etc/init.d/ssh start ,這樣使 SSH 服務(wù)端開啟自動(dòng)啟動(dòng)。具體方法參考:https://cloud.tencent.com/developer/article/1721972
??同樣,從 Windows 10 1803 版本開始,微軟也提供 OpenSSH 工具。直接在 Windows Terminal 中(CMD)輸入 ssh 就可以查看當(dāng)前系統(tǒng)中的 SSH 版本,與 Ubuntu 不同的是,Windows 同時(shí)提供了 SSH 客戶端和服務(wù)端:
Windows 下如果要使用服務(wù)端需要進(jìn)行一些配置。
配置
??SSH 的運(yùn)行需要各種配置文件。SSH 客戶端的全局配置文件是 ssh_config,服務(wù)端的配置文件是 sshd_config,他們都位于 /etc/ssh 目錄下。這里需要注意,在 Windows 系統(tǒng)中,稍微有些不同。
Windows 系統(tǒng)中的 OpenSSH 默認(rèn)沒有這兩個(gè)配置文件。例如,默認(rèn)沒有服務(wù)端的配置文件 sshd_config,如果要運(yùn)行服務(wù)端,會(huì)提示如下錯(cuò)誤(Windows 上正確啟用 SSH 服務(wù)端需要從 設(shè)置 → 應(yīng)用 →可選功能 中添加服務(wù)端,然后使用命令:net start sshd):
如果我們正常添加了 SSH 服務(wù)端,那么在 C:\ProgramData\ssh 下就會(huì)找到各種配置文件,如下圖所示:
此外,在 Windows 下,在用戶個(gè)人的配置文件在 用戶名/.ssh/config,優(yōu)先級(jí)高于全局配置文件。
基本用法
??SSH 最常見的用途就是登錄服務(wù)器,這要求服務(wù)器安裝并正在運(yùn)行 SSH 服務(wù)器軟件。以上面介紹的 OpenSSH 工具,來簡(jiǎn)單介紹一下使用方法,從 Windows 遠(yuǎn)程登錄 Ubuntu。首先,Ubuntu 必須要先啟動(dòng) SSH 服務(wù)器,方法如上面說的。否則將收到如下錯(cuò)誤:
??最簡(jiǎn)單的 SSH 登錄服務(wù)器的命令是:ssh hostname,hostname 可以是 IP 地址,也可以是域名。同時(shí),我們還可以指定登錄遠(yuǎn)程服務(wù)器的用戶名,命令為:ssh username@hostname。用戶名也可以使用 SSH 的 -l 參數(shù)指定,這樣的話,用戶名和主機(jī)名就不用寫在一起了:ssh -l username hostname。此外,SSH 默認(rèn)的端口為 22,如果不使用默認(rèn)的端口,則需要 -p 參數(shù)可以指定其他端口:ssh -p 6666 hostname。
??如果是第一次連接某一臺(tái)服務(wù)器,命令行會(huì)顯示一段文字(如上圖),表示不認(rèn)識(shí)這臺(tái)機(jī)器,提醒用戶確認(rèn)是否需要連接。其中的 ECDSA key fingerprint is SHA256:NhIe5F7qTvYgV7INlL5k0WYj4vc+P22d9d5yyPuSlDM. 就是服務(wù)器的公鑰的哈希值。一旦用戶確認(rèn)連接之后,ssh 會(huì)將本機(jī)連接過的所有服務(wù)器公鑰的指紋,都儲(chǔ)存在本機(jī)的 ~/.ssh/known_hosts 文件中。每次連接服務(wù)器時(shí),通過該文件判斷是否為陌生主機(jī)(陌生公鑰)。
SSL/TLS
??安全套接字層(Secure Socket Layer ,SSL)協(xié)議是一種認(rèn)證和加密技術(shù),通過伯克利套接字樣式 API 向 TCP 客戶提供安全服務(wù)。 最初是由 Netscape Communications Corporation(網(wǎng)景)公司開發(fā),用于給客戶端和服務(wù)器通信的 HTTP 協(xié)議加密,以保證安全。
??雖然 SSH 在網(wǎng)絡(luò)通信安全中很流行,但是它并不是唯一的保證網(wǎng)絡(luò)通信安全的方案。身份驗(yàn)證、加密和網(wǎng)絡(luò)安全早在 SSH 之前就已經(jīng)出現(xiàn)了,SSL/TLS 就是其中的一個(gè)非常流行安全解決方案。
??1999 年,互聯(lián)網(wǎng)標(biāo)準(zhǔn)化組織 ISOC 接替 NetScape 公司,發(fā)布了 SSL 的升級(jí)版 Transport Layer Security(TLS)1.0 版的標(biāo)準(zhǔn)文檔 RFC2246,并在后續(xù)修訂了多個(gè)版本。如下表是 SSL/TLS 不同版本的發(fā)布情況:
| SSL1.0 | 1994 | 網(wǎng)景公司制定,但并未對(duì)外發(fā)布 |
| SSL2.0 | 1995 | 很快發(fā)現(xiàn)有嚴(yán)重漏洞,網(wǎng)景公司開始設(shè)計(jì)3.0。 2011 在 RFC6176 中被標(biāo)記為廢棄 |
| SSL3.0 | 1996 | 2015 在 RFC7568 中被標(biāo)記為廢棄 |
| TLS1.0 | 1999 | 2020 在 RFC8996 中被標(biāo)記為廢棄 |
| TLS1.1 | 2006 | 2020 在 RFC8996 中被標(biāo)記為廢棄 |
| TLS1.2 | 2008 | |
| TLS1.3 | 2018 |
??TLS 和 SSL 就是一個(gè)東西,TLS 是 SSL 的改進(jìn)升級(jí)。當(dāng)前使用最多的是 TLS1.2 和 TLS1.3。在實(shí)際使用中,仍然有很多文獻(xiàn)使用 SSL 這個(gè)名字,或者使用 SSL/TLS。實(shí)際情況是,SSL3.0 發(fā)布至今沒有更新過,且被發(fā)現(xiàn)了很多漏洞,現(xiàn)在還少使用 SSL3.0 了。
架構(gòu)
??SSL/TLS 協(xié)議采用主從式架構(gòu)模型,基本思路是采用公鑰加密法,即:客戶端先向服務(wù)器端索要公鑰,然后用公鑰加密信息,服務(wù)器收到密文后,用自己的私鑰解密。主要由 SSL record protocol、Handshake protocol、Change-cipher spec protocol、Alert protocol 組成。
- SSL Record Protocol: SSL Record 為 SSL 連接提供了加密(加密方法由 Handshake Protocol 確定)和消息完整性校驗(yàn)這兩個(gè)功能。在 SSL 記錄協(xié)議中,應(yīng)用程序數(shù)據(jù)被分成片段。片段可選擇被壓縮,然后附加由 SHA(安全散列協(xié)議)和 MD5(消息摘要)生成的算法生成的加密 MAC(消息認(rèn)證碼)。之后,完成數(shù)據(jù)的加密,并且在最后加上一個(gè) SSL 報(bào)頭,最終形成一條完整的報(bào)文。
- Handshake Protocol: 握手協(xié)議用于建立會(huì)話。該協(xié)議允許客戶端和服務(wù)器通過向?qū)Ψ桨l(fā)送一系列消息來彼此進(jìn)行身份驗(yàn)證。握手協(xié)議使用四個(gè)階段來完成其循環(huán)。
- Change-cipher Protocol: 該協(xié)議使用 SSL Record Protocol。除非完成握手協(xié)議,否則 SSL記錄輸出將處于掛起狀態(tài)。握手協(xié)議完成后,掛起狀態(tài)轉(zhuǎn)換為當(dāng)前狀態(tài)。該 協(xié)議由單個(gè)消息組成,該消息長(zhǎng)度為 1 字節(jié),并且只能具有一個(gè)值。該協(xié)議的目的是使待定狀態(tài)復(fù)制到當(dāng)前狀態(tài)。
- Alert Protocol: 該協(xié)議用于將 SSL 相關(guān)的警報(bào)傳達(dá)給對(duì)等實(shí)體。此協(xié)議中的每個(gè)消息包含 2 個(gè)字節(jié)。該層被進(jìn)一步分成告警(不影響雙方連接)和致命錯(cuò)誤(需要中斷雙方連接)兩部分。
關(guān)于 SSL/TLS 協(xié)議 每部分中詳細(xì)的定義,可以參見 https://en.wikipedia.org/wiki/Transport_Layer_Security#Protocol_details。
OpenSSL/LibreSSL
??SSL/TLS 協(xié)議的具體實(shí)現(xiàn),在不同的操作系統(tǒng)中有多種存在。OpenSSL 就是 SSL/TLS 協(xié)議的一個(gè)開源實(shí)現(xiàn)。下圖是維基百科整理的各種 SSL/TLS 協(xié)議 實(shí)現(xiàn)對(duì)于 SSL/TLS 協(xié)議 版本的支持情況:
??從上上一節(jié)的圖中可以看到,Ubuntu 中的 OpenSSH 使用是 OpenSSL 1.1.1f 提供的加密算法庫(kù)。 微軟在 Win10 中集成的 OpenSSH 使用的就是 LibreSSL 加密算法庫(kù)。OpenSSL 開源加密庫(kù)之前發(fā)現(xiàn)的漏洞影響遍及整個(gè)互聯(lián)網(wǎng)。OpenBSD 的開發(fā)者為此而創(chuàng)建了 OpenSSL的 分支 LibreSSL,用戶編譯時(shí)可選擇鏈接到 LibreSSL 庫(kù)。許多大型公司出于安全,效率等考慮,會(huì)將 OpenSSH 集成到自己系統(tǒng)之后,用自己實(shí)現(xiàn)的算法替換這個(gè)算法庫(kù)。
??Heartbleed 漏洞的披露讓人們意識(shí)到 OpenSSL 就是這樣一個(gè)組件。這促使 Linux 基金會(huì)發(fā)起了 Core Infrastructure Initiative 倡議,資助關(guān)鍵基礎(chǔ)組件的開發(fā)和維護(hù)。就目前來看,OpenSSL 的維護(hù)要比 LibreSSL 要積極一些。而且 Linux 對(duì)于 LibreSSL 的支持明顯不如 OpenSSL。具體見 Github:
- OpenSSL: https://www.openssl.org/;官方 Github 庫(kù): https://github.com/openssl/openssl
- LibreSSL: http://www.libressl.org/;官方 Github 庫(kù): https://github.com/libressl-portable/
參考
10.https://en.wikipedia.org/wiki/Transport_Layer_Security
總結(jié)
以上是生活随笔為你收集整理的Linux 之七 SSH、SSL、OpenSSH、OpenSSL、LibreSSL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华大 MCU 之七 DMA 导致 SPI
- 下一篇: Linux 之八 完整嵌入式 Linux