日志
- 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密钥生成器来产生密钥对:
然后,点Generate
,输入一些随机的鼠标或键盘动作(这个特性个人还是蛮喜欢的,真的很随机了),它就会自动生成一个密钥对(这里我采用默认的RSA
算法):
完成后,你可以修改一下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用户。
此外,还要确保PubkeyAuthentication
的参数为yes
:
由于我们已经使用密钥登陆,更建议直接禁用口令登陆,可设置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为例):
在此基础上,打开一个新的窗口登陆。如果成功登陆,表明一切顺利,旧窗口也可以安心关闭了!登陆过程如下图所示,开头会出现Authentificating with public key XXX
的字样,这表明该SSH登陆过程依赖前面添加的公钥:
小结
类似方法可以推广到各种基于SSH登陆的场景(比如用vscode登陆),大家可以试试看!我个人觉得基于密钥的远程登陆是十分方便的。
值得一提的是,长期不用root密码有遗忘风险。如果你怕自己忘掉root密码,可以将它保存在bitwarden里面,日后万一需要用而不记得时可以看看。当然,前提是bitwarden的主密码不可以忘记!
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍