介绍

SSH (Secure Shell)是一种协议,用于远程加密的安全登录。
与 telnet 不同的是,ssh 协议非常安全。加密数据流,确保数据流的完整性,甚至安全可靠的进行认证它都使用了专门的算法。

原理

SSH协议可以分为传输层协议、用户认证协议和连接协议三个部分。
传输层协议提供数据加密、服务器认证和信息完整性等安全方面的功能
用户认证协议主要用户客户端身份认证
连接协议则是将建立的加密隧道分成若干个逻辑通道,其他高层协议可以利用这些逻辑通道建立安全的通信通道

SSH协议由服务器和客户端两部分构成
目录有1.x和2.x两个版本,不同版本之间可以向下兼容。
服务端是一个守护进程,在linux中名为sshd,守护进程将会一直运行在后台并监听来自22/TCP端口的请求。服务端一般包括密钥交换、公钥对证、对称密钥加密及非安全连接等。
客户端包含了ssh访问程序、scp(远程复制)、slogin(远程登录)、sftp(安全文件传输)等应用程序

过程

实现SSH协议的安全连接,服务端和客户端需要经过5个阶段
版本号协商
密钥和算法协商
认证阶段
会话请求阶段
交互会话阶段

版本号协商

服务端和客户端首先需要进行的是TCP连接,如果TCP连接成功,就正式进入版本号协商阶段,这个阶段进行的工作

  1. 服务端向客户端发送的第一个报文包含有一个版本字符串,包含的信息有主版本号、次版本号和软件版本号
  2. 客户端手动数据包之后解析版本号,如果服务端的版本号比自己低且客户端能支持此低版本,就使用服务端的版本号,否则将使用客户端的版本号
  3. 客户端将决定使用的版本号发送给服务端,服务端决定是否能使用此版本号一起工作
  4. 如果协商成功,就会直接进入下一个阶段,即密钥和算法协商阶段,不成功就断开TCP连接

在整个版本协商过程中,服务端和客户端使用的是明文的方式。
版本号协商成功之后就会进入密钥和算法协商阶段

密钥和算法协商

密钥和算法协商阶段就是互相发送自己支持的公钥算法列表,加密算法列表、压缩算法列表等信息,然后共同确定双方使用的加密算法。
在密钥和算法协商的最后阶段将会生成密钥和会话ID,这个能为后续阶段的数据提供加密通信。
密钥和算法协商结束后,就会进入认证阶段。

认证阶段

在认证阶段,客户端会像服务端发送认证请求,请求中包含的信息有用户名、认证方法(SSH支持两种认证方式)、认证信息(通常是密码)。服务端收到请求之后会对客户端进行认证,如果认证失败会向客户端发送失败消息及再次认证的方法等信息。客户端收到失败消息后,会从认证方法列表中选择一种再次进行认证,直到认证成功或次数超过失败上限,服务器关闭连接。
如果认证成功,服务端就会等待会话请求。

会话请求阶段

客户端向服务端发起会话请求,请求通过之后进入交互会话阶段。

交互会话阶段

在交互会话阶段客户端将命令加密后发送给客户端,服务端解密并执行后,再将结果加密后返回客户端,最后客户端解密显示再终端上。

SSH认证方式及风险

SSH的认证方式有两种:密码和密钥登录。
密钥认证是生成一个由服务器认可的密钥文件,登录时候客户将用户名、公钥和公钥文件等信息提交给服务端。
服务端验证密钥文件是否合法,如果合法的话就准许登录,否则就拒绝登录。相对安全。

OpenSSH

OpenSSH 包括sshd主程序与ssh客户端

OpenSSH服务端的配置文件 /etc/ssh/sshd_config
OpenSSH客户端的配置文件 /etc/ssh/ssh_config
OpenSSH主配置目录/etc/ssh还有一些密钥文件(通常文件名中由rsa字符串)

  1. #1. SSH Server 全局设定,port ,协议 ……
  2. # Port 22 #默认端口,也可以使用多个端口
  3. Protocol 2 #协议版本号
  4. # ListenAddress 0.0.0.0 #默认值是监听所有接口的 SSH 要求
  5. # PidFile /var/run/sshd.pid #放置 SSHD 这个 PID 的文件
  6. # LoginGraceTime 2m #2分钟之内不输入密码,自动断开
  7. # Compression delayed #使用压缩数据模式进行传输,登入后才将数据压缩 (delayed)
  8. #2. 主要私有Key 存放文件
  9. # HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私钥
  10. # HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私钥
  11. # HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私钥
  12. #3. 关于登录文件的数据与daemon的名称
  13. SyslogFacility AUTHPRIV #记录日志/var/log/secure
  14. # LogLevel INFO #日志等级
  15. #4. 安全设置
  16. # PermitRootLogin yes #是否允许 root 登入
  17. # StrictModes yes #是否让 sshd 去检查用户家目录或相关文件的权限数据
  18. # PubkeyAuthentication yes #使用密钥登录系统
  19. # AuthorizedKeysFile .ssh/authorized_keys #用户登录公钥存放位置
  20. PasswordAuthentication yes #登录密码认证
  21. # PermitEmptyPasswords no #否允许以空的密码登入
  22. # RhostsAuthentication no #系统不使用 .rhosts认证
  23. # IgnoreRhosts yes #是否取消使用 ~/.ssh/.rhosts 来做为认证
  24. # RhostsRSAAuthentication no #专门给 version 1 用的,使用 rhosts 文件在 /etc/hosts.equiv
  25. # HostbasedAuthentication no #上面的项目类似,不过是给 version 2 使用的
  26. # IgnoreUserKnownHosts no #是否忽略家目录内的 ~/.ssh/known_hosts
  27. ChallengeResponseAuthentication no #允许任何的密码认证
  28. UsePAM yes #利用 PAM 管理使用者认证,可以记录与管理
  29. #5. 登录后项目
  30. # PrintMotd yes #登入后是否显示出一些信息
  31. # PrintLastLog yes #显示上次登入的信息
  32. # TCPKeepAlive yes #当达成联机后,服务器会一直传送 TCP 封包给客户端以判断对方式否一直存在联机
  33. UsePrivilegeSeparation yes #是否权限较低的程序来提供用户操作
  34. MaxStartups 10 #同时允许几个尚未登入的联机画面
  35. DenyUsers * #设定受阻止的使用者名称
  36. DenyUsers test #阻止用户
  37. DenyGroups test #阻止组
  38. #6. SFTP 设定
  39. Subsystem sftp /usr/lib/ssh/sftp-server
  40. # UseDNS yes #为了要判断客户端来源是正常合法的,因此会使用 DNS 去反查客户端的主机名,不过在内网这项目设定为 no 会让联机达成速度比较快

参考:https://www.open-open.com/lib/view/open1422417444048.html