新聞中心
SSH(Secure Shell)是一套協(xié)議標(biāo)準(zhǔn),可以用來實現(xiàn)兩臺機(jī)器之間的安全登錄以及安全的數(shù)據(jù)傳送,其保證數(shù)據(jù)安全的原理是非對稱加密,本篇文章簡單講解一下SSH的工作原理。

創(chuàng)新互聯(lián)公司主要業(yè)務(wù)有網(wǎng)站營銷策劃、網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、微信小程序開發(fā)、HTML5、程序開發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當(dāng)客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務(wù)的過程中,公司還積累了豐富的行業(yè)經(jīng)驗、網(wǎng)絡(luò)營銷推廣資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶服務(wù)和保障體系。
SSH工作原理
SSH的安全性比較好,其對數(shù)據(jù)進(jìn)行加密的方式主要有兩種:對稱加密(密鑰加密)和非對稱加密(公鑰加密)。
對稱加密指加密解密使用的是同一套秘鑰。Client端把密鑰加密后發(fā)送給Server端,Server用同一套密鑰解密。對稱加密的加密強(qiáng)度比較高,很難破解。但是,Client數(shù)量龐大,很難保證密鑰不泄漏。如果有一個Client端的密鑰泄漏,那么整個系統(tǒng)的安全性就存在嚴(yán)重的漏洞。為了解決對稱加密的漏洞,于是就產(chǎn)生了非對稱加密。非對稱加密有兩個密鑰:“公鑰”和“私鑰”。公鑰加密后的密文,只能通過對應(yīng)的私鑰進(jìn)行解密。想從公鑰推理出私鑰幾乎不可能,所以非對稱加密的安全性比較高。
SSH的加密原理中,使用了RSA非對稱加密算法。 整個過程是這樣的: (1)遠(yuǎn)程主機(jī)收到用戶的登錄請求,把自己的公鑰發(fā)給用戶。 (2)用戶使用這個公鑰,將登錄密碼加密后,發(fā)送回來。 (3)遠(yuǎn)程主機(jī)用自己的私鑰,解密登錄密碼,如果密碼正確,就同意用戶登錄。
中間人攻擊
SSH之所以能夠保證安全,原因在于它采用了公鑰加密,這個過程本身是安全的,但是實際用的時候存在一個風(fēng)險:如果有人截獲了登錄請求,然后冒充遠(yuǎn)程主機(jī),將偽造的公鑰發(fā)給用戶,那么用戶很難辨別真?zhèn)?。因為不像https協(xié)議,SSH協(xié)議的公鑰是沒有證書中心(CA)公證的,是自己簽發(fā)的。
如果攻擊者插在用戶與遠(yuǎn)程主機(jī)之間(比如在公共的wifi區(qū)域),用偽造的公鑰,獲取用戶的登錄密碼。再用這個密碼登錄遠(yuǎn)程主機(jī),那么SSH的安全機(jī)制就不存在了。這種風(fēng)險就是著名的”中間人攻擊”(Man-in-the-middle attack)。那么SSH協(xié)議是怎樣應(yīng)對的呢?
口令登錄
如果是第一次登錄遠(yuǎn)程機(jī),會出現(xiàn)以下提示:
$ 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算法,長達(dá)1024位),很難比對,所以對其進(jìn)行MD5計算,將它變成一個128位的指紋。如98:2e:d7:e09f:ac:67:28:c2:42:2d:37:16:58:4d,這樣比對就容易多了。
經(jīng)過比對后,如果用戶接受這個遠(yuǎn)程主機(jī)的公鑰,系統(tǒng)會出現(xiàn)一句提示語:
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
表示host主機(jī)已得到認(rèn)可,然后再輸入登錄密碼就可以登錄了。
當(dāng)遠(yuǎn)程主機(jī)的公鑰被接受以后,它就會被保存在文件~/.ssh/known_hosts之中。下次再連接這臺主機(jī),系統(tǒng)就會認(rèn)出它的公鑰已經(jīng)保存在本地了,從而跳過警告部分,直接提示輸入密碼。每個SSH用戶都有自己的known_hosts文件,此外系統(tǒng)也有一個這樣的文件,一般是/etc/ssh/ssh_known_hosts,保存一些對所有用戶都可信賴的遠(yuǎn)程主機(jī)的公鑰。
公鑰登錄
使用密碼登錄,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登錄,可以省去輸入密碼的步驟。 所謂”公鑰登錄”,原理很簡單,就是用戶將自己的公鑰儲存在遠(yuǎn)程主機(jī)上。登錄的時候,遠(yuǎn)程主機(jī)會向用戶發(fā)送一段隨機(jī)字符串,用戶用自己的私鑰加密后,再發(fā)回來。遠(yuǎn)程主機(jī)用事先儲存的公鑰進(jìn)行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。
這種方法要求用戶必須提供自己的公鑰。如果沒有現(xiàn)成的,可以直接用ssh-keygen生成一個: $ ssh-keygen
運行上面的命令以后,系統(tǒng)會出現(xiàn)一系列提示,可以一路回車。其中有一個問題是,要不要對私鑰設(shè)置口令(passphrase),如果擔(dān)心私鑰的安全,這里可以設(shè)置一個。 運行結(jié)束以后,在~/.ssh/目錄下,會新生成兩個文件:id_rsa.pub和id_rsa。前者是公鑰,后者是私鑰。
這時再輸入下面的命令,將公鑰傳送到遠(yuǎn)程主機(jī)host上面:
$ ssh-copy-id user@host
遠(yuǎn)程主機(jī)將用戶的公鑰,保存在登錄后的用戶主目錄的~/.ssh/authorized_keys文件中。 這樣,以后就登錄遠(yuǎn)程主機(jī)不需要輸入密碼了。
如果還是不行,就用vim打開遠(yuǎn)程主機(jī)的/etc/ssh/sshd_config這個文件,將以下幾行的注釋去掉。
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
然后,重啟遠(yuǎn)程主機(jī)的ssh服務(wù)。
Redhat6系統(tǒng)
service ssh restart
Redhat7系統(tǒng)
systemctl restart sshd
ubuntu系統(tǒng)
service ssh restart
debian系統(tǒng)
/etc/init.d/ssh restart
實戰(zhàn)
生成秘鑰
[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.
驗證免密登錄
[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
SSH端口轉(zhuǎn)發(fā)
SSH端口轉(zhuǎn)發(fā)有三種:動態(tài)端口轉(zhuǎn)發(fā)、本地端口轉(zhuǎn)發(fā)、遠(yuǎn)程端口轉(zhuǎn)發(fā)。 這三種方式說起來有點難理解,通過例子會好理解一點。假設(shè)有三臺主機(jī),host1、host2、host3。
動態(tài)端口轉(zhuǎn)發(fā)是找一個代理端口,然后通過代理端口去連相應(yīng)的端口。動態(tài)端口轉(zhuǎn)發(fā)的好處在于通過代理端口可以去找很多需要連接的端口,提高了工作效率。比如host1本來是連不上host2的,而host3卻可以連上host2。host1可以找到host3作代理,然后通過host3去連接host2的相應(yīng)端口
本地端口轉(zhuǎn)發(fā)也是找到第三方,通過第三方再連接想要連接的端口,但這種方式的端口轉(zhuǎn)發(fā)是固定的,是點對點的。比如假定host1是本地主機(jī),host2是遠(yuǎn)程主機(jī)。由于種種原因,這兩臺主機(jī)之間無法連通。但是,另外還有一臺host3,可以同時連上host1和host2這兩臺主機(jī)。通過host3,將host1連上host2。host1找到host3,host1和host3之間就像有一條數(shù)據(jù)傳輸?shù)牡缆?,通常被稱為“SSH隧道”,通過這條隧道host1就可以連上host2。
遠(yuǎn)程端口轉(zhuǎn)發(fā)和本地端口轉(zhuǎn)發(fā)就是反過來了。假如host1在外網(wǎng),host2在內(nèi)網(wǎng),正常情況下,host1不能訪問host2。通過遠(yuǎn)程端口轉(zhuǎn)發(fā),host2可以反過來訪問host1。host2和host1之間形成了一條道路,host1就可以通過這條道路去訪問host2。
SSH基本用法
SSH主要用于遠(yuǎn)程登錄: 假定你要以用戶名user,登錄遠(yuǎn)程主機(jī)host,只要一條簡單命令就可以了。
$ ssh user@host
如果本地用戶名與遠(yuǎn)程用戶名一致,登錄時可以省略用戶名。
$ ssh host
SSH的默認(rèn)端口是22,也就是說,你的登錄請求會送進(jìn)遠(yuǎn)程主機(jī)的22端口。使用p參數(shù),可以修改這個端口。
$ ssh -p 2018 user@host
上面這條命令表示,ssh直接連接遠(yuǎn)程主機(jī)的2018端口。
標(biāo)題名稱:簡單講解一下SSH的工作原理
文章路徑:http://fisionsoft.com.cn/article/ccdhogj.html


咨詢
建站咨詢
