本文件介紹 SSH 的原理與應用,這是企業級非常實用的技術,希望能給大家帶來幫助。

一、SSH簡介

SSH是Secure Shell的縮寫,也叫做安全外殼協議。SSH的主要目的是實現安全遠端登入。

二 、SSH工作原理

SSH的安全性比較好,其對資料進行加密的方式主要有兩種:對稱加密(金鑰加密)和非對稱加密(公鑰加密)。

對稱加密指加密解密使用的是同一套秘鑰。Client端把金鑰加密後傳送給Server端,Server用同一套金鑰解密。對稱加密的加密強度比較高,很難破解。但是,Client數量龐大,很難保證金鑰不洩漏。如果有一個Client端的金鑰洩漏,那麼整個系統的安全性就存在嚴重的漏洞。為了解決對稱加密的漏洞,於是就產生了非對稱加密。非對稱加密有兩個金鑰:“公鑰”和“私鑰”。公鑰加密後的密文,只能透過對應的私鑰進行解密。想從公鑰推理出私鑰幾乎不可能,所以非對稱加密的安全性比較高。

SSH的加密原理中,使用了RSA非對稱加密演算法。

整個過程是這樣的:

(1)遠端主機收到使用者的登入請求,把自己的公鑰發給使用者。

(2)使用者使用這個公鑰,將登入密碼加密後,傳送回來。

(3)遠端主機用自己的私鑰,解密登入密碼,如果密碼正確,就同意使用者登入。

三、中間人攻擊

SSH之所以能夠保證安全,原因在於它採用了公鑰加密,這個過程本身是安全的,但是實際用的時候存在一個風險:如果有人截獲了登入請求,然後冒充遠端主機,將偽造的公鑰發給使用者,那麼使用者很難辨別真偽。因為不像https協議,SSH協議的公鑰是沒有證書中心(CA)公證的,是自己簽發的。

如果攻擊者插在使用者與遠端主機之間(比如在公共的wifi區域),用偽造的公鑰,獲取使用者的登入密碼。再用這個密碼登入遠端主機,那麼SSH的安全機制就不存在了。這種風險就是著名的“中間人攻擊”(Man-in-the-middle attack)。那麼SSH協議是怎樣應對的呢?

四、口令登入

如果是第一次登入遠端機,會出現以下提示:

$ ssh user@host

The authenticity of host ‘host (12。18。429。21)’ can‘t be established。

RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d。

Are you sure you want to continue connecting (yes/no)?

因為公鑰長度較長(採用RSA演算法,長達1024位),很難比對,所以對其進行MD5計算,將它變成一個128位的指紋。如98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,這樣比對就容易多了。

經過比對後,如果使用者接受這個遠端主機的公鑰,系統會出現一句提示語:

Warning: Permanently added ’host,12。18。429。21‘ (RSA) to the list of known hosts。

表示host主機已得到認可,然後再輸入登入密碼就可以登入了。

當遠端主機的公鑰被接受以後,它就會被儲存在檔案~/。ssh/known_hosts之中。下次再連線這臺主機,系統就會認出它的公鑰已經儲存在本地了,從而跳過警告部分,直接提示輸入密碼。每個SSH使用者都有自己的known_hosts檔案,此外系統也有一個這樣的檔案,一般是/etc/ssh/ssh_known_hosts,儲存一些對所有使用者都可信賴的遠端主機的公鑰。

五、公鑰登入

使用密碼登入,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登入,可以省去輸入密碼的步驟。

所謂“公鑰登入”,原理很簡單,就是使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向用戶傳送一段隨機字串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入shell,不再要求密碼。

這種方法要求使用者必須提供自己的公鑰。如果沒有現成的,可以直接用ssh-keygen生成一個: $ ssh-keygen

執行上面的命令以後,系統會出現一系列提示,可以一路回車。其中有一個問題是,要不要對私鑰設定口令(passphrase),如果擔心私鑰的安全,這裡可以設定一個。

執行結束以後,在~/。ssh/目錄下,會新生成兩個檔案:id_rsa。pub和id_rsa。前者是公鑰,後者是私鑰。

這時再輸入下面的命令,將公鑰傳送到遠端主機host上面:

$ ssh-copy-id user@host

遠端主機將使用者的公鑰,儲存在登入後的使用者主目錄的~/。ssh/authorized_keys檔案中。

這樣,以後就登入遠端主機不需要輸入密碼了。

如果還是不行,就用vim開啟遠端主機的/etc/ssh/sshd_config這個檔案,將以下幾行的註釋去掉。

RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile 。ssh/authorized_keys

然後,重啟遠端主機的ssh服務。

Redhat6系統

service ssh restart

Redhat7系統

systemctl restart sshd

ubuntu系統

service ssh restart

debian系統

/etc/init。d/ssh restart

實戰

生成秘鑰

[root@Jaking ~]# ifconfig

ens33: flags=4163 mtu 1500

inet 192。168。10。88 netmask 255。255。255。0 broadcast 192。168。10。255

inet6 fe80::1026:b2d7:b2bc:82be prefixlen 64 scopeid 0x20

ether 00:0c:29:57:18:93 txqueuelen 1000 (Ethernet)

RX packets 993461 bytes 114570794 (109。2 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 66404 bytes 45385043 (43。2 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536

inet 127。0。0。1 netmask 255。0。0。0

inet6 ::1 prefixlen 128 scopeid 0x10

[root@Jaking ~]# ssh-keygen #這裡要一直按回車

Generating public/private rsa key pair。

Enter file in which to save the key (/root/。ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/。ssh/id_rsa。

Your public key has been saved in /root/。ssh/id_rsa。pub。

The key fingerprint is:

89:86:42:59:1f:27:f1:f4:26:e8:10:bb:ae:37:e2:69 root@Jaking。localdomain

The key’s randomart image is:

+——[ RSA 2048]——+

| o +。o |

| o + B 。 |

| o o o o o |

| 。 = 。 + |

| 。 o + S |

| o 。 |

| 。 |

| Eoo |

| o+o 。 |

+————————-+

[root@Jaking ~]# cat /root/。ssh/id_rsa

——-BEGIN RSA PRIVATE KEY——-

MIIEogIBAAKCAQEAuc8KoCp+dmHY99gOAt9ywPXv1YZyzdOKuDSaYZOMEp9c78sU

JDZl08LEQCSgiNKaUYZxd5XGMHkk2n9dDWKmH5NJ1KBP+Olp433A4W+BBFF71wRD

2OU8ulAwNNSsWB5Q2EXcCqHDtu9zN7fZvujPMVvVqprPqw+gXpskjRI2lG34iftf

lRJoChXSrEOJQEMwYJcps45xoy/7yOhPidpoU3BE1ojemMecL5bQTnd56eR1zjIE

pCtwNWaKm8VJfqHge/A75R60QKfv0SjsNQaddo7gqYBkj+2zbxiJY5K1WE5K4UyU

7wLzjBNZW0h/EaE73wHEKoFni8ydZ8cbjJJZhwIDAQABAoIBAARGg1QUJjzLG5b4

XborMhTGk/Ix2cpqp7J9Y2ADaSG0kQrjfV8n8UfiH2nqbdc4IVzm3w2FYL4Uy4hL

jfSU5IWtefFujuiHVmxppFqLmkhjJ5pW+siu3arb1YAhtKWCbRHM6bdE6Z/3+oq5

rET8TmgwWMZIMacaAPKsVzb3yFG5/AU4HS4V4XgmfoqEnjwrYUnySOcZKkYvoEPe

lJchN44SjrKd2MndtXRgm0GbSCbwrMj3Blmx8qutnaqzMZVIgicxu2tim6mTCWru

5SaydYQbDA3CX909qkvx4IVTYy2+6K1jfLy+ikhv3kJnivD0TAlEmJe4cR3G7zpV

kKdz1yECgYEA5Y971v7zz+GBeAhF9H2y7iUY9V3mSdWbwS2sCDXVpzwrjCYE9QGa

hbE6k5NyrUmK1GxhtWJbHUjDQMS8fvDIARJ23W3T/Y3sa6XBjN6Hq5DRyicy+0tJ

dxynEpqzFdkYt77bpcEKXhoAakpDrfrR182Wd4rk80UHdp1XlZcLIMsCgYEAzzWN

Yt2UJQ4aWRxTA0+H3NRZuzrSs8vl+i7Iw02ZsDxB39/0vCSsL0OczwdR6XK2tMvG

61Czve/8A9g/ERgFbWIGKqs777T9jgVS/JslRle4/JGCGeKZcw0msKOKqCHTYYOE

RAVZ2jPqaZZ8Gamc+TE6F5qupXhU8EB0csXpPrUCgYA5NeoqKb3/p/bJQF6W0SDf

wvUWaYF0Ez1PBp/iJ/CITjGYKv1/RhgJi6LKlqu0zihASoaLWujUQocOxDkp9b4S

rlRbWPzFKzKpnVTAU9FCC8SM+fn1sMytV8G3nEBXiJRlbrZ098gqrZY+5yU43dKg

UsdWIZJvolt6zzm9uTf3wwKBgGQo77oNf3HV+lh+v4XHKNZO8zz0tyrf8b/YY4U8

eoDc777G4+caFv0VwrO0Rx0ALV8BbZsLvIagfYJiQkICCYWRL4fqk6NQKow++JlQ

aVkySCIWN/xJM4GQptYVh420JBhr2UCEEaXPGI2Hh19kRJOT/w+v3qHvo6cqkN91

2URNAoGAGzMTIjaYBHVzdQAZT0Tb01xRXhV9BxH9WM8KPN2WH1pqxkMQ0DG0hnk9

hnC7Lv8W0kRUkDb56D+wxAyLe4GO4Zy51IGnAWGWivHmVxh6Q9ToggOiqsAGTGA/

HTGTElG7tOsXNIGu/eImgPeSKbAZ+Zi9HYNWx4SY/7OYnuwfXAM=

——-END RSA PRIVATE KEY——-

[root@Jaking ~]# cd /root/。ssh

[root@Jaking 。ssh]# ls

id_rsa id_rsa。pub known_hosts

[root@Jaking 。ssh]# cat id_rsa。pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5zwqgKn52Ydj32A4C33LA9e/VhnLN04q4NJphk4wSn1zvyxQkNmXTwsRAJKCI0ppRhnF3lcYweSTaf10NYqYfk0nUoE/46WnjfcDhb4EEUXvXBEPY5Ty6UDA01KxYHlDYRdwKocO273M3t9m+6M8xW9Wqms+rD6BemySNEjaUbfiJ+1+VEmgKFdKsQ4lAQzBglymzjnGjL/vI6E+J2mhTcETWiN6Yx5wvltBOd3np5HXOMgSkK3A1ZoqbxUl+oeB78DvlHrRAp+/RKOw1Bp12juCpgGSP7bNvGIljkrVYTkrhTJTvAvOME1lbSH8RoTvfAcQqgWeLzJ1nxxuMklmH root@Jaking。localdomain

[root@Jaking 。ssh]#

[root@Jaking 。ssh]#

[root@Jaking 。ssh]#

[root@Jaking 。ssh]# ssh-copy-id root@192。168。10。10

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed —— if you are prompted now it is to install the new keys

root@192。168。10。10‘s password:

Number of key(s) added: 1

Now try logging into the machine, with: “ssh ’root@192。168。10。10‘”

and check to make sure that only the key(s) you wanted were added。

驗證免密登入

[root@Jaking 。ssh]# ssh root@192。168。10。10

Last login: Wed Nov 20 15:18:11 2019 from 192。168。10。88

[root@Jaking ~]# ifconfig

ens32: flags=4163 mtu 1500

inet 192。168。10。10 netmask 255。255。255。0 broadcast 192。168。10。255

inet6 fe80::20c:29ff:fe84:eae5 prefixlen 64 scopeid 0x20

ether 00:0c:29:84:ea:e5 txqueuelen 1000 (Ethernet)

RX packets 16300 bytes 1107939 (1。0 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 13043 bytes 17924190 (17。0 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536

inet 127。0。0。1 netmask 255。0。0。0

inet6 ::1 prefixlen 128 scopeid 0x10

六、SSH埠轉發

SSH埠轉發有三種:動態埠轉發、本地埠轉發、遠端埠轉發。

這三種方式說起來有點難理解,透過例子會好理解一點。假設有三臺主機,host1、host2、host3。

動態埠轉發是找一個代理埠,然後透過代理埠去連相應的埠。動態埠轉發的好處在於透過代理埠可以去找很多需要連線的埠,提高了工作效率。比如host1本來是連不上host2的,而host3卻可以連上host2。host1可以找到host3作代理,然後透過host3去連線host2的相應埠

本地埠轉發也是找到第三方,透過第三方再連線想要連線的埠,但這種方式的埠轉發是固定的,是點對點的。比如假定host1是本地主機,host2是遠端主機。由於種種原因,這兩臺主機之間無法連通。但是,另外還有一臺host3,可以同時連上host1和host2這兩臺主機。透過host3,將host1連上host2。host1找到host3,host1和host3之間就像有一條資料傳輸的道路,通常被稱為“SSH隧道”,透過這條隧道host1就可以連上host2。

遠端埠轉發和本地埠轉發就是反過來了。假如host1在外網,host2在內網,正常情況下,host1不能訪問host2。透過遠端埠轉發,host2可以反過來訪問host1。host2和host1之間形成了一條道路,host1就可以透過這條道路去訪問host2。

七、SSH基本用法

SSH主要用於遠端登入:

假定你要以使用者名稱user,登入遠端主機host,只要一條簡單命令就可以了。

$ ssh user@host

如果本地使用者名稱與遠端使用者名稱一致,登入時可以省略使用者名稱。

$ ssh host

SSH的預設埠是22,也就是說,你的登入請求會送進遠端主機的22埠。使用p引數,可以修改這個埠。

$ ssh -p 2018 user@host

上面這條命令表示,ssh直接連線遠端主機的2018埠。

總結

以上就是 SSH 的原理與應用,希望大家能好好理解,給實際工作帶來幫助。