SSH

Table of Contents

  1. SSH
    1. 1 加密解密
      1. 对称加密
      2. 非对称加密
    2. 2 SSH介绍
      1. SSH协议
      2. 版本
      3. 验证原理
    3. 3 SSH工作过程
      1. 服务器建立公钥
      2. 客户端请求连接
      3. 服务器响应客户端
      4. 生成会话秘钥
      5. 服务端验证客户端合法性
    4. 4 Linux/FreeBSD设置
    5. 5 远程连接工具
      1. windows putty & psftp
      2. windows Xshell & Xftp
      3. windows SecureCRT

1 加密解密

对称加密

简单的说,即加密和解密明文使用相同的密码,如AES(DEC目前被认为是不安全的)

非对称加密

使用不同但却完全匹配的一对钥匙————公钥和私钥。公钥是公开的,私钥只有解密者才知道。
加密明文使用公钥加密,解密密文时只有匹配的私钥才可解开。如RSA、DSA

2 SSH介绍

SSH协议

SSH为Secure Shell缩写,为远程登录会话和其它网络服务提供安全性的协议。
SSH主要由三部分组成:

  1. 传输层协议[SSH-TRANS]
    提供服务器认证,保密性及完整性。通常运行在TCP/IP连接上。该协议中的认证基于主机,
    并且该协议不执行用户认证
  2. 用户认证协议[SSH-USERAUTH]
    用于向服务器提供客户端用户鉴别功能。运行在传输层协议上
  3. 连接协议[SSH-CONNECT]
    将多个加密隧道分成逻辑通道。运行在用户认证协议上。提供交互式登录话路、远程命令执行
    、转发TCP/IP连接和转发X11连接

版本

SSH由客户端和服务端软件组成,有两个不兼容的版本分别是1.x和2.x。用2.x

验证原理

  1. 基于口令的安全验证
    使用账号和口令登录远程机,但不能保证所连接的服务器就是你想连接的服务器。可能会有
    别的服务器冒充,即受到“中间人”攻击
  2. 基于秘钥的安全验证
    • 创建一对秘钥,将公钥置于SSH服务器
    • 客户端向服务器发送请求,请求用公钥进行安全验证
    • 服务器收到请求,找到你的公钥,然后和你发送过来的公钥进行对比
    • 若一致,服务器用公钥加密质询“challenge”,并发送给客户端
    • 客户端收到质询后用私钥解密,再发送给服务器

3 SSH工作过程

服务器建立公钥

若服务器是新系统,则会在/etc/ssh下生成一个名为ssh_host_ecdsa_key.pub公钥和
和一个ssh_host_ecdsa_key私钥,这一对就是远程服务器的公钥与私钥。每次启动sshd
服务时,系统会自动在此路径下查找公钥。

客户端请求连接

客户端发起一个TCP连接,默认端口号为22

  1. Linux可直接通过ssh user@host连接
    若客户端和服务器是相同的用户,则可以省去user
  2. windows下可通过putty,xshell工具等连接

服务器响应客户端

服务端收到连接请求后,将自己的关键信息发给客户端

  1. 服务器端的公钥
    客户端在收到公钥后,会在自己的“~/.ssh/known_hosts”中进行搜索。若位找到则在终端
    显示一段警告信息,由用户来决定是否继续连接
  2. 服务器所支持的加密算法列表
    客户端根据此列表来决定采用哪种加密算法

生成会话秘钥

此时客户端拥有了服务端的公钥,然后客户端和服务端需要协商出一个双方都认可的秘钥,以此
来对双方后续的通信内容进行加密。
秘钥协商算法Diffie-Hellman

  1. 服务端和客户端共同选定一个大素数,叫做种子值
  2. 服务端和客户端各自独立地选择另外一个只有自己才知道的素数
  3. 双方使用相同的加密算法,由种子值和各自的私有素数生成一个秘钥值,并将这个值发送给
    对方
  4. 收到秘钥值后,服务端和客户端根据种子值和自己的私有素数,计算出一个最终的秘钥。
    该步骤由双方分别独立进行,但是得到的结果应该是相同的
  5. 双方使用上一步得到的结果作为秘钥来加密和解密通信内容

服务端验证客户端合法性

接下来,客户端将自己的公钥ID发送给服务端,服务端需要对客户端的合法性进行验证

  1. 服务端在自己的“authorized_keys”文件中搜索与客户端匹配的公钥
  2. 若找到,服务端用这个公钥加密一个随机数,并把加密后的结果发送给客户端
  3. 如果客户端持有正确的私钥,那么它就可以对消息进行解密从而获得这个随机数
  4. 客户端由这个随机数和当前的会话秘钥共同生成一个MD5值,并发送给服务端
  5. 服务端同样会计算MD5,并与客户端发过来的值进行比较,若相等则验证通过

双方即可开始正常通信

4 Linux/FreeBSD设置

  1. 创建.ssh文件夹

    mkdir ~/.ssh
    
  2. 产生秘钥

    ssh-keygen -t rsa -P "密码提示语"
    
  3. authorized_keys

    cp id_rsa.pub authorized_keys
    chmod 600 authorized_keys
    chmod -R 700 .ssh
    
  4. sshd_config

    # vim /etc/ssh/sshd_config
    
    # 仅使用SSH2
    protocol 2
    
    # 不允许root用户使用SSH
    PermitRootLogin no
    
    # 不允许使用密码方式登陆
    PasswordAuthentication no
    
    # 禁止空密码进行登陆
    PermitEmptyPasswords no
    
    # 启用RSA认证
    RSAAuthentication yes
    
    # 启用公钥认证
    PubkeyAuthentication yes
    
    # 使用authorized_keys
    AuthorizedKeysFile .ssh/authorized_keys
    
  5. 重启服务

    service sshd restart
    

5 远程连接工具

服务端保留公钥,客户端保留私钥

windows putty & psftp

putty设置

  1. Session
    • Host name(or IP address) :192.168.0.xxx
    • Port : 22
    • Connection type : SSH
  2. Connection->SSH->Auth
    • Private key file for authentication : "D:\keys dir\xxx.ppk"
  3. save Session
    • Session->Saved Sessions(添加会话名,如test)->save
    • 下次启动putty后直接load会话名即可

puttygen生成秘钥对

  1. Parameters
    • Type of key to generate : RSA
    • Number of bits … : 2048
  2. Actions
    • Generate a public/private key pair

puttygen秘钥格式转换

  1. putty有自己的秘钥格式,以.ppk结尾
  2. 打开puttygen转换ppk格式
    • Actions->Load an existing private key file->save public/private key

PSFTP传输文件

打开psftp,help显示指令

#打开名为test的已保存的会话
psftp> open test
#从远程机下载文件
psftp> get remote_host_file
#上传文件到远程机
psftp> put local_file

windows Xshell & Xftp

windows SecureCRT

暂且这样

 posted on 2018-12-27 14:02  eat&die  阅读(148)  评论(0编辑  收藏  举报