SSH 的原理與應用

本文檔介紹 SSH 的原理與應用,這是企業級很是實用的技術,但願能給你們帶來幫助。

1、SSH簡介linux

SSH是Secure Shell的縮寫,也叫作安全外殼協議。SSH的主要目的是實現安全遠程登陸。算法

二 、SSH工做原理shell

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

對稱加密指加密解密使用的是同一套祕鑰。Client端把密鑰加密後發送給Server端,Server用同一套密鑰解密。對稱加密的加密強度比較高,很難破解。可是,Client數量龐大,很難保證密鑰不泄漏。若是有一個Client端的密鑰泄漏,那麼整個系統的安全性就存在嚴重的漏洞。爲了解決對稱加密的漏洞,因而就產生了非對稱加密。非對稱加密有兩個密鑰:「公鑰」和「私鑰」。公鑰加密後的密文,只能經過對應的私鑰進行解密。想從公鑰推理出私鑰幾乎不可能,因此非對稱加密的安全性比較高。vim

SSH的加密原理中,使用了RSA非對稱加密算法。
整個過程是這樣的:
(1)遠程主機收到用戶的登陸請求,把本身的公鑰發給用戶。
(2)用戶使用這個公鑰,將登陸密碼加密後,發送回來。
(3)遠程主機用本身的私鑰,解密登陸密碼,若是密碼正確,就贊成用戶登陸。安全

3、中間人***dom

SSH之因此可以保證安全,緣由在於它採用了公鑰加密,這個過程自己是安全的,可是實際用的時候存在一個風險:若是有人截獲了登陸請求,而後冒充遠程主機,將僞造的公鑰發給用戶,那麼用戶很難辨別真僞。由於不像https協議,SSH協議的公鑰是沒有證書中心(CA)公證的,是本身簽發的。ssh

若是***者插在用戶與遠程主機之間(好比在公共的wifi區域),用僞造的公鑰,獲取用戶的登陸密碼。再用這個密碼登陸遠程主機,那麼SSH的安全機制就不存在了。這種風險就是著名的"中間人***"(Man-in-the-middle attack)。那麼SSH協議是怎樣應對的呢?ide

4、口令登陸ui

若是是第一次登陸遠程機,會出現如下提示:

$ 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,保存一些對全部用戶均可信賴的遠程主機的公鑰。

5、公鑰登陸

使用密碼登陸,每次都必須輸入密碼,很是麻煩。好在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=4163mtu 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=73mtu 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=4163mtu 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=73mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10

6、SSH端口轉發

SSH端口轉發有三種:動態端口轉發、本地端口轉發、遠程端口轉發。
這三種方式提及來有點難理解,經過例子會好理解一點。假設有三臺主機,host一、host二、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。

7、SSH基本用法

SSH主要用於遠程登陸:
假定你要以用戶名user,登陸遠程主機host,只要一條簡單命令就能夠了。

$ ssh user@host

若是本地用戶名與遠程用戶名一致,登陸時能夠省略用戶名。

$ ssh host

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

$ ssh -p 2018 user@host

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

總結

以上就是 SSH 的原理與應用,但願你們能好好理解,給實際工做帶來幫助。

相關文章
相關標籤/搜索