在之前的笔记中, 我们已经成功完成了服务器的安装和虚拟网络的配置。在本篇文章中,我们将为服务器配置 SSH 远程登录,进一步模拟实际开发环境中我们与服务器的交互。
SSH 简介
在开始配置之间,我们先简单了解一下 SSH:SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理 Linux 系统的首选方式。
我们可以将 SSH 粗略地视作 C/S(Client/Server)结构,想要使用 SSH 管理远程服务器, 需要在远程服务器上部署 openssh-server 服务,在本地服务器配置 openssh-client 服务。
接下来我们就开始一步步地部署 SSH 服务吧:)
服务端
我们首先确认一下服务器上是否已经安装了 openssh-server:service sshd status
可以看到我的服务器上已经安装了 openssh-server 并且开机自启动。
如果你的服务器上没有安装 openssh-server,使用 APT 进行软件包管理的 Linux 发行版可以通过 sudo apt install openssh-server 安装,然后通过 systemctl 设置开机自启动 sudo systemctl enable --now sshd。
至此,服务端的 SSH 服务已经可以使用了。
客户端
密码登录
我们先在 Windows 10 专业版环境下配置 openssh-client,并通过密码进行登录(这是 SSH 默认的登录方式)
-
打开“设置”选择“应用”
-
选择“可选功能”
-
可以看到我的机器上已经安装了
openssh-client -
如果你的机器上还没有安装的话,可以点击“添加功能”进行搜索安装
-
打开 PowerShell 尝试连接服务器
ssh <服务器用户名>@<服务器IP>(用户名和 IP 在上两篇笔记中已经配置好了) -
输入用户对应密码后即可成功登录,实现在本地对服务器进行操作
密钥登录
如果仅使用一台服务器进行一些基础的应用,并且使用高强度密码的话,密码登录其实已经足够了。
但在实际环境中,我们可能会有多台服务器,并且管理员会通过脚本进行自动化运维。如果对每一台服务器进行操作时都需要输入对应密码,整个过程将会非常低效。
这时候我们可以尝试使用 SSH 密钥登录。
简介
在开始配置前,我们先对 SSH 密钥登录进行简单的介绍:
- 客户端通过非对称加密算法生成一对密钥,其中包含一个公钥(
key)和一个私钥(key.pub),公钥和私钥构成一一对应关系 - 私钥文件被保存在客户端,公钥文件则被放置在服务端
- 客户端发起 SSH 连接请求后,会通过私钥表明身份
- 服务端收到客户端请求后会查找是否存在对应公钥,若有则允许登录,若无则拒绝登录
配置
接下来我们在 Ubuntu Desktop 环境下配置 openssh-client,并使用密钥进行登录
-
首先我们确认一下
openssh-client是否已安装:apt list --installed | grep -ne ssh可以看到我的机器上已经安装了
openssh-client。若未安装,使用APT进行软件包管理的 Linux 发行版可以通过sudo apt install openssh-client安装 -
生成密钥对:
ssh-keygen -t <加密算法> -b <密钥长度> -f <密钥对存放路径和名称> -C "<密钥对注释>"-
常用的密钥类型和建议长度如下表:
密钥类型 建议长度 特征 ecdsa521 是当下推荐使用的密钥类型, 拥有较好的兼容性 rsa2048 拥有最好的兼容性, 但其安全性正逐渐降低 dsa1024 其原始形式已不推荐使用 -
在我看的一部分 SSH 密钥登录教程里,会在创建密钥时指示连续输入两次回车,该操作的含义是将密钥文件密码留空,即
openssh-client可以直接读取该密钥文件,不需要输入密码解锁。但在实际应用中更推荐的是:用户登录密钥设置密码加密,自动化脚本登录密钥不设置密码加密(但需要在服务端限制其权限) -
成功生成密钥后,在对应路径下可以找到密钥文件
<key>和<key>.pub,分别对应私钥和公钥
-
-
将表示客户端身份的私钥添加到本地的ssh-agent统一管理:ssh-add <私钥>添加成功后,我们只需要在ssh-agent读取密钥文件时输入一次密码,而不需要在每次使用密钥登录时都输入密码更新:这里需要进一步说明一下,
ssh-add的密钥添加其实是一次性的,系统重启后ssh-agent并不会记忆之前添加过的密钥。之所以每次启动时ssh-agent都会自动添加先前的密钥(使用ssh-add -l查看ssh-agent当前已读取密钥),是因为ssh-agent启动时会自动读取~/.ssh目录下的密钥文件,该路径又是创建密钥的默认路径,所以就好像是通过ssh-add添加密钥后ssh-agent会保存记忆。-
密钥放置于默认路径
~/.ssh下(可以看到密钥被自动读取) -
密钥放置于自定义路径
~/.ssh/test_dir(可以看到密钥没有被读取)
我们可以通过在客户端配置文件
~/.ssh/config中添加AddKeysToAgent yes实现解锁加密密钥后,自动将其添加到ssh-agent。这样在本次启动中只需要解锁一次密钥文件,而不是每次建立连接都需要输入密码解锁。(当然重启后需要再次解锁) -
-
将用于验证客户端身份的公钥传输到服务端:
ssh-copy-id -i <公钥> <服务器用户名>@<服务器IP> -
通过密钥登录服务器
总结
在本篇笔记中,我们对 SSH 进行了简单的介绍,并一步步地分别实现了密码登录和密钥登录。自此,我们与服务器的交互也算是“有模有样”了。
但服务器作为应用运行的基础,安全是重中之重。而 SSH 登录安全又是服务器安全中非常重要的一环。
在下一篇笔记中,我们将对 SSH 安全配置进行简单的介绍,让我们的服务器更“强壮”一些:)