SSH 的原理與應用

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協議是怎樣應對的呢?

四、口令登錄

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

<code>  

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)?

/<code>

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

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

<code>

Warning

: Permanently added

'host,12.18.429.21'

(RSA) to the list of known hosts./<code>

表示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上面:

<code>$ ssh-

copy

-

id

user@host/<code>

遠程主機將用戶的公鑰,保存在登錄後的用戶主目錄的~/.ssh/authorized_keys文件中。這樣,以後就登錄遠程主機不需要輸入密碼了。

如果還是不行,就用vim打開遠程主機的/etc/ssh/sshd_config這個文件,將以下幾行的註釋去掉。

<code>

RSAAuthentication

yes

  

PubkeyAuthentication

yes

  

AuthorizedKeysFile

.ssh/authorized_keys

/<code>

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

<code>

Redhat6系統

service

ssh restart

Redhat7系統

systemctl

restart sshd

ubuntu系統

service

ssh restart

debian系統

restart

/<code>

實戰

生成秘鑰

<code>

[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

[email protected]

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 [email protected] [root@Jaking .ssh]# [root@Jaking .ssh]# [root@Jaking .ssh]# [root@Jaking .ssh]# ssh-copy-id [email protected] /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 [email protected]'s password:

Number

of

key(s)

added:

1

Now

try

logging

into

the

machine,

with:

"ssh '[email protected]'"

and

check

to

make

sure

that

only

the

key(s)

you

wanted

were

added.

/<code>

驗證免密登錄

<code>

[root@Jaking

.ssh]#

ssh

[email protected]

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

/<code>

六、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,只要一條簡單命令就可以了。

<code>$ ssh user@host/<code>

如果本地用戶名與遠程用戶名一致,登錄時可以省略用戶名。

<code>$ ssh host/<code>

SSH的默認端口是22,也就是說,你的登錄請求會送進遠程主機的22端口。使用p參數,可以修改這個端口。

<code>$ ssh -p 

2018

user@host/<code>

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

總結

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


分享到:


相關文章: