ssh服务
ssh: secure shell,22/tcp,安全的远程登录,实现加密通信,代替传统的telnet协议
具体的软件实现:
- OpenSSH:ssh协议的开源实现,Centos默认安装
- dropbear:另一个开源项目的实现
SSH协议版本
- v1:基于CRC-32做MAC,不安全;man-in-middle
- v2:双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA实现身份认证
公钥交换原理
ssh服务的公钥和ssh服务的版本无关,v1和v2版本都同样,存在被劫持的风险,第一次连接一定要确保连接正确。
- 客户端发起连接请求
- 服务的返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
- 客户端生成密钥对
- 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
- 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
- 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
- 最终:双方各自持有三个密钥,分别为自己的一对公、私钥以及对方的公钥,之后的所有通讯都会被加密
服务端发生改变
当客户端第一次保存连接的服务端公钥后,后面的每次连接都会检查公钥是否一致,如果目标机器公钥发生了变化(也有可能是其它机器使用了和服务端相同的ip),ssh会发出警告
测试:
ssh客户端192.168.224.162向ssh服务端192.168.224.163发起第一次连接,经过确认后,保存了服务端的公钥并连接。
下面我将原服务端192.168.224.163关机,模拟连接请求被相同ip的机器劫持或者占用
使用第3台机器,配置和服务端相同的地址
使用客户端再次向192.168.224.163发起连接。
客户端检测到了远程主机的已经发生了改变,和原来不一样,所以发出了警告
客户端在第一次连接的时候,把服务端的公钥下载到了本地家目录 .ssh/known_hosts,由此发现现在连接的服务端已经不是原来的主机了
禁止客户端首次连接的询问过程
ssh客户端配置文件:/etc/ssh/ssh_config
将下图 StrictHostKeyChecking ask,取消注释,改为no,将不显示检查指纹信息的提示
sed命令修改方法:sed -i.bak '/StrictHostKeyChecking/s/.*/StrictHostKeyChecking no/' /etc/ssh/ssh_config