远程登录——SSH
Posted kttme
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了远程登录——SSH相关的知识,希望对你有一定的参考价值。
基本知识了解
一、什么是SSH?
简单说,SSH是一种网络协议,用于计算机之间的加密登录,是一种比较流行的登录应用程序——安全外壳(Secure Shell,SSH),与TELNET一样。SSH利用TCP作为底层传输协议,不过它比TELNET更安全,提供更多的服务。
如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。
需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。
二、组成
SSH是应用层协议,由四部分组成
1 SSH运输层协议(SSH-TRANS)
因为TCP不是安全的运输层协议,所以SSH首先使用在TCP之上能够构建安全通道的协议。这个新的层是一个独立的协议,称为SSH-TRANS。当这个协议的软件实现被调用后,它的客户程序和服务器程序先利用TCP协议建立起一条不安全的准连接。然后它们相互交换几个安全参数,并在TCP纸上建立一条安全的信道。它提供的服务有
- 保密或加密报文的交换
- 数据的完整性,也就是说它保证在客户和服务器之间交换的报文不会被入侵者修改
- 服务器的鉴别,也就是说客户现在可以放心,这个服务器不会是假冒的
- 报文的压缩,可提高系统的效率并以此加大攻击的难度
2 SSH鉴别协议(SSH-AUTH)
当客户和服务器之间的安全信道以建立,且客户对服务器鉴别之后,SSH就要调用另一个软件,它能够让服务器来鉴别客户。
3 SSH连接协议(SSH-CONN)
当安全的信道以建立,且服务器和客户相互鉴别后,SSH就可以调用实现了第三个协议的软件,这第三个协议就是SSH-CONN。SSH-CONN协议提供的众多服务之一就是进行复用。SSH-CONN利用前两个协议建立的安全信道,让客户在该信道上创建多个逻辑信道。
4 SSH应用
在连接阶段完成后,SSH允许几个应用程序一起使用该连接。每个应用程序如前所述地建立一条逻辑通道,然后就可以享用安全信道带来的方便和好处。换言之,远程登录只是利用了SSH-CONN协议的众多服务之一,其他一些应用,比如说文件传送应用,也可以使用其中的一条逻辑信道来完成自己的任务。
三、 端口转发
在SSH协议所提供的众多具有吸引力的服务之中,有一项服务时端口转发。我们可以利用SSH中空闲的安全信道来接入那些不提供安全服务的应用程序。像TELNET和SMTP这样的应用也可以通过这个端口转发机制来使用SSH的服务。SSH的端口转发机制会在属于其他协议的报文所经过的路途上创建一条隧道。正因为如此,有时这个机制被称为SSH隧道技术。下图为端口转发的概念。
TELNET客户和TELNET服务器之间的连接虽然直接但缺少安全性,通过端口转发我们可以改变这种情况。TELNET客户可以利用本地站点的SSH客户,以便与运行在站点上的的TELNET服务器之间建立一条安全连接。任何从TELNET客户到TELNET服务器的请求都要经过SSH客户和服务器提供的隧道进行传输。任何从TELNET服务器到TELNET客户的响应也要经过由SSH客户和服务器提供的隧道进行传输。
四、分组格式
- 长度:定义分组的长度,但不包括长度和填充字段本身
- 填充:为了增加其安全性,使攻击更加困难
- 类型:定义了SSH协议所使用的这个分组的类型
- 数据:这个字段长度可变,数据长度可用长度字段的值减去5个字节来推算得到
- CRC:差错检测
知识了解进阶
SSH 服务基于非对称加密(public-key cryptography,也称公开密钥加密)技术实现数据加密传输。该技术会生成一对数学相关的密钥,其中一个用于对数据进行加密,而且只能用于加密,而另一个只能用于解密。使用加密密钥加密后的数据,只能用对应的解密密钥才能解密。而且,只知道其中一个密钥,无法计算出另一个。因此,如果公开了一对密钥中的一个,并不会危害到另一个的秘密性质。通常把公开的密钥称为公钥(public key),而不公开的密钥称为私钥(private key)。
如果公开的是解密密钥,该场景用于客户端验证持有私钥一方发布的数据或文件的完整性、准确性,以防止数据篡改。相应的密钥称为数字签名(数字证书)。如果公开的是加密密钥,该场景用于客户给私钥所有者上传数据,称为公开密钥加密。 SSH 服务基于该场景实现。
与对称密钥加密相比,非对称加密的优点在于不存在共享的通用密钥。由于解密用的私钥无需发送给任何用户,所以可以避免密钥被劫持或篡改。而加密用的公钥即便被劫持或篡改,如果没有与其匹配的私钥,也无法解密数据。所以,截获的公钥是没有任何用处的。
当前,SSH主要采用 RSA 算法(协议 V2 默认算法)和DSA 算法(协议 V1 仅支持该算法)来实现非对称加密技术。
SSH 服务建立连接时的相关交互过程,如下 图所示
连接过程中的相关交互步骤,详细说明如下。
1.服务端准备阶段
2.非对称加密协商
3.后续数据交互过程
服务端准备阶段
服务端在每次启动 SSH 服务时,都会自动检查/etc/ssh/目录下相关密钥文件的有效性。如果相关文件检查发现异常,则会导致服务启动失败,并抛出相应错误信息。 如果文件相关不存在,则会自动重新创建。
默认创建的相关文件及用途说明如下
ll /etc/ssh/
-rw-------. 1 root root 125811 Aug 13 2015 moduli → 用于 DH-GEX 算法
-rw-r--r--. 1 root root 2047 Aug 13 2015 ssh_config → SSH 客户端配置文件
-rw-------. 1 root root 3879 Aug 13 2015 sshd_config → SSH 服务配置文件
-rw-------. 1 root root 672 May 20 14:22 ssh_host_dsa_key → DSA 算法私钥
-rw-r--r--. 1 root root 590 May 20 14:22 ssh_host_dsa_key.pub → DSA 算法公钥
-rw-------. 1 root root 963 May 20 14:22 ssh_host_key → SSH V1 版RSA 算法私钥
-rw-r--r--. 1 root root 627 May 20 14:22 ssh_host_key.pub → SSH V1 版 RSA 算法公钥
-rw-------. 1 root root 1675 May 20 14:22 ssh_host_rsa_key → SSH V2 版 RSA 算法私钥
-rw-r--r--. 1 root root 382 May 20 14:22 ssh_host_rsa_key.pub → SSH V2 版 RSA 算法公钥
非对称加密协商
服务端 SSH 服务正常运行后,客户端连接时,进行如下交互:
1:客户端向服务端发送连接请求。
客户端通过 SSH 工具连接服务端。相关信息通过明文发送。
2:服务端返回公钥信息: 根据客户端所使用的服务协议版本及算法设置,返回相应公钥信息。比如,默认情况下,客户端通过 SSH V2 版协议,基于 RSA 算法建立连接,则服务端将 ssh_host_rsa_key.pub文件中的内容返回客户端。相关信息通过明文发送。
3:客户端对服务端公钥信息进行比对和确认: 客户端接收到服务端公钥信息后,会进行如下比对,并让用户对相关信息进行确认。
The authenticity of host ‘192.168.0.1 (192.168.0.1)‘ can‘t be established.
RSA key fingerprint is c2:49:d9:43:74:d5:ed:bc:28:9b:d2:7b:63:94:cf:bc.
Are you sure you want to continue connecting (yes/no)?
如果用户输入 no ,则连接中断并报错(Host key verification failed)。
cat ~/.ssh/known_hosts
IP 明文显示:
192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3sdlboGEgY9buZpkPuygPw0NxAvmxYd0mc3fo2MgP+JqgFC9/9ZXOgDXKJrjE2HKBieJZSPKGncIh+zLxTvmykeJQBXv7i1GiUjW+H3VY69Ge3AdGfCd+XF+Cvi1e+j18zhHnjSzvIBoNpT5cBWWNbw7mNHCwTb0sHAVUkWR4Ck/LM5/rQ09A+m6BLfZJL8CRNGxKTbyINi6o812S+Cy64WqDs1nTpIXp2Bkcpjclb36bFSs9Z/tWNuJl7A//7HNtxMgFGBnE07Ykvvy8s06DUmkyFy8GcXGBpnfdg9utLodfQLFQnKflCQZ110BpQaCWlWPjU9dc4w3XLJ/XQOP4w==
IP 做了加密处理:
|1|3efXAZ4sNHcUcHamBy4gDriblc8=|8idBhLq9aLl2sfh4KswMsk4sPFI= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwS4DE3hok8RCkxYlTxsexNrNa62e05UGSkoP7ie26DDWjG1Aoc74cCsE4is9p7lEfFUYYlAzeYhPqE/yGf5YxRZUOU2IeFI4cEqo8YZr7edVYpgAq2f2J0zMwk1syenD12lmUPkYA4mMB6it3jxXR5k+H0HZh9YA7mRXkiTjlkAMWirBcnUvtKYRv9LRIr3ikUiPy2gfZO291Ae9zuTsWwEtHQxIpiBgk3vwF2gCUFlX9y//IsMjdQq5prk7x3BjXhUorqgJO1gt1VHW8Xxx9Oe50YF1hi9DuE6VXwyh4xfHTmauRQybwsYafdA3HxrA2od6x9l19D9EH7xHAjDa5w==
4:客户端生成临时密钥对: 服务端公钥校验及确认后,客户端会生成一对临时密钥用于客户端加密。该密钥对不会存储到文件,而是记录在内存中。每次连接都会重新生成临时密钥对。
5:客户端发送公钥信息: 客户端向服务端,发送前述生成的临时密钥对中的公钥信息。相关信息通过明文发送。
至此,服务端及客户端都拥有对方的公钥和自身的私钥,所以称为非对称加密。
后续数据交互过程
后续登录校验及正常的数据传输,都会通过双向加密方式进行。相关交互说明如下:
1:如果服务端需要发送数据给客户端:
(1)服务端使用所持有的客户端公钥,对需要传输的数据进行加密,再发送给客户端。
(2)客户端收到信息后,使用所持有的自身私钥解密后获取数据。
2:反之,如果客户端需要发送数据给服务端,也是类似的流程:
(1)客户端使用所持有的服务端公钥,对需要传输的数据进行加密,再发送给服务端。
(2)服务端收到信息后,使用所持有的自身私钥解密后获取数据。
实战演练
安装: yum isntall openssh-server
启动: service sshd start
设置开机运行: chkconfig sshd on
查看进程: ps -ef | grep ssh
centos在安装的时候已经默认将客户端和服务端都安装好,可以你之前安装的过程,或者使用yum install openssh-sclients查看
在客户端安装有三种:xshell、putty、secureCRT
xshell下载链接:?http://dlsw.baidu.com/sw-search-sp/soft/7b/15201/Xshell_5.0.0.37_setup.1459931786.exe
在windows下的xshell中 使用
ssh root@192.168.1.115 # 连接到服务器(用户名 + 账号)
如果不成功, 我们尝试ping一下其ip地址,看看能不能访问这个ip地址
回到服务器端,使用ifconfig命令,你可能会发现ip地址变了
解释:重启电脑或者重启虚拟机这个ip地址会发生改变的,因为我们是使用桥接方式的
config为了方便我们批量管理多个ssh
config存放在 ~/.ssh/config
config配置语法
SSH config关键字
关键字 解释
Host 别名
HostName 主机名
Port 端口
User 用户名
IdentityFile 密钥文件路径
创建一个SSH连接
在家目录下新建一个文件
cd ~/.ssh/
touch config
vim config
写入内容
此时可以通过Host名称wlk登录,不需要写入ip和端口等等信息了
只需要别名就可以连接成功了
如果是多个用户我们可以 在写个这样的 内容 host “wuliekun” 后面一样的,那么也可以连接成功
ssh key 使用非对称加密方法生成公钥和私钥
私钥存放在本地~/.ssh目录
公钥可以对外公开,放在服务器的~/.ssh/authorized_keys
Windows平台生成ssh key
点击xshell菜单栏中工具下的用户秘钥管理者
然后将其保存放在桌面上
Linux平台生成ssh key
ssh-keygen -t rsa
ssh-keygen -t dsa
进入到家目录下的/.ssh
ssh-keygen
我们使用ls -al在/.ssh目录下看看有没有新增这些文件
如何使用秘钥
发现连接出错
原因:公钥可以对外公开,放在服务器的~/.ssh/authorized_keys
而目录下却没有这个authorized_keys.
所以需要创建一个
touch authorized_keys
vim authorized_keys
将windows下的公钥写入到authorized_keys中
ok了
1:端口安全是指尽量避免服务器的远程连接端被不法分子知道,为此而改变默认服务端口号的操作
2:如何改变ssh服务端口
vim /etc/ssh/sshd-config
service sshd restart
以上是关于远程登录——SSH的主要内容,如果未能解决你的问题,请参考以下文章