当前位置:网站首页>云服务器基于 SSH 协议实现免密登录

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

2022-08-10 21:51:00 InfoQ

SSH 协议实现免密登录

前言

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

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

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

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

null
但是通常情况下,我们都是在本地通过一个
支持 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>

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

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

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

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

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

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

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

null
2.将公钥部署到服务器
Linux 系统有关 SSH 协议的内容都放在了 
/root/.ssh
 目录下,我们来看一下。

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

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

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

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

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

$ ssh-copy-id <用户名>@<服务器 IP>

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

null
还会提示我们尝试使用 
ssh [email protected]<服务器 IP>
的方式登录,确保 
key
 已经被添加到服务器了。
3.测试
那么我们就试一下免密登录:

$ ssh <用户名>@<服务器 IP>

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

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

$ cat authorized_keys

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

null

小结

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

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

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

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/9bf0b0a20639755d6dbd358f1