介绍
SSH (Secure Shell)是一种协议,用于远程加密的安全登录。
与 telnet 不同的是,ssh 协议非常安全。加密数据流,确保数据流的完整性,甚至安全可靠的进行认证它都使用了专门的算法。
原理
SSH协议可以分为传输层协议、用户认证协议和连接协议三个部分。
传输层协议提供数据加密、服务器认证和信息完整性等安全方面的功能
用户认证协议主要用户客户端身份认证
连接协议则是将建立的加密隧道分成若干个逻辑通道,其他高层协议可以利用这些逻辑通道建立安全的通信通道
SSH协议由服务器和客户端两部分构成
目录有1.x和2.x两个版本,不同版本之间可以向下兼容。
服务端是一个守护进程,在linux中名为sshd,守护进程将会一直运行在后台并监听来自22/TCP端口的请求。服务端一般包括密钥交换、公钥对证、对称密钥加密及非安全连接等。
客户端包含了ssh访问程序、scp(远程复制)、slogin(远程登录)、sftp(安全文件传输)等应用程序
过程
实现SSH协议的安全连接,服务端和客户端需要经过5个阶段
版本号协商
密钥和算法协商
认证阶段
会话请求阶段
交互会话阶段
版本号协商
服务端和客户端首先需要进行的是TCP连接,如果TCP连接成功,就正式进入版本号协商阶段,这个阶段进行的工作
- 服务端向客户端发送的第一个报文包含有一个版本字符串,包含的信息有主版本号、次版本号和软件版本号
- 客户端手动数据包之后解析版本号,如果服务端的版本号比自己低且客户端能支持此低版本,就使用服务端的版本号,否则将使用客户端的版本号
- 客户端将决定使用的版本号发送给服务端,服务端决定是否能使用此版本号一起工作
- 如果协商成功,就会直接进入下一个阶段,即密钥和算法协商阶段,不成功就断开TCP连接
在整个版本协商过程中,服务端和客户端使用的是明文的方式。
版本号协商成功之后就会进入密钥和算法协商阶段
密钥和算法协商
密钥和算法协商阶段就是互相发送自己支持的公钥算法列表,加密算法列表、压缩算法列表等信息,然后共同确定双方使用的加密算法。
在密钥和算法协商的最后阶段将会生成密钥和会话ID,这个能为后续阶段的数据提供加密通信。
密钥和算法协商结束后,就会进入认证阶段。
认证阶段
在认证阶段,客户端会像服务端发送认证请求,请求中包含的信息有用户名、认证方法(SSH支持两种认证方式)、认证信息(通常是密码)。服务端收到请求之后会对客户端进行认证,如果认证失败会向客户端发送失败消息及再次认证的方法等信息。客户端收到失败消息后,会从认证方法列表中选择一种再次进行认证,直到认证成功或次数超过失败上限,服务器关闭连接。
如果认证成功,服务端就会等待会话请求。
会话请求阶段
交互会话阶段
在交互会话阶段客户端将命令加密后发送给客户端,服务端解密并执行后,再将结果加密后返回客户端,最后客户端解密显示再终端上。
SSH认证方式及风险
SSH的认证方式有两种:密码和密钥登录。
密钥认证是生成一个由服务器认可的密钥文件,登录时候客户将用户名、公钥和公钥文件等信息提交给服务端。
服务端验证密钥文件是否合法,如果合法的话就准许登录,否则就拒绝登录。相对安全。
OpenSSH
OpenSSH 包括sshd主程序与ssh客户端
OpenSSH服务端的配置文件 /etc/ssh/sshd_config
OpenSSH客户端的配置文件 /etc/ssh/ssh_config
OpenSSH主配置目录/etc/ssh还有一些密钥文件(通常文件名中由rsa字符串)
#1. SSH Server 全局设定,port ,协议 ……# Port 22 #默认端口,也可以使用多个端口Protocol 2 #协议版本号# ListenAddress 0.0.0.0 #默认值是监听所有接口的 SSH 要求# PidFile /var/run/sshd.pid #放置 SSHD 这个 PID 的文件# LoginGraceTime 2m #2分钟之内不输入密码,自动断开# Compression delayed #使用压缩数据模式进行传输,登入后才将数据压缩 (delayed)#2. 主要私有Key 存放文件# HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私钥# HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私钥# HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私钥#3. 关于登录文件的数据与daemon的名称SyslogFacility AUTHPRIV #记录日志/var/log/secure# LogLevel INFO #日志等级#4. 安全设置# PermitRootLogin yes #是否允许 root 登入# StrictModes yes #是否让 sshd 去检查用户家目录或相关文件的权限数据# PubkeyAuthentication yes #使用密钥登录系统# AuthorizedKeysFile .ssh/authorized_keys #用户登录公钥存放位置PasswordAuthentication yes #登录密码认证# PermitEmptyPasswords no #否允许以空的密码登入# RhostsAuthentication no #系统不使用 .rhosts认证# IgnoreRhosts yes #是否取消使用 ~/.ssh/.rhosts 来做为认证# RhostsRSAAuthentication no #专门给 version 1 用的,使用 rhosts 文件在 /etc/hosts.equiv# HostbasedAuthentication no #上面的项目类似,不过是给 version 2 使用的# IgnoreUserKnownHosts no #是否忽略家目录内的 ~/.ssh/known_hostsChallengeResponseAuthentication no #允许任何的密码认证UsePAM yes #利用 PAM 管理使用者认证,可以记录与管理#5. 登录后项目# PrintMotd yes #登入后是否显示出一些信息# PrintLastLog yes #显示上次登入的信息# TCPKeepAlive yes #当达成联机后,服务器会一直传送 TCP 封包给客户端以判断对方式否一直存在联机UsePrivilegeSeparation yes #是否权限较低的程序来提供用户操作MaxStartups 10 #同时允许几个尚未登入的联机画面DenyUsers * #设定受阻止的使用者名称DenyUsers test #阻止用户DenyGroups test #阻止组#6. SFTP 设定Subsystem sftp /usr/lib/ssh/sftp-server# UseDNS yes #为了要判断客户端来源是正常合法的,因此会使用 DNS 去反查客户端的主机名,不过在内网这项目设定为 no 会让联机达成速度比较快
参考:https://www.open-open.com/lib/view/open1422417444048.html
