写点什么

云服务器基于 SSH 协议实现免密登录

作者:昆吾kw
  • 2022 年 8 月 10 日
    天津
  • 本文字数:2215 字

    阅读完需:约 7 分钟

云服务器基于 SSH 协议实现免密登录

SSH 协议实现免密登录

前言

拿到一台新的云服务器,肯定会特别想把玩它。想把玩它,那肯定得先登录它,进入到它的内部,一睹它的风采。


虽然,现在的云服务器厂商都提供了在线登录系统的功能:



该说不说,在线终端这一块来说,阿里云做的是真的不赖,有多种模式,甚至不用登录,可以直接发送命令到服务器去执行:



这个终端的颜值不错,使用体验也不错,非常流畅:



但是通常情况下,我们都是在本地通过一个支持 SSH 协议的终端工具,远程登录服务器,来做一些操作。


常用的终端工具有:


  • Xshell:好用,舒服,但是收费软件

  • Putty:简洁,又太过简洁,免费

  • CMD / Powershell:Windows 自带,也能用

  • Git bash:安装 Git 时自带的,挺不错

  • Cmder:代理 CMD 的第三方终端,美观,但是个人体验感觉笨重


选择一个用的顺手的就行。如果是 Windows 系统,**强烈推荐使用 git bash **或者其他你用着顺手的终端工具。

SSH 协议

上面说,要使用支持 SSH 协议 i 的终端来登录服务器。


那么什么是 SSH 协议呢?


SSH 为 Secure Shell 的缩写,即“安全外壳”,由 IETF 的网络小组(Network Working Group)所制定,是基于公钥的安全应用协议

由 SSH 传输层协议、SSH 用户认证协议以及 SSH 连接协议三个子协议组成,各个子协议分工合作,实现加密、认证、完整性检查等多种安全服务。

其研究目的是以一种渐进的方式增强网络安全,通过现代密码技术,增强网络中非安全的服务,如 FTP、Rlogin、Telnet 等,实现服务器认证、用户认证及安全加密网络连接服务。

SSH 协议主要有两个版本 SSH1 和 SSH2,SSH1 因存在漏洞已停用,目前主要用的是 SSH2。


我们只需要抓住两个关键词就行:加密认证


通过 SSH 协议,我们可以使用更安全的网络服务,和以加密的方式进行远程登录

使用 SSH 远程登录服务器

SSH 是一种协议,也是终端工具中的一个命令。


通过 ssh 命令,就能连接并登录到远程服务器上。登录的方式有多种,我们演示几种常用的。

1. 使用用户名和密码登录

打开一个终端工具,输入命令:


$ ssh <用户名>@<服务器 IP>
复制代码


然后会提示输入密码,然后回车,就能登录到服务器了:



之后,我们就能在本地的终端工具中,操作远程的服务器了。

2. 配置 ssh 公钥实现免密登录

每次要登录服务器都要输入密码,很烦人。所以通常我们都会配置一个 ssh 公钥,从而实现无密登录

免密登录的原理

SSH 协议采用非对称加密,使用一对秘钥进行通信。我们将自己机器的私钥存放在本地,然后将公钥交给服务器,这样我们本地的机器和服务器之间就可以直接使用这个公钥进行通信了(其实并不是纯依赖公钥通信),从而避免了每次都要输入密码的情况。


这是一个大概的流程:


1.客户端生成一对 SSH 密钥,分为公钥和私钥


2.客户端将自己的公钥发送给服务器,发送到服务器的 authorized_key 文件中


3.服务器端生成一个随机数 R,再使用客户端的公钥对 R 进行加密,记作 Pub(R)


4.随后服务器将 Pub(R) 发送给客户端


5.客户端拿到 Pub(R) 之后,就可以使用自己的私钥进行解密,得到随机数 R,再加上当前和服务器会话的 sessionKey,加密之后得到一个摘要 1,发送给服务器


6.服务器此刻有 R,也有 sessionKey,经过同样的摘要算法计算,也得到一个摘要 2,二者一对比,发现一样,于是通过了校验,就允许客户端登录服务器了。


这个过程看起来很复杂,但是实际操作起来非常简单,因为这些操作都是在 SSH 协议背后自动完成的。我们只需要负责提供私钥即可。

1.本地生成 SSH 秘钥。

使用命令 ssh-keygen 来生成秘钥。


$ ssh-genkey -t rsa
复制代码


首先会询问你要把生成的秘钥放到哪个路径,直接回车,保持默认即可:



由于我本地已经生成过秘钥了,会询问是否覆盖:



接着,会有两步骤询问是否输入 passphrase,它是私钥的密码,如果设置了之后,之后在和服务器通信时,虽然不再需要输入用户口令,但要输入该私钥(也有办法解决,但不在本文内容之列),回车跳过即可:



最后就生成了一对秘钥,私钥名为 id_rsa,公钥名为 id_rsa.pub


2.将公钥部署到服务器

Linux 系统有关 SSH 协议的内容都放在了 /root/.ssh 目录下,我们来看一下。



我们主要关心 authorized_keys 这个文件,只要服务器将用户的公钥保存在该文件中,用户就能实现免密登录


生成的公钥私钥其实就是两个文本文件,里面的文本内容才是真正有用的东西。


所以现在需要把公钥文件的内容,拷贝到服务器的 authorized_keys 文件中。


方式有很多种,最简单的一种是使用一个 ssh-copy-id 命令。


Windows 系统需要使用 git bash ,CMD 和 Powershell 没有这个命令:


$ ssh-copy-id <用户名>@<服务器 IP>
复制代码


然后会提示输入密码,之后就能把本机的公钥发送到目标服务器中了:



还会提示我们尝试使用 ssh root@<服务器 IP>的方式登录,确保 key 已经被添加到服务器了。

3.测试

那么我们就试一下免密登录:


$ ssh <用户名>@<服务器 IP>
复制代码


发现果真,不再提示需要输入密码,而能直接登录成功了:



然后去看一下此时 authorized_keys 文件的内容:


$ cat authorized_keys
复制代码


上面的是以前的公钥,下面的就是刚刚通过 ssh-copy-id 添加的公钥:


小结

到这里,就能实现本地机器和远程服务器的一个免密登录访问了。


现在我们登录服务器,使用是默认的 root用户。登录的方式可以是 ssh 命令 + root 用户名 + 服务器地址。此时如果有不法分子,想要攻击我们的服务器,只需要暴力破解密码,不停的使用 root 用户尝试登录,就最终有可能登录进行系统。可见,如果使用默认的 root 用户名是非常危险的的。


下篇文章,我们来介绍下如何禁止使用 root 用户登录和其他一些安全防范措施。

发布于: 刚刚阅读数: 3
用户头像

昆吾kw

关注

还未添加个人签名 2020.10.21 加入

还未添加个人简介

评论

发布
暂无评论
云服务器基于 SSH 协议实现免密登录_Linux_昆吾kw_InfoQ写作社区