Linux基础 基于密钥对的SSH远程登陆
本文最后更新于 123 天前,如有失效请评论区留言。

本博客由ZGOCLOUD大力赞助!如何更快地访问本站?有需要可加电报群获得更多帮助。本博客用什么VPS?创作不易,请支持苯苯!推荐购买本博客的VIP喔,10元/年即可畅享所有VIP专属内容!

日志

  • 2023-03-30:优化远程公钥登陆相关的SSH设置,即需要PasswordAuthentication no

前言

OpenWrt系统一般不适用此教程。如果您使用OpenWrt,请参考:《NAS系列 在PVE中搭建OpenWrt虚拟机

在前面的教程中,我曾建议小伙伴少用root用户——主要原因是我们还处于初学者阶段,用普通用户可以避免很多破坏性操作。不过,随着你对Linux系统的日益熟悉,直接使用root用户也许更加方便。毕竟,对于大多数小伙伴而言,VPS只有一个用户——那就是自己。

我平时使用VPS或NAS时也喜欢使用root用户。在《Linux基础 个人VPS安全》一章里,我也介绍过一些VPS安全措施,其中提到root用户名不可更改所带来的一些安全隐患。比如,如果你开放root用户登陆,很可能会成为别人攻击的对象(一般是暴力破解);但如果像以前介绍的方法(普通用户登陆后切换至root用户),一来输入密码略为麻烦;二来像MobaXterm之类的软件无法正常在root用户环境下使用sftp(因为初始登陆帐户为非root用户)。

因此,我在这里补充一些实用经验——基于密钥对的SSH登陆。这样,小伙伴可以在使用root用户时兼顾安全性和便利性喔!

基本原理

一般情况下,我们登陆VPS时需要正确地输入密码。不过,正如我在《Linux基础 实用Linux命令一览表》和《Linux基础 个人VPS安全》所提到的那样,“密钥登陆”对使用root用户的小伙伴来说也许是一种更理想的选择

简单来说,利用非对称加密算法(往往可以通过MobaXterm或系统自带的openssh工具生成),我们可以获得一个密钥对,分别是“公钥”和“私钥”。“公钥”是一段可以公开的信息(字符串),你可以给任何人看(包括你即将登陆的VPS);而“私钥”是要自己好好保管的,因为它具有对公钥加密信息的解密能力,即对该加密信息的所有权的宣称。

假设某访客发起了ssh登陆的请求(ip地址、端口号、用户名均正确),此时VPS会利用之前保存的公钥加密一个信息并返回给访客。这个公钥加密后信息在互联网传播的过程是公开的,所有的有心人都可以接收该信息;但只有成功解密该信息并将正确值返回给VPS,才算完成“握手”并成功登陆。由于非对称性加密的基本原理和特性(基于某些哈希算法),只有那些拥有私钥的用户可以快速解密并返回正确信息;没有私钥的用户理论上不可能快速求解。

原理基本上是这样,可能不完全正确,哈哈 (~ ̄▽ ̄)~ 感兴趣的话自己Google了解吧,这里我们主要关心如何使用密钥对登陆VPS。下面我会用MobaXterm来演示生成密钥和基于密钥的远程登陆。

生成密钥

除了《Linux基础 实用Linux命令一览表》里“SSH之VPS相互信任”里的ssh-keygen命令生成密钥对外,我们可以方便地利用MobaXterm自带的SSH密钥生成器来产生密钥对:

vNLxtMje74

然后,点Generate,输入一些随机的鼠标或键盘动作(这个特性个人还是蛮喜欢的,真的很随机了),它就会自动生成一个密钥对(这里我采用默认的RSA算法):

NVIDIA_Share_GADfJ2PDNP

完成后,你可以修改一下Key comment;比如我修改成测试用密钥。下面还有一个Key passphrase,即是否需要用密码才可以生成该公钥;个人觉得家里使用就不用加了,毕竟多数人就是不想用密码才使用密钥对的(如果搞多一个passphrase,就要多记一个字符串;当然你也可以用bitwarden来记住这个字符串)。你也可以将Key passphrase设置为一些方便记忆的文字,比如vps01,来表明某个公钥只在你的某个VPS里用(比如VPS-01)。这些技巧和习惯就没有什么特别的推荐,自己决定吧!

最后,点击Save private key,将私钥保存好。它是一个有.ppk后缀的文件。建议你在bitwarden里备份一下该私钥bitwarden支持上传附件),以防未来丢失;对于多设备用户的小伙伴来说, bitwarden也是一个安全复制/转移私钥的方式。

如果你日后要使用该私钥生成公钥,只需要打开这里,点击Load加载你的私钥,就会自动生成公钥了(如果你设置了Key passphrase,应该还需要你输入Key passphrase以确定你拥有权限使用该私钥)。

远程公钥

我们已经获得了一个密钥对。根据前面介绍的原理,我们还需要将该公钥上传到待访问的VPS里。下面我们以root用户为例演示公钥的添加。

首先,按常规的方法登陆VPS,并切换至root用户,进入root的.ssh文件夹:

cd ~/.ssh

如果没有这个文件夹,可创建之后再进入:

mkdir -p ~/.ssh && cd ~/.ssh

然后,用Vim编辑器等方法打开authorized_keys文件(如果没有该文件就创建一个),加入你刚刚生成的公钥,比如:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAkIwosM2U9LGhC8CmvzU60iaab30ld+hKrb+DIZ23RaetSJZeHjs+WEQtTa/7CiOlGQhfhSv3PHsSb7owfKJKawbcFHOtivCogHvigFG3mbfgO6J9uTjyV44/fqRDfi1JsAEP35q57ZbjI9lFCw4D/xFRRPTCKI6bXIFBwKFWNDOc29RdR2rWcpmyTaldCU63ICa2YZCA2DwnoIeVwLJp7CNtF2Bm7zweoMEwNL7lyT02rB1hUVBpr+vEfSWmnJMvAmt/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahv+/prVZuipFgC1aQnQ== 测试用密钥

你也可以添加备注,备注符是#。比如:

# 这是一个测试用的公钥。巴拉巴拉。
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAkIwosM2U9LGhC8CmvzU60iaab30ld+hKrb+DIZ23RaetSJZeHjs+WEQtTa/7CiOlGQhfhSv3PHsSb7owfKJKawbcFHOtivCogHvigFG3mbfgO6J9uTjyV44/fqRDfi1JsAEP35q57ZbjI9lFCw4D/xFRRPTCKI6bXIFBwKFWNDOc29RdR2rWcpmyTaldCU63ICa2YZCA2DwnoIeVwLJp7CNtF2Bm7zweoMEwNL7lyT02rB1hUVBpr+vEfSWmnJMvAmt/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahv+/prVZuipFgC1aQnQ== 测试用密钥

保存authorized_keys文件的更动。

接着,我们要重新设置一下root登陆的模式:

sudo vim /etc/ssh/sshd_config

PermitRootLogin有yes, no和without-password三种模式。我们将PermitRootLogin的参数改为without-password——表明只可以用密钥而不能用密码来登陆该VPS的root用户。

NVIDIA_Share_BRpEZrZ8He

此外,还要确保PubkeyAuthentication的参数为yes

msedge_ZgWOnMOcRT

由于我们已经使用密钥登陆,更建议直接禁用口令登陆,可设置PasswordAuthentication参数:

PasswordAuthentication no # 禁止口令登陆。但某些系统还是要设为yes才可以正常工作。

小结一下,要做到最佳保护效果,SSH设置相关参数和值为:

PermitRootLogin without-password # root用户仅适用
PubkeyAuthentication yes # 允许公钥验证
PasswordAuthentication no # 禁止口令登陆。但某些系统还是要设为yes才可以正常工作。

保存好配置后,重启sshd服务生效:

sudo service sshd restart

此时不要关闭该Shell所在窗口!此时不要关闭该Shell所在窗口!此时不要关闭该Shell所在窗口!

密钥登陆

下面我们改动一下登陆设置。在此之前,Mobaxterm登陆时在设置窗口是不需要输入密码的,只需要在登陆的shell窗口输入密码;这种做法可以保证密码的安全性。某些Shell工具可能是明文密码,这时你可以不需要密码。然后找到可以使用密钥的地方(以MobaXterm为例):

NVIDIA_Share_aXDyflbcvc

在此基础上,打开一个新的窗口登陆。如果成功登陆,表明一切顺利,旧窗口也可以安心关闭了!登陆过程如下图所示,开头会出现Authentificating with public key XXX的字样,这表明该SSH登陆过程依赖前面添加的公钥:

MobaXterm1_CHS_pq3CdcCnz8

小结

类似方法可以推广到各种基于SSH登陆的场景(比如用vscode登陆),大家可以试试看!我个人觉得基于密钥的远程登陆是十分方便的。

值得一提的是,长期不用root密码有遗忘风险。如果你怕自己忘掉root密码,可以将它保存在bitwarden里面,日后万一需要用而不记得时可以看看。当然,前提是bitwarden的主密码不可以忘记!

---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍

感谢ZGOCLOUD友情赞助 (ฅ´ω`ฅ) 本博客基于m2w创作。版权声明:除特殊说明,博客文章均为Bensz原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。VIP内容严禁转载!由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如有需要,请至学习地图系统学习本博客的教程。加Telegram群可获得更多帮助喔! | 博客订阅:RSS | 广告招租请留言 | 博客VPS | 致谢渺软公益CDN |
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇