ssh高级安全登录--开启密钥认证,禁用密码登录

来源:互联网 发布:淘宝下乡怎么代理申请 编辑:程序博客网 时间:2024/06/10 07:25

前面写了一篇基于密码认证的ssh安全登录,那也只是为了防止密码被暴力破解采用的一个救急的方法。后来发现其实基于密码的登录,都不是很安全。只要有心人通过扫描到我主机存在的端口,然后去偿试通过那些端口暴力破解,还是有密码被盗的可能。转而研究了一下基于密钥的登录验证。这篇文章主要是讲linux主机之间的ssh密钥认证登录。今晚或明天我还会写一篇Putty的基于密钥的安全登录。

一开始对加密技术并不是很了解,所以看网上的文章也不是很理解为什么那个公钥要放在被连接的服务器端,私钥为什么要放在建立连接的客户端,于是乎先查询了一下非对称加密技术RSA的原理。

简而言之,利用非对称加密技术会产生两个密钥,公钥和私钥。公钥用于加密,私钥用于解密。公钥是对外开放的,也就意味着谁都可以拿着公钥来加密数据。而私钥是私有的,也就只能有私钥拥有者一个人能够进行解密。而且基于rsa的加密要破解是相当困难的,几乎可以说成是不能被破解。因此,只要私钥不泄露,利用公钥加密的数据是别人是无法窃取的。

我们在和Linux建立连接的时候,首先发送一个连接请求,这时候服务器会马上返回一个公钥给我们,告诉我们利用这个公钥来加密数据。如在linux下首次ssh连接另一台主机时,会出现如下询问画面:

服务器告诉我们它的公钥是多少,好让我们用公钥来对现在的用户密码来进行加密传递给服务器。私钥只有服务器才有。所以,即使黑客截取到了我们公钥加密的信息,由于没有私钥,也是无法解密的。一般Linux会保存我们ssh登录的公钥。如你远程登录了192.168.1.6这台主机,第一次会出现如上画面,但以后就不会出现了。因为公钥已经保存在"~/.ssh/known_hosts文件中了。查看known_hosts文件,如看到如图所示

这里保存的就是192.168.1.6发给我们的公钥。如果以后再次连接192.168.1.6主机时,由于客户机known_hosts文件中已经存在公钥,就不会再次出现登录提示了。如图:

如果这时候我们删除客户机known_hosts里面的公钥的话,再次登录服务器,就会再次出现询问界面。保存known_hosts有一个好处,就是可以防止黑客通过IP欺骗骗取登录密码。比如现在另一台主机冒充192.168.1.6.由于另一台主机的公钥与我们原来保存的服务器公钥不相同,登录时,就会出现警告界面,并且退出登录。如图:

告诉你这台192.168.1.6的公钥和你以前所使用的不同!这时候你就千万要注意了,你得先确定现在登录的服务器倒底还是不是原来的服务器?也许有人会想,公钥既然是公开的,那么黑客也可以用原来的公钥来欺骗你啊,那样不就不会出现提示信息了吗?这样是可以,但是就算客户端输入了密码传给黑客,也只是一堆用公钥加密过的密文,而且通过公钥也是无法推算出私钥的。那么黑客没有私钥就解不了的!拿了也白拿。

好了,通过以上我们可以知道ssh登录是非常安全的。那么,下面让我们一起来建立linux主机之间的ssh密钥认证登录吧!

首先,要实现密钥登录,需要在客户端生成密钥。生成密钥的命令为ssh-keygen -t rsa。即表示使用rsa加密方式来生成密钥。如图:

提示你生成私钥为id_rsa,默认存放在/root/.ssh目录下。下面是提示输入密码,建议输入密码。这样就算黑客盗取了你的私钥,由于没有密码,也照样无法使用私钥解密。

我们切换到~/.ssh/目录下看看,看是不是生成了两个文件。

 可以看到,已经有两个文件id_rsa,id_rsa.pub。其中id_rsa为私钥,这个绝不能外泄。id_rsa.pub为公钥,可以对外发布。而且这个公钥也是我们也要传给需要登录的服务器上才能实现密钥认证!

密钥已经有了。那么下面我们就得将公钥加入到服务器的公钥认证文件authorized_keys中了,首先用scp上传公钥给服务器端。

 然后在登录服务器端将公钥导入到"~/.ssh/authorized_keys中。

 

这时候,服务器的authorized_keys中已经有了我们的公钥。那么,以后和客户端认证信息就可以用这个公钥来加密传输了。这时候,我们再用客户端登录服务器看看效果。

现在可以看到,我们未输入用户名和密码就直接登入服务器了!测试成功!(我这里私钥没有设密码,如果设置了密码,登录时会要求输入私钥的密码)

是不是就这样完了呢?还没有呢!密钥认证是成功了,但你还没有禁止密码登录啊!黑客还是可以偿试root登录暴力破解啊!这时候,一定要记得将sshd_config里面的PasswordAuthentication选项更改为 no! 然后一定要记得service sshd restart ! 这样就禁用了密码认证。黑客就算知道root密码,也无法通过ssh登录了呢!这时候密码登录情况如图:

现在好了,用户是无法通过密码ssh远程登录到服务器端了!那么现在就请保存好你的私钥吧!

 

ps: 看了一些文章,有的文章会提到,需要将/etc/ssh/sshd_config中的 RSAAuthentication yes ,PubkeyAuthentication yes,AuthorizedKeysFile .ssh/authorized_keys三行注释取消掉,即让它生效.但我并没有对这三行取消注释,依然是可以登录的。这三个参数默认就是生效的。