如何使用SSH密钥验证提升服务器安全性及操作效率
如何使用SSH密钥验证提升服务器安全性及操作效率
SSH密钥验证是一种基于非对称加密算法的验证方式,相比传统的密码验证方式,具有更高的安全性且免去了记忆复杂密码的烦恼。本文将详细介绍如何使用SSH密钥验证提升服务器安全性及操作效率。
一、理论基础
1.为什么要看本文
你是否见过别人无需输入密码,仅需一行命令就能轻松连接到服务器?本文将为你揭秘这一过程的具体细节,无论你是使用Windows、Mac还是Linux操作系统,通过本文的学习,你也能实现同样的便捷操作。
2.为什么要用密钥验证
在网络连接中,安全性是至关重要的一环。传统的密码验证方式虽然简单易用,但存在着被暴力破解或被盗用的风险。为了提高服务器的安全性,密钥验证成为了一种更为可靠的选择。
3.密码验证与密钥验证的区别
在传统的密码验证中,用户需要输入用户名和密码才能登录到服务器。这种方式存在着密码被盗用的风险,尤其是在使用弱密码或者在不安全的网络环境下。而密钥验证则是一种基于非对称加密算法的验证方式,用户需要生成一对密钥,其中一个是私钥(Private Key),另一个是公钥(Public Key)。私钥保存在客户端,而公钥则被上传到服务器端。当用户尝试连接到服务器时,服务器会要求客户端提供对应的私钥,如果私钥匹配服务器端存储的公钥,则验证通过,用户可以登录到服务器。
相比密码验证,密钥验证具有以下优势:
- 更高的安全性:私钥存储在客户端,不会在网络上传输,减少了密码被盗用的风险。
- 免去密码记忆的烦恼:用户无需记忆复杂的密码,只需保存好私钥即可。
二、具体操作
使用密钥进行验证登录主要包括三个步骤:
- 生成密钥对(包括公钥和私钥)
- 在服务器端进行配置,允许密钥认证方式并且配置好相关的授权列表
- 确保服务器的公钥和客户端使用的私钥是匹配的,使用SSH命令进行登录
1.生成密钥对
1.1抉择:客户端生成?OR服务器生成?
生成密钥对的时候,可以在客户端进行生成,也可以在服务器上进行生成,这取决于你的具体需求:
- 如果你有一台个人PC,但是你有多个Linux服务器,你希望生成一个密钥对之后,就可以访问所有的服务器,那么你就在个人PC上进行密钥对的生成。
- 如果你有一台Linux服务器,但是需要多个客户终端去连这个服务器,那么你就在这台Linux服务器上生成密钥对。
- 如果不属于以上两种情况,你可以随意选择一种方式。
1.2执行生成密钥对
在命令窗口执行以下命令:
ssh-keygen
执行完以上代码之后,会出现提示,没有特殊要求的话,直接一路回车,然后就生成结束了。如果有特殊要求,可以参考以下选项:
-t
:指定要生成的密钥类型,如rsa、dsa、ecdsa、ed25519等。-b
:指定生成密钥的位数,通常用于RSA密钥,如-b 2048。-C
:在生成密钥时添加注释,可用于识别密钥的用途或所有者。-f
:指定生成密钥的文件路径和名称。-N
:设置用于保护私钥的密码,可以为空。-q
:静默模式,减少输出信息。-y
:从私钥中提取公钥并打印到标准输出。-h
:显示命令的使用帮助信息。
这些选项可以根据需要组合使用,以生成符合特定需求的密钥对。
1.3生成的密钥对位置
生成的密钥对默认存储在以下路径:
- Windows电脑对应的路径为:
C:\Users\你的用户名\.ssh
- MAC/Linux对应的路径为:
~/.ssh
生成的密钥对有两个文件:id_rsa
(私钥文件)和 id_rsa.pub
(公钥文件)
至此,第一步已经成功完成了,接下来进行第二步配置。
2.在服务器端进行配置
此时需要做两件事情:
- 确保公钥内容在
~/.ssh/authorized_key
文件中(如果没有这个文件,请手动创建) - 确保服务器端打开了允许通过密钥验证的方式登录
2.1服务端的authorized_key
(授权列表)文件配置
2.1.1 本地PC生成密钥对的小伙伴:
将本地生成的公钥上传到服务器中可以通过多种方式实现,以下是其中两种常用的方法:
方法一:使用 SSH 拷贝公钥到远程服务器(适用于Mac、Linux电脑)
使用以下命令将本地公钥复制到远程服务器:
ssh-copy-id username@remote_host
其中
username
是你在远程服务器上的用户名,remote_host
是远程服务器的地址或主机名。系统会要求你输入密码,然后将公钥自动添加到远程服务器的~/.ssh/authorized_keys
文件中。如果你的服务器端口不是默认的 22 端口,可以使用
-p
参数指定端口号:ssh-copy-id -p port_number username@remote_host
方法二:手动上传公钥到服务器(适用于Windows、Mac及Linux电脑)
首先使用
scp
命令将本地公钥复制到远程服务器,例如:scp ~/.ssh/id_rsa.pub username@remote_host:~/temp_key.pub
这将把本地公钥文件
id_rsa.pub
复制到远程服务器的~/temp_key.pub
文件中。登录到远程服务器,并将公钥内容追加到
~/.ssh/authorized_keys
文件中:ssh username@remote_host cat ~/temp_key.pub >> ~/.ssh/authorized_keys rm ~/temp_key.pub # 可选:删除临时公钥文件
2.1.2 服务器生成密钥对的小伙伴:
首先,在服务器的授权列表,将生成的公钥内容放进去。具体步骤如下:
- 先忍耐一下,通过以往密码的方式登录到你的服务器。
- 将服务端生成的公钥内容添加到
~/.ssh/authorized_keys
文件中:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 修改
authorized_keys
文件的权限:chmod 600 ~/.ssh/authorized_keys
其次,将服务器生成的私钥文件复制到你的本地电脑,用于之后的密钥验证登录。你可以使用以下方法将服务器上的私钥文件复制到本地:
Windows:
- 使用SCP命令进行复制:
将scp username@server_address:~/.ssh/id_rsa .
username
替换为你在服务器上的用户名,server_address
替换为你的服务器地址,~/.ssh/id_rsa
为默认的私钥文件存放的地址,如果你的路径不一样,请进行替换。.
为本地计算机上要保存私钥文件的路径,这里为当前目录。
macOS:
- 使用SCP命令:
将scp username@server_address:/path/to/private_key /local/path/to/save
username
替换为你在服务器上的用户名,server_address
替换为你的服务器地址,/path/to/private_key
替换为服务器上私钥文件的路径,/local/path/to/save
替换为本地计算机上要保存私钥文件的路径。
- 使用SCP命令进行复制:
2.2 服务端允许通过密钥方式登录的配置确认
确认服务器端已经开启了允许密钥登录方式的配置可以通过以下步骤:
登录到服务器:首先,通过用户名和密码登录到服务器。
检查SSH配置文件:使用文本编辑器(如nano或vim)打开SSH配置文件。在大多数Linux系统中,SSH配置文件位于
/etc/ssh/sshd_config
。查找密钥登录配置:在配置文件中查找以下行:
PubkeyAuthentication yes
如果这一行存在,并且值为
yes
,则表示已经允许使用密钥登录。如果值为no
,需要手动改为yes
。注意:
PasswordAuthentication yes
这个配置项是控制是否允许使用密码登录的,值是
yes
代表允许密码登录,如果改为no
,则无法再通过密码的方式进行登录。切记:用密钥登录的方式没有调通之前,千万不要关闭密码登录,否则你将会把自己困住,再也进不去服务器。重启SSH服务:如果你对配置文件进行了更改,则必须重启SSH服务才可以使更改生效。可以使用以下命令来重启SSH服务:
sudo systemctl restart sshd
至此,第二步的工作也搞定了,成功就在眼前了,让我们一鼓作气完成!
3.使用SSH命令指定私钥登录服务器
3.1 用SSH指定私钥的方式登录到服务器
现在,我们本地已经有私钥文件了,直接验证一波使用密钥验证登录到服务器,看是否可以:
ssh -i /path/to/private_key username@server_ip
这个命令是用于通过SSH连接到远程服务器的命令,下面解释一下其中的各个部分:
ssh
:这是命令本身,表示要使用SSH协议进行连接。-i /path/to/private_key
:这是SSH选项-i
,用于指定私钥文件的路径。私钥文件是用于密钥身份验证的一部分,它与公钥文件成对生成,通常存储在本地计算机上。在这个命令中,/path/to/private_key
应该被替换为你实际私钥文件的路径。这个私钥文件必须匹配在服务器上为相应用户配置的公钥。username@server_ip
:这是你要连接的远程服务器的用户名和IP地址或域名。username
是你在远程服务器上的用户名,server_ip
是服务器的IP地址或域名。通过这个部分,SSH知道要连接哪个远程服务器,并且使用提供的用户名进行登录。
所以,整个命令的含义是:使用指定的私钥文件连接到远程服务器,以提供的用户名进行登录。这个命令适用于基于密钥的身份验证,私钥文件是用于验证你的身份,并且必须与服务器上对应用户的公钥匹配。
3.2 用SSH默认私钥的方式登录到服务器
ssh username@server_ip
这种情况就是不加-i
参数,SSH 将默认使用用户的默认私钥文件进行连接。通常情况下,这个默认私钥文件位于用户的家目录下的.ssh
文件夹中,文件名为id_rsa
。
3.3 用更优雅的命令方式进行SSH登录到服务器
秘籍就是.ssh
目录下的config
文件,这就是想优雅的比较关键的一点。.ssh
目录下的config
文件是 SSH 客户端的配置文件,它可以包含一系列主机配置选项,以及对每个主机的自定义配置。这个文件允许你在连接到远程主机时自定义一些参数,从而简化 SSH 连接过程并提高灵活性。
以下是一些常见的用法:
指定主机别名:你可以为远程主机设置别名,这样你就不必每次都输入完整的主机名。例如:
Host myserver HostName server_ip User username
这样,你只需要使用
ssh myserver
就可以连接到server_ip
,并以username
用户身份登录。指定身份验证方法:你可以在
config
文件中指定要使用的身份验证方法,如使用特定的私钥文件或密码。例如:Host myserver HostName server_ip User username IdentityFile /path/to/private_key
这样,你就可以在连接到
myserver
时自动使用指定的私钥文件进行身份验证。端口转发和代理:你可以配置端口转发和代理,以便在 SSH 连接时自动设置端口转发或使用代理。例如:
Host myserver HostName server_ip User username LocalForward 8080 localhost:80 ProxyJump jumpserver
这样,当连接到
myserver
时,会自动设置本地端口8080
到远程主机localhost
的80
端口的转发,并且通过jumpserver
进行代理跳转。
通过使用config
文件,你可以方便地管理多个主机的连接参数,并且可以自定义各种连接选项,使 SSH 连接更加灵活和高效。
3.4 极致的优雅!借助别名(alias)让命令更短!
在大多数情况下,为了保持命令的清晰性和可读性,缩短别名到单个字母可能会导致理解上的困难,并且可能与其他系统命令发生冲突。不过,如果你仍然希望缩短命令,可以尝试以下方法:
在 macOS 和 Linux 上:
你可以在用户的~/.bashrc
或~/.bash_profile
文件中添加别名定义。例如:
alias a='ssh myserver'
保存文件后,重新启动终端或者执行source ~/.bashrc
或source ~/.bash_profile
来使更改生效。
在 Windows 上:
在 Windows 上,你可以在 PowerShell 或者命令提示符中使用doskey
命令来创建别名。例如:
doskey a=ssh myserver
已经要记得,改完这些配置文件后,需要重新加载才可以生效!!!不然不管用!!!
3.5 注意事项:
- 在使用单个字母的别名时要特别小心,确保不会与其他系统命令冲突。
- 确保别名的清晰和易懂,避免造成混淆和误解。
无论你选择哪种方法,都请谨慎操作,以确保不会产生意外的后果。
如此一来,只需要在命令行执行a
,就可以直接通过密钥验证的方式链接到你的服务器了。
三、总结
在本文中,我们首先明确了阅读的动机——追求更高的效率和安全性。然后,我们深入探讨了为什么要采用密钥验证而不是传统的密码验证,指出了密钥验证的更高安全性和难以被攻破的优势,以及密码验证与密钥验证的区别。
具体操作方面,我们从生成密钥对开始,探讨了在客户端还是服务器端进行生成的抉择,然后详细介绍了如何执行生成密钥对,并简要解释了生成的密钥对的样式。接着,在服务器端进行配置方面,我们介绍了配置服务端的authorized_key
文件,针对本地PC生成密钥对和服务器生成密钥对的小伙伴分别提供了配置指南。然后,我们确认了服务端允许通过密钥方式登录的配置,确保安全登录。接下来,我们详细介绍了使用SSH命令指定私钥登录服务器的几种方式,包括指定私钥的方式、默认私钥的方式以及更优雅的命令方式。最后,我们分享了一个极致优雅的技巧——借助别名(alias),让命令更加简短,提高操作效率。
通过本文的学习,读者不仅能够理解密钥验证的原理和优势,还可以掌握实际操作中生成密钥对、配置服务器端和登录服务器的方法,从而提升系统安全性,并在操作中实现更高的效率和便利。