作为一名运维人员登录服务器这个动作,比我们吃饭喝水的频率要来得高。一般来说没人整天在机房管理着公司服务器的吧,机房这个地方为了咱们的健康生活能少呆还是尽量少呆吧,毕竟辐射这东西是积累伤。

  我们通常是通过终端远程控制服务器进行着管理工作,早先的终端是通过telnet协议传输来完成远程登录的。可是telnet协议在网上是明文传输的,随便在数据包经过的地方装个抓包工具一抓就能够获取到你服务器的账号密码。现在搞网络安全测评的评估的一条重要标准就是看你网络设备跟服务器里面的telnet服务关掉没。

  为了解决telnet协议不安全的缺陷,ssh这个协议应运而生它通过对传输的数据进行加密从而保证通信的安全。

  ssh的全称是Secure Shell是个应用层协议,默认使用tcp 22号端口。ssh只是种协议,它的实现必须要由应用程序完成,linux下通常服务端是OpenSSH。在windows下面的终端我们通常用Xshell、SecureCRT、Putty等。

  我们用终端登录服务器的过程是这样的,首先用户发送一条消息给服务端----服务端收到消息把自己的公钥发送给用户---用户把自己的账号密码用服务端发来的公钥加密发送给服务端----服务端收到消息后用自己的私钥解密验证,验证成功同意用户登录。

  但是这有个问题,如果中间有人恶意截获了登录请求,然后他冒充服务器把自己的公钥发给用户,再冒充客户端发登录请求给真正的服务器,这样一来***者就获得了服务端的公钥。然后当用户把自己的账号密码通过假服务端的公钥加密之后发给假服务端,假服务器就用自己的私钥解密,***者又获得了用户的账号密码,接下来***者再把获得的用户账号密码用真服务器的公钥加密发给真正的服务器就可以成功登陆...这种手托两端的***方式就是著名的“中间人***”。

  对于ssh1这种***已经构成了严重的威胁,ssh2对这方面有了较大的改进。具体来说,在某个ssh建立之初,如果一个客户端收到一个未知服务器的公钥,OpenSSH会列出警告信息,并询问是添加该公钥还是放弃链接。如果是则把该服务器的公钥添加至客户端本地数据库,下次登录时就会自动找到这台服务器的公钥,就无需去网上获取了。

 wKiom1UiLdqzd1uJAAGozhT20j0304.jpg

 

   接下我们就可以输入用户名密码登录了。假如我们管理公司100台服务器,某个时刻需要同时登陆这100台服务器,难道我们要一台一台的输账号密码登录么?这里就要用到ssh的密钥认证了。

  具体实现方法为我们在客户端用非对称加密算法生成一对密钥,然后把公钥上传到服务器你要登录的那个用户名下面,当我们要登录的时候客户端随即抓取一段字符用自己的私钥加密传送给服务器,服务器收到之后如果可以用公钥解密那么身份认证成功。

  实现步骤如下:

1.先在服务端用ssh-keygen -t rsa 生成一对密钥(由于OpenSSH对putty生成的密钥支持不大好,只能用服务端生成了)中间会要求为私钥加个密码,每次访问私钥的时候输入私钥密码,这里直接按回车不加密,生成成功后执行命名的用户家目录下的.ssh文件夹下会有2个文件:id_rsa id_rsa_pub

  wKiom1UiPG-D5NFAAAGbetn4eU4061.jpg 

2.把id_rsa_pub里面的内容追加到,需要免密码登录的用户家目录下的.ssh文件夹中的authorized_keys中。

 wKiom1UiP5fy3d2eAAHSSgHHew8322.jpg

3.把私钥文件复制到本地,用putty密钥生成器转换id_rsa同样不设密码点生成

wKioL1UiQi3jmqFaAAM***UwPrc013.jpg

4.修改/etc/ssh/sshd_config文件,找到图中2行去掉注释保存退出,执行service sshd restart重启sshd服务

wKioL1UiQ0KDM1MxAADS1xzeAkY255.jpg


5.在putty的ssh选项-认证那一行选择私钥的路径,在数据那里填上自动登录用户名就可以实现自动登录了

wKiom1UiQtiBOXbnAAJ6s1KSmnk652.jpg

效果如下:

wKiom1UiQ17izcOIAAC5c2xBPpI567.jpg

我这里使用的root账号登录,在实际服务器管理中,root账号是不允许通过远程终端直接登录的。如果要实现多台主机验证同一个私钥登录只需要把公钥复制到其他服务器相应账号的目录下即可。