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下可以设置多个公钥

 

posted @ 2019-03-16 16:19  森林326  阅读(2241)  评论(0编辑  收藏  举报