zoukankan      html  css  js  c++  java
  • 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下可以设置多个公钥
  • 相关阅读:
    python学习笔记二--列表
    python学习笔记一--字符串
    写点什么呢
    nagios&pnp4nagios--yum 安装
    敏捷开发的思路
    Foreman--管理PuppetClient
    url编码解码的问题(urlencode/quote)
    json数据的处理和转化(loads/load/dump/dumps)
    http和https的区别
    python中requests的用法总结
  • 原文地址:https://www.cnblogs.com/lisenlin/p/10541363.html
Copyright © 2011-2022 走看看