Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证

文章背景 openssh分为client端和server端,笔者新安装的Ubuntu 20.04.03 LTS Desktop系统,默认情况下仅安装了client,笔者想要安装server供远程主机访问,同时为了提高安全性,修改默认的22监听端口,并使用ED25519公钥算法进行登录验证。
文章目标

  1. 在纯净的Ubuntu系统中,安装ssh server;
  2. 将ssh服务默认的22端口,改为其他端口;
  3. 开启ubuntu自带的ufw(Uncomplicated FireWall),放行ssh server端口;
  4. 设置 SSH 通过 ED25519 公钥身份验证并禁止密码身份验证。
系统环境
OS Ubuntu 20.04.3 LTS Desktop 新安装的Ubuntu桌面系统
SSH OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
详细步骤 1. 安装启动ssh server
使用快捷键 ctrl+alt+T ,打开命令行界面,输入下面的命令,安装ssh server客户端。
sudo apt update sudo apt install openssh-server

安装完成后,ssh server已经自动启动了,可以用下面的命令查看ssh server的运行情况。
sudo systemctl status ssh

【Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证】笔者的服务器上输出了以下内容,这表示ssh server处于active(running)运行状态。
Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证
文章图片

2. 修改默认端口
ssh server的默认端口为22端口,我们可以在其配置文件 /etc/ssh/sshd_config 中(PS:ssh_config是ssh client的配置文件,sshd_config是ssh server的配置文件),对端口进行修改。
sudo vim /etc/ssh/sshd_config

文件内容如下,默认端口 #Port 22 ,我们输入我们想要的端口 Port 30022
Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证
文章图片

配置文件修改完成,重启ssh服务。
service ssh restart

看一看配置是不是生效了?
sudo systemctl status ssh

Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证
文章图片

sudo netstat -ntlp | grep ssh 1. -l或–listening 显示监控中的服务器的Socket 2. -t或–tcp 显示TCP传输协议的连线状况 3. -n或–numeric 直接使用IP地址,而不通过域名服务器 4. -p或–programs 显示正在使用Socket的程序识别码和程序名称

Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证
文章图片

3. 开放服务器防火墙端口
UFW(Uncomplicated FireWall)是Ubuntu系统上的默认防火墙。我们需要设置UFW放行第2步中的端口,这样远程服务器才可以访问。
首先,我们看看UFW的运行状态,这里建议如果ufw处于未激活状态,读者手动将其打开。
sudo ufw status sudo ufw enable

然后,我们需要放行ssh端口。
sudo ufw allow your-port

完成!再次查看ufw的防火墙规则,会发现端口已经成功放行了
sudo ufw status

Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证
文章图片

此时,我们已经可以使用ssh客户端在远程使用密码访问服务器了!
笔者使用免费的 教育版Xshell和Xftp 来访问服务器。
这里提供 教育版Xshell和Xftp 下载的方法,读者可以自行下载(需要提供邮箱,下载链接在邮箱中)。
读者可以使用自己习惯喜欢的ssh工具。
4. 设置使用密钥登陆ssh server
在第3步,我们通过用户和密码访问远程服务器。
事实上这是非常不安全的,即使我们在第2步中修改了默认的端口,也是不足够的。
不知道读者的系统用户名是什么,root 吗,哈哈哈。
不做任何安全措施,对我们的服务器来说,是非常危险的。
面临这样的问题,笔者选择使用密钥登陆访问ssh。
选择公钥身份验证而不是密码身份验证的最重要原因是为了阻止可能的暴力破解攻击。读者应该避免使用密码,因为密码是可预测的,而且不可避免的很脆弱。
密钥形式登录的原理是利用密钥生成器制作一对密钥——一个公钥和一个私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。
读者如果对具体细节感兴趣的话,可以了解 非对称公钥密码算法
SSH协议可以生成DSA、RSA、ECDSA和Ed25519密钥对。
笔者建议使用 RSA (ssh默认使用的公钥算法,经典算法,兼容性强,使用广泛)和 Ed25519 椭圆曲线算法(效率高,安全性高)中的一种。笔者实践中选择的是 Ed25519 算法。
我们在ssh server所在的服务器上,使用下面的命令生成一对Ed25519公私钥对。
ssh-keygen -a 256 -t ed25519 1. -a 256安全强度 2. -t 选择算法,dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa ,‘-sk’的两个算法请忽视,需要安全固件

Ubuntu|Ubuntu 20.04.3系统开启SSH Server,并通过私钥身份验证登陆(ED25519椭圆曲线),禁止密码身份验证
文章图片

上图中,程序提示我们是否在 /home/$USER/.ssh/id_ed25519 存储我们的密钥(私钥文件id_ed25519,公钥文件id_ed25519.pub),两次输入访问使用私钥的密码 passphrase ,成功则输出公钥(?)的 SHA256 fingerprint 和 randomart image 。
现在我们已经可以在 /home/$USER/.ssh/id_ed25519 看到两个密钥的文件。
执行下列命令,复制公钥文件,命名为 “authorized_keys” 。
cat /home/$USER/.ssh/id_ed25519.pub > /home/$USER/.ssh/authorized_keys

接下来我们需要设置下面几个文件的权限,以保证密钥安全和程序正确。
chmod 700 ~/.ssh chmod 400 ~/.ssh/id_ed25519 chmod 600 ~/.ssh/authorized_keys

妥善保存 id_ed25519私钥文件 ,默认配置情况下,我们已经可以在客户机使用私钥和私钥密码远程访问ssh server。
无论失败或者成功,我们都需要进入ssh server的配置文件,检查下面的三个相关配置。
sudo vim /etc/ssh/sshd_config

# 是否允许公钥身份验证,默认为yes #PubkeyAuthentication yes # 认证公钥文件,默认情况就是我们之前所做的那样 #AuthorizedKeysFile.ssh/authorized_keys .ssh/authorized_keys2 #是否允许密码身份验证,默认为yes,当我们使用密钥可以成功登陆后,改为no PasswordAuthentication no

此时我们已经可以使用私钥身份验证访问ssh server,并且禁止了脆弱的密码身份验证!!
致谢
  1. 如何在Ubuntu 20.04上启用SSH
  2. ssh配置文件ssh_config和sshd_config区别
  3. 启动、关闭和设置ubuntu防火墙 ufw 的使用
  4. 设置 SSH 通过密钥登录
  5. How to secure your SSH server with public key Ed25519 Elliptic Curve Cryptography
  6. Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
  7. Linux chown 命令
  8. Linux如何查看所有的用户和组信息

    推荐阅读