服务器密码被暴力破解了shell
原由:前几天在腾讯云建立了个云服务器,这两天玩的还挺好,学到很多东西。然而今早忽然看到微信提示,服务器被破解了(具体是root密码被暴力破解了)。忽然有点懵,而后迅速登录上服务器查看以后发现并无什么影响,仅仅只是root密码被暴力破解。以后不由一阵感慨,服务器居然这么脆,简简单单的2457次尝试以后就成"别人"的了,网络还真是个好东西,咱们之间的距离被拉扯到如此之近=.=。ubuntu
解决:感慨一阵事后,我得想办法解决,因而开始百度,开始尝试,解决办法能够是①关闭端口,能够关闭全部的端口,没有端口开放,天然也就不会有什么入侵了,不过这不太可取。②在端口上限制ip访问,把22端口从公网到服务器访问的ip仅仅限制到本机ip地址可访问便可。腾讯云的后台管理提供了这个方法的便捷操做过程,这个可取,马上设置。③将登录方式改成ssh秘钥登陆,禁掉密码登陆,这个貌似比较安全还比较通用,可取,可是刚开始不太理解原理。但由于有了被破解的经历,为了安全就经过一些文档的说明完成了这一步(其实这是一种私钥和公钥配对的方式验证的,后面才知道)。经过②③两步服务器基本安全了,问题也就解决了。可是ssh加密以及ssh验证等问题搞不明白,就有点郁闷,因而就去看了看服务器的维护,ssh登陆的一些操做,今天主要就是写这块。windows
一、ssh传输安全
在window上远程链接服务器最经常使用的工具就是xshell、xftp这两个工具,xshell登陆服务器须要用户名,密码(或私钥),端口号,而服务器只要打开ssh服务,xshell就能够链接进来,得到shell环境。这里面就有连个问题:登陆和传输。服务器
传输:通常状况下,在本机上会用用户名和密码(服务器上某个用户的信息)+端口号(22)登陆,登陆事后开始传输数据,那么传输的数据是不是安全的呢?用一些工具能不能查看到数据?其实用xshell(ssh的客户端)登陆后传输数据是安全的,这是由于在传输过程当中服务器和客户端都会对数据进行加密,这里用到公钥和私钥,是一种非对称加密。微信
细分登陆过程:①启动ssh服务后,服务器会去找/etc/ssh/ssh_host*(存放公钥和私钥),若是没有则sshd主动创建公钥,以及私钥。②客户端请求创建链接。③服务器将公钥发送给客户端(公钥是明文存在)。④若是第一次与服务器链接,将公钥加入~/.ssh/know_hosts文件中,若不是第一次链接,则对比与之前的记录是否有差别(这里的差别是,服务器那边将公钥换过以后,客户端并不知道)。⑤客户端将自身生成私钥和公钥,并将公钥回传给服务器。到此客户端有“服务器的公钥和自身的私钥”,服务器有客户端的“公钥和自身的私钥”。这即是非对称加密。⑥服务器和客户端开始双向传输数据,客户端用本身私钥加密--->服务器用客户端的公钥解密,反之亦然。网络
经过这种登陆过程以后,服务器和客户端相互传递信息是安全的。ssh
二、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命令也就不须要密码了,这就是秘钥登陆,本地保存一份私钥,服务器上有公钥,就能够实现免密登陆了,这里重点区别前面所说的传输是用的公钥和私钥(重)。
三、说回不理解的地方
为何腾讯云生成ssh秘钥后将秘钥与服务器绑定,在提供用户下载一份后,就能够经过秘钥链接服务器了?
其实就是2中所说的登陆原理,与云服务器绑定的秘钥是公钥,用户下载的是私钥,本地有了私钥就不须要验证了。在登陆时要把私钥位置告诉ssh命令或者xshell便可。
上图所示,将私钥移动到家目录后在登陆就须要密码了,由于.ssh目录下没有私钥了。而后ssh命令加-i 参数,明确指出私钥地址后,登陆不须要密码。这种加-i的方式就使用与从云服务器上下载的私钥。
最后说明,登陆到服务器意为:客户端某用户登陆到服务器上的某用户,在这里秘钥的验证发生在用户和用户之间,所以公钥私钥都是放在某用户的家目录下。与以前所说的把秘钥放在/etc/ssh/ssh_host*文件中区别看待。