事情的起因是隔壁实验室服务器被黑后拿来挖矿,询问了一番,对方是直接ssh登录服务器后直接wget挖矿脚本,由于密码设置的比较简单,可能在ip暴露情况下直接暴力破解了,先来看下基本概念。
-
非对称加密:它包含两套秘钥 - 公钥以及私钥,**其中公钥用来加密,私钥用来解密,**并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险。
-
保证SSH安全性的方法,简单来说就是客户端和服务端各自生成一套私钥和公钥,并且互相交换公钥,这样每一条发出的数据都可以用对方的公钥来加密,对方收到后再用自己的私钥来解密。
-
SSH(secure shell)是建立在应用层上的安全协议。传统的一些服务,比如ftp,telnet本质上不是安全的,因为是用明文来 传输 数据,所以可能会有中间人攻击。SSH会把传输的数据进行加密。
两种级别安全验证(对应两种登陆方式)
(1) 基于用户名和密码
- 服务端收到登录请求后,首先互换公钥
- 客户端用服务端的公钥加密账号密码并发送
- 服务端用自己的秘钥解密后得到账号密码,然后进行验证
- 服务端用客户端的公钥加密验证结果并返回
- 客户端用自己的秘钥解密后得到验证结果
(2)配置公钥和私钥后免密登录
有些时候并不是开发者手动去连接服务器,而是客户端的程序需要连接到服务器,这时候用密码登录就比较不方便,一是需要处理输入密码的问题,二是需要想办法安全的储存密码到程序里,这种情况下便可以利用公钥来进行无密码登录。
- 客户端用户必须手动地将自己的公钥添加到服务器一个名叫authorized_keys的文件里,顾名思义,这个文件保存了所有可以远程登录的机器的公钥。
- 客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥)
- 服务端根据指纹检测此公钥是否保存在authorized_keys中
- 若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回
- 客户端收到后用自己的私钥解密,再利用服务端公钥加密后发回
- 服务端收到后用自己的私钥解密,如果为同一字符串,则验证通过
是否可以完全避免中间人攻击?
也不是,其实在流程中也可以看出来,初次建立连接过程,客户端和服务端会传递各自公钥
在首次服务端返回公钥到客户端的时候,客户端其实无法判断对方是否可信,如果在这里已经被劫持了,就没办法了。