关于是使用密钥登录远程ssh账户还是使用密码登录,网络上众说纷纭;支持密钥的一方主要理由是使用密钥安全性更高而且支持自动化操作;支持密码的一方,无论何时何地,只要记着密码就能登录服务器。
(图源 :pixabay)
我是倾向于使用密钥管理服务器的,但是很多时候我常用的几台服务器我又是使用密码来管理的,这做人做的还真有些拧巴。
今天先不去辩论两种方式的优越点,今天来详细整理一下如何使用密钥来登录远程账户。
为了便于测试,我在远程服务器上创建了新用户testuser1
,这名字很Nice吧?之后的操作都在本地主机完成。
生成公私钥对
使用密钥登录SSH,我们需要一组密钥对,其中公钥用于身份验证,而私钥用来进行加密。
在本地主机上,我们可以使用如下指令生成公私钥对:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
其中:
ssh-keygen
是用于生成密钥对的指令
-t rsa
表示使用RSA算法生成密钥对
-b 4096
指定生成密钥的位数为4096,位数越高安全性越好
-C "[email protected]"
注释部分,用来标识密钥
执行 ssh-keygen 命令后会被提示密钥的存储路径:
以及选择是否为密钥设置密码等操作:
(这个是保护私钥的密码,并非远程SSH账户密码哦)
之后成功生成了密钥对:
上传公钥至远程SSH账户
在使用密钥登录远程SSH账户之前,我们首先需要将公钥复制到(确切地说叫追加到)远程服务器的 ~/.ssh/authorized_keys 文件中。
Linux下可以使用如下指令:
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
执行后会提示如下信息:
输入远程主机的登录密码,公钥就会被成功安装至远程主机对应账户:
测试登录远程主机
添加完公钥以后,ssh-copy-id
已经提示我们去测试一下登录啦:
ssh '[email protected]'
那就复制指令,登录一下呗:
因为我们之前生成密钥对时为私钥设置了密码保护私钥,所以登录时要校验一下密码(双重安全防护)。
接下来就没啥悬念了,成功登录。
对指定账户设置规则
好,现在我们已经完成了使用密钥登录SSH账户的全过程,不用再输入繁琐的密码了(私钥保护密码可以弄个不太复杂的,毕竟是二重保护)。
但是问题来了,现在我既可以使用密钥登录,又可以使用密码登录,这貌似和我们避免密码登录的初衷不符啊。
那么如何禁用密码登录呢,一般来讲有两种策略:一是全局禁用密码登录;二是仅禁用相应用户的密码登录。
全局禁用密码登录和仅禁用相应用户的密码登录,都需要操作者有管理员的权限,然后编辑sshd_config文件:
sudo vi /etc/ssh/sshd_config
在文件末尾追加如下内容:
文字版(方便复制粘贴):
Match User testuser1
PasswordAuthentication no
ChallengeResponseAuthentication no
以上内容仅针对testuser1
如果你要针对所有用户禁用密码登录,则修改sshd_config
中对应条目的值,改成和上述值相同即可。
为了使设置生效,我们需要执行如下指令:
sudo systemctl restart ssh
这时我们再尝试使用非密钥登录,比如使用Putty从Windows下登录:
就会出现如下提示:
说明我们的设置生效啦。
多个密钥的问题
假设我们在本地Linux账户下使用多个密钥登录多台不同的服务器(咦,应该也可以用同一个密钥对),那么系统是如何识别该用哪个密钥呢?
一种方式是,我们可以手工指定要用的密钥:
ssh -i ~/.ssh/id_rsa_server1 [email protected]
如果不指定密钥,又会是什么样子呢?据我了解到的信息:
SSH 客户端默认会按照配置文件中或者默认密钥路径下的密钥进行尝试,直到找到一个能匹配目标服务器公钥的私钥为止。
当然,更优雅的方式是,在本地主机账户下的~/.ssh/config
为每个服务器指定相应的密钥文件:
Host server1
HostName server1.example.com
User user123
IdentityFile ~/.ssh/id_rsa_server1
Host server2
HostName server2.example.com
User user456
IdentityFile ~/.ssh/id_rsa_server2
好了,今天暂时就学习到这里了。
你学废了嘛?没学废的,改天我们继续学习!😀
学习的机会还是留给其他人吧,我觉得还是在抖音里看美女来的轻松。😂😂
哈哈,这样做是不对的
你得和你楼下的小影多学学
好的,关键她也没学会😂😂
感谢O哥的分享;
我好像没有学废🤣
感谢小影捧场
👍👍看到O写的,只是感觉O哥是神童
呵呵!好专业,我也不懂🫣
看来只能改天继续学了😅哈哈哈
改天继续学习吧!完全云里雾里!😂
云里雾里,我在塞尔维亚等你,哈
哈哈哈,好
下次再搞一个,如何新建
git
服务。不过感觉现在PuTTY
不怎么样了。如果简单点可以直接用powershell
进行登录。或者换成xshell
也好玩。不过说句实话,每次配置密钥,我感觉我都要现查,基本上记不住。
Windows命令行直接支持ssh
但是主机多的话,Putty可以保存主机地址之类的信息,还是要方便一点
好的 学废了 😂 下次继续学习
受教了(`・ω・´)ゞ
O哥,快去买HIVE
拉盘啊
学废了学废了!🤣🤣
O哥太优瘦啦!O哥课堂优雅又有趣!我这学渣学的好惭愧啊!🤦🏻♀️
pls can someone help me out on what’s going on here, are you guys Programming??
I think this tutorial can be useful but why when you all post used linux comands decided to mention putty for windows?
Also if to talk about future posts maybe it'll be useful to know how to allow entrance for server with specified port and block other ports.
And yes I understand that it can become endless series of post about servers, security e.t.c.