一、簡介
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下可以設置多個公鑰