一笼痹、作用
ssh(Security Shell)是用來實現(xiàn)安全遠程管理的一個協(xié)議鳍置。相比于telnet,使用ssh能夠有效地解決信息泄露的問題排截。
二、算法及交互過程
ssh建立連接主要有以下五個步驟:
①協(xié)商ssh版本
②協(xié)商將要使用的各種算法
③通過Diffie-Hellman算法得到之后通信所使用的密鑰
④認證階段,服務器對客戶端進行身份驗證
⑤認證成功之后匾寝,客戶端請求發(fā)起會話搬葬,服務器確認之后即可開始信息交互
2.1.協(xié)商ssh版本
①客戶端向服務器發(fā)起連接請求,ssh協(xié)議基于TCP艳悔,默認端口為22
②服務器把自己的ssh協(xié)議版本號發(fā)送給客戶端
③客戶端知道了服務器所使用的版本后急凰,選擇相同或者能夠兼容服務器的版本,將版本信息發(fā)送給服務器
④服務器判斷是否支持客戶端要使用的版本猜年,如果支持抡锈,將進入算法和密鑰的協(xié)商階段,否則關閉此連接
2.2.算法協(xié)商
①客戶端發(fā)送自己支持的公鑰算法列表乔外,加密算法列表床三,MAC算法列表,壓縮算法列表
②服務器回復ack報文確認杨幼,并發(fā)送自己支持的各種算法列表
③雙方開始協(xié)商要使用的各種算法撇簿,這里的協(xié)商以客戶端為主 ,按客戶端各算法列表從左至右開始匹配(例如加密算法中差购,最左邊的aes128-cbc的優(yōu)先級是最高的)四瘫,如果服務器支持相應的算法,則匹配成功欲逃,如果匹配到最后都不支持找蜜,則協(xié)商失敗
2.3.密鑰協(xié)商
由于使用的是SSH2.0版本,會話密鑰的協(xié)商方式使用Diffie-Hellman算法稳析。這里簡單地介紹一下這個算法:
Diffie-Hellman算法是Whitefield Diffie和Martin Hellman在1976年公布的一種密鑰交換算法洗做,它的有效性依賴于計算離散對數(shù)的難度
現(xiàn)客戶端A要和服務器B交換密鑰:
服務器B規(guī)定一個素數(shù)P,一個整數(shù)G彰居,G是P的原根
客戶端生成自己的私用密鑰a(a<q)诚纸,并計算公開密鑰e=G^a mod P,把e發(fā)送給服務器B
服務器生成自己的私用密鑰b(b<q)陈惰,并計算公開密鑰f=G^b mod P咬清,把f發(fā)送給客戶端A
客戶端A可以通過自己的私用密鑰a和服務器的公開密鑰f算出共享密鑰 K=f^a mod P
服務器B可以通過自己的私用密鑰b和客戶端的公開密鑰e算出共享密鑰 K=e^b mod P
二者計算的結果K值是一致的,從而完成了密鑰交換
a和b對其他人是保密的奴潘,攻擊者只能離散對數(shù)來確定密鑰
大致協(xié)商過程如下,由客戶端首先發(fā)起請求
①客戶端發(fā)出的第一個報文說明了密鑰交互參數(shù):Min影钉、Number of Bits画髓、Max
②服務器端收到客戶端DH請求后,設定P和G發(fā)送給客戶端平委,P是一個大素數(shù)奈虾,滿足客戶端剛剛發(fā)來的那些要求,G是大于1的數(shù),通常取2或者5
③客戶端收到P和G后肉微,生成自己的私鑰a匾鸥,并根據(jù)a計算出自己的公鑰e,并把e發(fā)送給服務器端
④服務器也會生成自己的私鑰b并計算出公鑰f碉纳,收到客戶端發(fā)來的e后勿负,利用b和e生成共享密鑰K,接著把f發(fā)給客戶端劳曹,用于客戶端計算共享密鑰K
KEX DH host key是服務器的主機公鑰(通常是RSA)
KEX DH H Signature是服務器用主機私鑰對計算出的哈希值H進行簽名的結果
H的值是將客戶端初始報文奴愉、服務器初始報文、客戶端DH公鑰铁孵、服務器DH公鑰等參數(shù)進行哈希的結果
⑤客戶端接受到f之后锭硼,計算出共享密鑰K,然后服務器一樣計算出H的值蜕劝,并用服務器的公鑰解密KEX DH H Signature檀头,將結果與自己計算的H值比較,如果一致岖沛,就會向服務器發(fā)送New Keys報文暑始,雙方密鑰交換成功。計算出的H作為會話ID烫止,K作為之后通信過程中的加密密鑰
2.4.認證及交互階段
共享密鑰協(xié)商成功之后蒋荚,數(shù)據(jù)報文都被加密,只能看到加密后的結果:
認證方式有兩種:
- 用戶名密碼認證
①客戶端發(fā)起認證請求馆蠕,服務器回復其公鑰
②客戶端使用服務器的公鑰將其用戶名密碼加密后發(fā)給服務器
③服務器使用自己的私鑰解密期升,驗證結果 - 公鑰私鑰認證
①客戶端發(fā)送登錄的ip和用戶名,服務器識別該客戶端的公鑰(在authorized_keys文件中)互躬,利用該公鑰加密一段隨機字符串發(fā)送剛給客戶端
②客戶端使用私鑰解密播赁,得到隨機字符串后發(fā)送給服務器
③服務器收到該字符串,若與其之前生成的一致吼渡,即說明公私鑰匹配容为,認證成功
注:要使用該認證方式需要事先在客戶端生成公私鑰,并把公鑰存放在服務器上
三寺酪、SSH相關應用
3.1.Linux的下ssh
linux系統(tǒng)中坎背,一般默認都安裝了ssh客戶端及服務端。ssh服務的相關進程是sshd寄雀,可以使用servcie sshd status(CentOS6)查看當前該服務的運行狀態(tài)得滤。
3.1.1.ssh client
- 最簡單的登錄:ssh user@ip,如ssh root@1.1.1.1
ssh命令有關參數(shù):
-A:開啟認證代理連接轉發(fā)功能
-a:關閉認證代理連接轉發(fā)功能
-b:使用本地指定地址作為對應連接的源ip
-f:后臺執(zhí)行ssh指令
-i:指定身份文件
-p:指定遠程服務器端口
-N:不執(zhí)行遠程指令
- 如果遠程服務器默認端口不是22(可以設置一個高位端口盒犹,比如10024)懂更,則需要指定端口:ssh user@ip -p 10024
如果我們要經(jīng)常使用某個遠程主機眨业,可以通過配置$HOME/.ssh/config文件更方便地進行連接
vim ~/.ssh/config #當前是root用戶
Host test
StrictHostKeyChecking no #第一次連接新的主機時,自動接收公鑰沮协,無需提示龄捡。
HostName 1.1.1.1
Port 22
ForwardAgent yes
User root
Controlpath ~/.ssh/ssh-%r@%h:%p.sock
以后只需要ssh test即可.
ssh客戶端的讀取順序如下
①命令行
②$HOME/.ssh/config
③/etc/ssh/ssh_config(所有用戶使用的配置文件)
3.1.2. ssh server
配置文件:/etc/ssh/sshd_config
Port 22 #ssh監(jiān)聽的端口,可以寫多個
ListenAddress 10.104.45.112 #可以指定監(jiān)聽的具體地址慷暂,默認是注釋的聘殖,表示監(jiān)聽0.0.0.0
Protocol 2 #使用sshv2
PasswordAuthentication yes #密碼認證
X11Forwarding yes #允許本地主機上執(zhí)行遠程主機的GUI程序
PermitRootLogin yes #允許root登錄
AllowUsers xxx #只允許xxx用戶登錄的用戶
...
修改完配置文件之后,需要重啟服務才能生效
3.2.利用ssh反向代理訪問內(nèi)網(wǎng)主機
如果要遠程訪問一臺內(nèi)網(wǎng)主機呜呐,有兩種方式:
- 通過靜態(tài)NAT或PAT將內(nèi)網(wǎng)主機的地址/端口映射到公網(wǎng)
- 借助一臺公網(wǎng)服務器就斤,利用ssh反向代理來訪問內(nèi)網(wǎng)主機
3.2.1.方法一:靜態(tài)NAT或PAT
一般只有企業(yè)的網(wǎng)絡管理員能使用這種方法,可以通過靜態(tài)NAT將內(nèi)網(wǎng)主機的地址轉化為一個公網(wǎng)地址(一般擁有大量公網(wǎng)地址才會這么做)蘑辑,或者使用PAT將內(nèi)網(wǎng)主機的端口映射到公網(wǎng)地址的某個端口洋机,這里就簡單地給出路由器上的配置:
#靜態(tài)NAT:將內(nèi)網(wǎng)主機地址192.168.1.100映射為公網(wǎng)地址1.1.1.1
Cisco Router:
ip nat inside source static 192.168.1.100 1.1.1.1
HuaWei Router:
nat static global 1.1.1.1 inside 192.168.1.100
#PAT:內(nèi)網(wǎng)主機的22端口映射到公網(wǎng)地址22122端口
Cisco Router:
ip nat inside source static tcp 192.168.1.100 22 1.1.1.1 22122
HuaWei Router:
nat static protocol tcp global current-interface 22122 inside 192.168.1.100 22
3.2.2.方法二:ssh反向代理
大部分情況下,我們無法管理公網(wǎng)地址洋魂,接下來介紹第二種方法绷旗,此方法需要借助一臺公網(wǎng)服務器:
公網(wǎng)主機A: ip——1.1.1.1 sshd端口——22
內(nèi)網(wǎng)主機B: ip——192.168.1.100 sshd端口——22
首先在內(nèi)主機B上:
ssh -NfR 1234:localhost:22 root@1.1.1.1
將A的1234端口和B的22端口綁定
接著在外網(wǎng)主機A上:
netstat -ano | grep 1234
tcp 0 0 127.0.0.1:1234 0.0.0.0:* LISTEN off (0.00/0/0)
可以看到本地在監(jiān)聽1234端口
接著使用以下命令就可以從公網(wǎng)主機A上訪問內(nèi)網(wǎng)主機B了
ssh localhost -p 1234
通過以上方式,已經(jīng)可以實現(xiàn)我們的需求副砍,接下來可以做一些優(yōu)化:
- 使用公私鑰登錄衔肢,無需在登錄的時候輸入密碼
第一步:在內(nèi)網(wǎng)服務器B上生成公私鑰
ssh-keygen -t rsa #一直按回車,使用默認選項即可
成功后在~/.ssh/目錄下就會生成id_rsa(私鑰)和id_rsa.pub (公鑰文件)
第二步:將B的公鑰放到外網(wǎng)主機A的~/.ssh/authorized_keys
ssh root@1.1.1.1 'mkdir -p ~/.ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
或者使用
ssh-copy-id root@1.1.1.1
- 使用autossh維護反向連接
yum install -y autossh
...
autossh -M 8888 -NR 1234:localhost:22 root@1.1.1.1 -p 22
autossh的命令跟ssh差不多豁翎,默認后臺運行角骤,所以無需加-f
-M選項表示維護程序監(jiān)聽8888端口,保證連接的可用性心剥,如果斷掉邦尊,則會重新連接