你我之间的距离竟如此之近--(服务器安全,ssh加密)

服务器密码被暴力破解了

 

 

 

  起因:前几天在腾讯云创建了个云服务器,这两天玩的还挺好,学到不少东西。然而今早突然看到微信提示,服务器被破解了(具体是root密码被暴力破解了)。突然有点懵,然后迅速登陆上服务器查看之后发现并没有什么影响,仅仅只是root密码被暴力破解。之后不禁一阵感慨,服务器竟然这么脆,简简单单的2457次尝试之后就成"别人"的了,网络还真是个好东西,我们之间的距离被拉扯到如此之近=.=。

  解决:感慨一阵过后,我得想办法解决,于是开始百度,开始尝试,解决办法可以是①关闭端口,可以关闭所有的端口,没有端口开放,自然也就不会有什么入侵了,不过这不太可取。②在端口上限制ip访问,把22端口从公网到服务器访问的ip仅仅限制到本机ip地址可访问即可。腾讯云的后台管理提供了这个方法的便捷操作过程,这个可取,立刻设置。③将登陆方式改为ssh秘钥登录,禁掉密码登录,这个貌似比较安全还比较通用,可取,但是刚开始不太理解原理。但因为有了被破解的经历,为了安全就通过一些文档的说明完成了这一步(其实这是一种私钥和公钥配对的方式验证的,后面才知道)。通过②③两步服务器基本安全了,问题也就解决了。但是ssh加密以及ssh验证等问题搞不明白,就有点郁闷,于是就去看了看服务器的维护,ssh登录的一些操作,今天主要就是写这块。

1、ssh传输

  在window上远程连接服务器最常用的工具就是xshell、xftp这两个工具,xshell登录服务器需要用户名,密码(或私钥),端口号,而服务器只要打开ssh服务,xshell就可以连接进来,获得shell环境。这里面就有两个问题:登录和传输。

  传输:一般情况下,在本机上会用户名和密码(服务器上某个用户的信息)+端口号(22)登录,登录过后开始传输数据,那么传输的数据是否是安全的呢?用一些工具能不能查看到数据?其实用xshell(ssh的客户端)登录后传输数据是安全的,这是因为在传输过程中服务器和客户端都会对数据进行加密,这里用到公钥和私钥,是一种非对称加密。

  细分登录过程:①启动ssh服务后,服务器会去找/etc/ssh/ssh_host*(存放公钥和私钥),如果没有则sshd主动建立公钥,以及私钥。②客户端请求建立连接。③服务器将公钥发送给客户端(公钥是明文存在)。④如果第一次与服务器连接,将公钥加入~/.ssh/know_hosts文件中,若不是第一次连接,则对比与以前的记录是否有差异(这里的差异是,服务器那边将公钥换过之后,客户端并不知道)。⑤客户端将自身生成私钥和公钥,并将公钥回传给服务器。到此客户端有“服务器的公钥和自身的私钥”,服务器有“客户端的公钥和自身的私钥”。这便是非对称加密。⑥服务器和客户端开始双向传输数据,客户端用自己私钥加密--->服务器用客户端的公钥解密,反之亦然。

  通过这种登录过程之后,服务器和客户端相互传递信息是安全的。

2、ssh登录

  说回之前的ssh登录(具体是登录时所用的密码或秘钥),因为今天在看东西的时候把登录和传输搞混了,因此在这里分开写。这里不说windows的xshell了,直接说ssh命令,其实xshell的登录方式就是使用的ssh命令,只不过他多出图形化界面。

  在用ssh命令登录服务器时,要输入用户密码才可以登录成功。输入密码这种方式很简单很容易理解,新手也很容易操作,在本地虚拟机上采用这种方式登录很方便。但是就像上面图片所示,如果服务器对外网开放,用户密码很容易被暴力破解,因此,一般的服务器不推荐这种方式登录。在这里就要用到秘钥了,具体来说是一对秘钥(公钥和私钥)。配置的具体过程是这样的:先生成一对秘钥,将公钥拷贝到服务器某个用户的~/.ssh/authorized_keys文件中去,将私钥(id_rsa文件)拷贝到客户端某个用户的~/.ssh文件夹中,id_rsa权限为600,~/.ssh目录权限为700。客户端有id_rsa的用户在使用ssh命令登录服务器那个拷贝过公钥的用户时就不需要密码或其他东西了。

  这里很容易出现误解,我之前用过scp命令,和ssh命令相似,就出现了误解。因为不需要密码,所以很简单很方便,用的挺开心。但是碰到今天的事情之后,就有了疑问,腾讯云为什么绑定一个文件到服务器,又要下载一个秘钥文件,加载到xshell中后才能登录?

  下面将ssh免密登录的过程在走一遍:  

    ①在家目录下(~)运行ssh-keygen -t rsa    然后敲三次回车   //别的目录运行也可以,不过要移动文件。

    

    ②将.ssh文件下的id_rsa.pub拷贝到服务器的某用户(这里是ubuntu这个用户)~/.ssh目录下的authorized_keys文件中。//最好在服务器的家目录下也运行①中的命令,创建出./ssh文件。这个文件是默认隐藏的,用ls -al可以查看

    

    ③上面scp命令,将本地公钥拷贝到服务器,因为还用讲公钥写入服务器的authorized_keys文件,所以用ssh命令登录服务器,这两条命令都需要输入密码(为了方便先打开密码可用)

     

    ④上图将公钥写入服务器的~/.ssh/authorized_keys,并退出。接下来在从客户端登录服务器不在需要密码,如下图。当然scp命令也就不需要密码了,这就是秘钥登录,本地保存一份私钥,服务器上有公钥,就可以实现免密登录了,这里重点区别前面所说的传输是用的公钥和私钥(重)。

     

 

3、说回不理解的地方

   为什么腾讯云生成ssh秘钥后将秘钥与服务器绑定,在提供用户下载一份后,就可以通过秘钥连接服务器了?

  其实就是2中所说的登录原理,与云服务器绑定的秘钥是公钥,用户下载的是私钥,本地有了私钥就不需要验证了。在登录时要把私钥位置告诉ssh命令或者xshell即可。

     

  上图所示,将私钥移动到家目录后在登录就需要密码了,因为.ssh目录下没有私钥了。然后ssh命令加-i 参数,明确指出私钥地址后,登录不需要密码。这种加-i的方式就使用与从云服务器上下载的私钥

  最后说明,登录到服务器意为:客户端某用户登录到服务器上的某用户,在这里秘钥的验证发生在用户和用户之间,因此公钥私钥都是放在某用户的家目录下。与之前所说的把秘钥放在/etc/ssh/ssh_host*文件中区别看待。

 

 

 

    

 

 

     

 

 

posted @ 2019-11-10 22:02  Ccluck_tian  阅读(198)  评论(0编辑  收藏  举报