SSH原理讲解与实践
⼀、简介
SSH全名Secure Socket Shell,安全外壳传输协议。专为远程登录会话和其他⽹络服务提供安全性的协议
⼆、加密算法
  要了解SSH的原理,就要先知道⽬前主流的俩种加密算法
  2.1 对称加密
所谓对称加密,就是A使⽤123456密钥进⾏加密,B使⽤123456密钥进⾏解密。很容易理解,常⽤的对称加密算法:  DES,3DES,AES
  如下图所⽰:
  2.2 ⾮对称加密
所谓⾮对称加密,就是A通过⾮对称加密算法产⽣了两个密钥:⼀个私钥,⼀个公钥。你⽤⼀个密钥加密的东西,必须⽤另外⼀个密钥解密。A通过私钥加密后的密⽂发送给B,B通过获取A的公钥进⾏解密。
私钥顾名思义,就是⾃⼰私有的密钥,不会传播的,存放在本地
公钥顾名思义,就是能在⽹络上传播的,也同时容易被截取的。
#以上存在⼀个单向安全问题:
ssh工具windows
只靠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下可以设置多个公钥