SSH原理講解與實踐


一、簡介

    SSH全名Secure Socket Shell,安全外殼傳輸協議。專為遠程登錄會話和其他網絡服務提供安全性的協議

 

二、加密算法

  要了解SSH的原理,就要先知道目前主流的倆種加密算法

  2.1 對稱加密

所謂對稱加密,就是A使用123456密鑰進行加密,B使用123456密鑰進行解密。很容易理解,常用的對稱加密算法:   DES,3DES,AES

 

  如下圖所示:

 

 

  2.2 非對稱加密

所謂非對稱加密,就是A通過非對稱加密算法產生了兩個密鑰:一個私鑰,一個公鑰。你用一個密鑰加密的東西,必須用另外一個密鑰解密。A通過私鑰加密后的密文發送給B,B通過獲取A的公鑰進行解密。

私鑰顧名思義,就是自己私有的密鑰,不會傳播的,存放在本地
公鑰顧名思義,就是能在網絡上傳播的,也同時容易被截取的。

#以上存在一個單向安全問題:
只靠A產生的密鑰對進行加解密,則交互流程是:
A向B發消息:A(A的私鑰加密)-->internet--->B(A的公鑰解密)
B向A發消息:B(A的公鑰加密)-->internet-->A(A的私鑰解密)
假如internet上非法這C獲取了A的公鑰,則C就能解密從A發過來的信息。而B通過公鑰加密向A發送的消息,C手上只有公鑰,無能無力。所以就存在了單向傳輸安全問題

#解決辦法:
B也產生一對密鑰(B的公鑰和B的私鑰)
可靠的雙向傳輸方式:
A向B發消息:A(B的公鑰加密)-->internet--->B(B的私鑰解密)
B向A發消息:B(A的公鑰加密)-->internet-->A(A的私鑰解密)
總結:可靠傳輸,公鑰加密,私鑰解密

   可靠的非對稱傳輸方式如圖:

 

 

 

三、SSH原理

  SSH基於的是非對稱加密

 

四、SSH兩種認證方式

   4.1 用戶名和密碼認證

#交互流程
1.用戶A向遠程主機B發送登錄請求
2.遠程主機B把自己的公鑰發送給用戶A
3.用戶A使用B的公鑰,加密用戶名和密碼,發送給遠程主機B驗證
4.遠程主機B用自己的私鑰進行解密登錄用戶名和密碼,如果密碼正確,就同意用戶登錄

  用戶名密碼認證交互圖

 

 

 

  4.2 公鑰認證

1.用戶A將自己的公鑰儲存在遠程主機B上。
2.用戶A向遠程主機B發送登錄請求
3.遠程主機B用A的公鑰加密一段隨機字符串,發送給A
4.用戶A用自己的私鑰解密后,再將此字符串和sessionKey通過MD5生成摘要1,再發給遠程主機B。
5.遠程主機B將本地的隨機字符串和session Key通過MD5生成摘要2,比對用戶A發送過來的摘要A是否一致,如果一致,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。

 

  公鑰認證交互圖:

 

五、中間人攻擊

SSH中間人攻擊(Man-in-the-middle attack),只適用於SSH采用的是用戶名密碼認證的方式

  攻擊原理:

1.截獲了用戶A的登錄請求
2.冒充遠程主機B,將偽造的公鑰發給用戶A
3.用戶以為是真實的遠程主機B,將用戶和密碼用非法遠程主機C發來的公鑰加密,發出
4.非法遠程主機C用自己的私鑰進行解密,從而獲得登錄真實遠程主機的用戶名和密碼

  中間人攻擊交互圖:

 

 

  解決辦法:

方法一:核對遠程主機貼出的公鑰指紋(見注釋1)與自己本機第一次登陸顯示的公鑰指紋,是否一致。不一致則說明被劫持,禁止輸入密碼

方法二:采用密鑰登陸

#注釋1:公鑰長度較長(這里采用RSA算法,長達1024位),很難比對,所以對其進行MD5計算,將它變成一個128位的指紋,如:4a:65:fb:c2:bb:11:19:c3:db:46:37:8a:95:78:34:da

 

六、SSH免密認證示例

  6.1  SSH免密登陸centos服務器

#在centos7 客戶端配置:
1.客戶端生成一對密鑰對(私鑰和公鑰)----使用ssh-keygen工具
   ssh-keygen   #輸入此命令,回車
     Enter file in which to save the key (/root/.ssh/id_rsa):  #直接回車,密鑰對默認保存在當前用戶/.ssh/下
     Enter passphrase (empty for no passphrase):    #是否要給密鑰對設立密碼,用於二次認證,一般皆為不需要,直接回車
     Enter same passphrase again:       #在此輸入密碼,不需要,直接回車

2.將客戶端產生的公鑰發送給遠程服務器----使用ssh-copy-id工具
    ssh-copy-id root@192.168.1.1 
      The authenticity of host '192.168.62.37 (192.168.62.37)' can't be established.
      ECDSA key fingerprint is 4a:65:fb:c2:bb:11:19:c3:db:46:37:8a:95:78:34:da.
      Are you sure you want to continue connecting (yes/no)? yes    #選擇yes,因為第一次登陸此遠程主機,遠程主機給客戶端發送了他的公鑰,保存在當前用戶/root/.ssh/known_hosts

3.此時就可以免密登陸遠程主機了
    ssh root@192.168.1.1     #無需密碼即可登錄成功


#在centos7 服務端:
客戶端主機傳過來的公鑰,一般保存在登錄用戶下,如root用戶,/root/.ssh/authorized_keys文件里
關於authorized_keys文件里,第三列一般為客戶端主機名,可有可無。即客戶端主機更改了主機名,也不會影響到免密登錄。第一列,ssh-rsa,與第二列客戶端主機的公鑰內容,不可缺少

 

  6.2 ssh免密登錄思科cisco交換機

#此處客戶端是centos7
#在centos7 客戶端配置:
1.客戶端生成一對密鑰對(私鑰和公鑰)----使用ssh-keygen工具
   ssh-keygen   #輸入此命令,回車
     Enter file in which to save the key (/root/.ssh/id_rsa):  #直接回車,密鑰對默認保存在當前用戶/.ssh/下
     Enter passphrase (empty for no passphrase):    #是否要給密鑰對設立密碼,用於二次認證,一般皆為不需要,直接回車
     Enter same passphrase again:       #在此輸入密碼,不需要,直接回車

2.將產生的公鑰內容部分復制出來(不包含第一列ssh-rsa,和第三列客戶主機名)
    cat /root/.ssh/id_rsa.pub

3.完成以下服務端配置后,即可免密登錄
   ssh cisco@192.168.1.1    

#服務端:思科cisco交換機配置
1.開啟ssh服務:
    ip domain-name TEST.LOCAL    #設置域名,為了接下來生成密鑰對
    crypto key generate rsa modulus 2048   #生成密鑰對
    ip ssh version 2
    line vty 0 4
      transport input ssh
      login local
    
    #以下倆條為可選,有些版本沒有此命令
    no ip ssh server authenticate user password  #禁止用戶名密碼登錄
    no ip ssh server authenticate user keyboard  
    
    
2.粘貼客戶端的公鑰內容
    R1(config)#ip ssh pubkey-chain 
    R1(conf-ssh-pubkey)#username WINDOWS_USER       #【重要】客戶端密鑰登錄時,使用此用戶名cisco登錄
    R1(conf-ssh-pubkey-user)#key-string
    R1(conf-ssh-pubkey-data)#AAAAB3NzaC1yc2EAAAABJQAAAQEAijoMF9oBwyQxwYbVlFprz+fG8oe5uAcCxwMw
    R1(conf-ssh-pubkey-data)#eIR1lyAnDJIsYbTbcdm+n5KiQnCt2561MpN4yOFpajFNM/dqH7/jYaqaicHCSV2F
    R1(conf-ssh-pubkey-data)#RGauEp7FzN/uXxsX7mii6qOuxovl9OflLpXcvH5QH6551ycmL8nIv8UCY8uayiGI
    R1(conf-ssh-pubkey-data)#INsC0LyKEctWDW6qWp43T7rhcP0y4JoMraTCZLIPNE0Bo0bHgnGLg6fEvJmyB3sX
    R1(conf-ssh-pubkey-data)#H+7BaxHdYKg2OcIgVqYzclWhDwxj32kqd1BCq089iBMrb4QppDU2eM/t22iK29mn
    R1(conf-ssh-pubkey-data)#eqOGTiCkxB80ix+KULT9okmqkj3TbhCpunTfuPCCRNrjqndBsw==
    R1(conf-ssh-pubkey-data)#exit
    R1(conf-ssh-pubkey-user)#exit
    R1(conf-ssh-pubkey)#exit
    
    #ps1:在粘貼公鑰內容的時候,不宜一次粘貼,cisco輸入字符有長度限制,分多次少量粘貼
    #ps2:通過密鑰認證登錄的用戶cisco,他的權限級別,根據username cisco privilege 15 password cisco來決定
    #ps3:一個用戶cisco下可以設置多個公鑰

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM