centos(18)-putty/winscp实现ssh密钥登录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangb_java/article/details/85929726

第3篇,我讲过用putty/winscp输入用户名/密码,远程登录服务器,这种登录方式存在一些安全隐患。而本篇讲的密钥登录是一种安全性别更高的登录方式。关于密钥及其他本篇讲到的一些安全性知识概念,参考web安全 (1)

ssh密码登录

linux远程连接是使用的ssh,和https有点类似,流程如下:

1.服务器开启时默认会打开ssh服务,ssh服务会检测服务器私钥/公钥,如果不存在就自动生成。

2.用户请求连接服务器。

3.服务器发送公钥给客户端。我在第3篇讲过,如果用户是第一次连接服务器,会弹出一个窗口。提示大意是收到了来自服务器的公钥,而且它是未知的,是否信任它?如果选是,会将这个公钥保存在客户端,以后再次登录时,将新收到的公钥和之前的对比一致,说明它是可信的,不再弹出提示。如果和之前的不一致,可能是服务器修改了密钥,或者遇到了黑客。此时也会有提示:

4.客户端生成对称密钥,使用服务器的公钥加密,发给服务器。

5.服务器用自己的私钥解密,拿到对称密钥。

6.安全通道建立,客户端和服务器使用对称密钥完成登录和通信。

以上过程看似安全,但仍然有隐患:

1.我在web安全 (1)中讲过,公钥分配并不是安全的,所以如何保证客户端第一次拿到公钥是真实的?这一点最后再讲。

2.密码虽然加了密,但只要开放了密码登录,就存在被黑客攻破的可能性。而ssh密钥登录就是要关闭密码登录。

ssh密钥登录

用户生成一对公钥/私钥,公钥放在服务器,私钥放在客户端。每次登录通过公钥和私钥进行认证,而不再使用密码。如下:

生成公钥/私钥

这里用root登录服务器,执行生成密钥命令:ssh-keygen -t rsa

rsa是现在主流的非对称加密算法,执行过程中途会问你密钥保存位置,以及是否需要密码,如果设了密码以后提取密钥的时候都需要输入密码,如果密钥被盗,而对方不知道密码将无法正常使用密钥。这里全部回车跳过,全默认不设密码。默认会将公钥/私钥保存在当前用户的.ssh即/root/.ssh/目录下。

服务器公钥配置

上图最后一条命令:cat ./.ssh/id_rsa.pub >> ./.ssh/authorized_keys

将生成的公钥文件id_rsa.pub的内容,写入/root/.ssh/authorized_keys文件中,密钥登录时,服务器就是用当前用户.ssh目录下的authorized_keys文件进行认证的。登录其他用户也是一样。

客户端私钥配置(winscp)

客户端以winscp为例,将上面生成的私钥文件/root/.ssh/id_rsa复制到window中来。在登录winscp时选择高级,如下配置:

上图右下角选择你的id_rsa私钥文件,文件类型选择全部才能看到,会弹出以下提示,确定转换格式并会保存为id_rsa.ppk文件,如上红框密钥文件处。私钥配置完毕。

winscp密钥登录

此时,不需要输入密码,直接用root登录winscp,会提示公钥认证,如下

我在第3篇绑定了winscp和putty,此时会自动用密钥登录绑定的putty

putty密钥登录配置

如果要单独登录putty,配置如下

密钥登录流程

1.客户端请求连接,服务器分配公钥,这个过程和上面ssh密码登录一样,这里省略。

2.客户端请求使用密钥登录。

3.服务器生成随机字符串,使用用户的公钥加密,发给客户端。

4.客户端用自己的私钥解密随机字符串,生成md5散列值,发回给服务器。

5.服务器用原始随机字符串同样生成md5散列值,与客户端的比对一致,认证登录成功。

以上过程中,不需要输入密码,而一次性的随机数即使泄露了也没有任何意义。

关闭密码登录

修改/etc/ssh/sshd_config文件,将其中PasswordAuthentication 参数从yes改为no:PasswordAuthentication no

执行命令重启ssh服务:systemctl restart sshd

第一次登录的问题

ssh不像https有证书,所以如何保证第一次登录的安全性?

第一次登录时,服务器上通常什么资料也没有,此时并没有多大风险,而且有足够的时间检查你所连接的服务器是否真实,以及检查是否有人登录过,曾经执行过的命令历史等。假如真的有黑客在第一次入侵,可以参考我在第11篇讲的方法,找到他的id,执行kill,立即修改密码。然后建立密钥登录方式,关闭密码登录。此时即使第一次登录的密码泄露了也没事。

猜你喜欢

转载自blog.csdn.net/wangb_java/article/details/85929726