SSH服务详解
第1章 SSH服务
1.1 SSH服务协议说明
Secure Shell(SSH,安全外壳)是由IETF(The Internet Engineering Task Force)制定的建立在应用层基础上的安全网络协议
SSH是专为远程登录会话和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞(传统的网络服务应用程序如ftp、pop和telnet等在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到"中间人"(man-in-the-middle)攻击[1]),SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的"通道
通过SSH,可以把所有传输的数据进行加密,"中间人"这种攻击方式就不可能实现了,也能够防止DNS欺骗[2]和IP欺骗[3]。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置
用户ssh远程登录过程:
1)远程主机收到用户的登录请求,把自己的公钥发给用户。
2)用户使用这个公钥,将登录密码加密后,发送回来。
3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
1.2 SSH主要组成部分:
(1)传输层协议[SSH-TRANS]
提供了服务器认证,保密性及完整性
此外它有时还提供压缩功能。
SSH-TRANS 通常运行在TCP/IP连接上,也可能用于其它可靠数据流上
SSH-TRANS提供了强力的加密技术、密码主机认证及完整性保护
该协议(Secure Shell)中的认证基于主机,并且该协议不执行用户认证
(2)用户认证协议[SSH-USERAUTH]
用于向服务器提供客户端用户鉴别功能,它运行在传输层协议SSH-TRANS上面
当SSH-USERAUTH开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希Hash)
会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权
SSH-USERAUTH 也需要知道低层协议是否提供保密性保护
(3)连接协议 [SSH-CONNECT]
将多个加密隧道分成逻辑通道
它运行在用户认证协议上
它提供了交互式登录话路、远程命令执行、转发TCP/IP连接和转发X11连接
1.3 SSH验证编辑
从客户端来看,SSH提供两种级别的安全验证:
第一种级别(基于口令的安全验证):
只要你知道自己帐号和口令,就可以登录到远程主机
所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器
可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击
注意事项(口令登录):
如果你是第一次登录对方主机,系统会出现下面的提示:
$ ssh user@host
The authenticity of host ‘host (12.18.429.21)’ can’t be established.
RSA key fingerprint is 98:2e:d7:e0🇩🇪9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?
所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位)
很难比对,所以对其进行MD5计算,将它变成一个128位的指纹,再进行比较,就容易多了
第二种级别(基于密匙的安全验证):
需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上
如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证
服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器
用这种方式,你必须知道自己密匙的口令(id_rsa,密钥,“id_rsa.pub(公钥)”,“id_rsa(密钥)”,密钥和公钥都通过RSA算法获得)
1.4 SSH端口
ssh 默认端口是22
安全协议版本sshv2和sshv1(有漏洞)
ssh服务端主要包括两个服务功能:ssh远程链接和sftp服务
1.5 命令参数
参数 | 说明 |
---|---|
Port | 指定sshd进程监听的端口号,默认为22.可以使用多条指令监听多个端口.默认将在本机的所有网络接□上监听,但是可以通过ListenAddress指走只在某个特定的接口上监听. |
PermitEmptyPasswords | 是否允许密码为空的用户远程登录.默认为"no" |
PermitRootLogin | 是否允许root登录.可用值如下:“yes”(默认)表示允许."no"表示禁止. |
“without-password” | 表示禁止使用密码认证登录."forced-commands-only"表示只有在指走了command选项的情况下才允许使用公钥认证登录.同时其它认证方法全部被禁止.这个值常用于做远程备份之类的事情.1.多开一个窗口2.临时多部署一条连接方式3.给普通用户sudo权限 |
UseDNS | 指定定sshd是否应该对远程主机名进行反向解折,以检查此主机名是否与其IP地址真实对应.默认值为"yes”. |
ListenAddress | 指定监听并提供服务相应的网卡地址信息 |
登录 ssh -i root@ip
1.6 进行ssh传输测试:
scp -i (需要传输的文件路径) root@ip(传送目标路径地址)
批注:
[1]所谓"中间人"攻击的方式就是"中间人"冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器(类似于ASP攻击等)服务器和你之间的数据传送被"中间人"一转手做了手脚之后,就会出现很严重的问题
攻击描述:
如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了
[2]DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为
原理:如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理.注:DNS欺骗其实并不是真的"黑掉"了对方的网站,而是冒名顶替、招摇撞骗罢了
[3]IP地址欺骗是指行动产生的IP数据包为伪造的源IP地址(类似于SYN攻击,但SYN攻击伪造的IP是不存在的),以便冒充其他系统或发件人的身份
这是一种黑客的攻击形式,黑客使用一台计算机上网,而借用另外一台机器的IP地址,从而冒充另外一台机器与服务器打交道