服务器SSH 公密钥登录
编辑服务器SSH 公密钥登录
当使用VS Code中的Rmeote-SSH插件登录远程服务器时候,登录服务器有两种选项,一种是通过用户名与密码登录,另外一种是通过利用服务器上的公钥与本地的私钥鉴权登录的形式,用户名与密码登录在切换文件夹的时候需要多次输入密码,较为繁琐,因此下面讲解密钥登录方式。
首先我们需要先了解一下私钥与公钥的概念。在终端生成公私钥一般使用 ssh-keygen
命令,其生成的密钥对对于每台电脑是唯一的。每次运行 ssh-keygen
都会生成一个新的密钥对,包括私钥(id_rsa
)和公钥(id_rsa.pub
)。这样做是为了确保每个设备都有唯一的身份认证。
私钥(Private Key)
私钥是一份保密的文件,应该严格保持在你的本地计算机上,并且不能分享给其他人。
它是用于对数据进行签名和解密的关键。默认情况下,私钥存储在用户的主目录下的 .ssh
文件夹中,通常命名为 id_rsa
。
公钥(Public Key)
公钥是与私钥匹配的公共部分,可以在安全地传输给其他人。可以将公钥添加到远程服务器上的 authorized_keys
文件中,以允许使用相应的私钥进行身份验证。公钥文件通常是私钥文件的同名文件,但扩展名为 .pub
,例如 id_rsa.pub
。公钥是用于验证由私钥签名的数据的关键。
密钥登录原理
当你尝试连接服务器时,SSH 客户端会使用本地私钥对服务器上的公钥加密后的随机数进行签名。这个签名被发送到服务器。服务器通过验证签名的有效性,来确认连接请求确实来自于拥有相应私钥的合法用户。
(1) 建立 SSH 连接
客户端发起连接: 客户端向服务器发起 SSH 连接请求。
服务器检查公钥::服务器根据用户的身份查找对应的 authorized_keys
文件,找到与客户端匹配的公钥。
生成随机挑战::服务器生成一个随机数(称为 challenge 或 nonce),并使用存储的公钥对这个随机数进行加密。
发送加密的挑战::服务器将加密后的随机挑战发送给客户端。
(2)客户端验证身份
解密挑战::客户端使用自己的私钥解密服务器发送的加密挑战。由于只有合法用户拥有私钥,成功解密证明了客户端的身份。
生成签名::客户端使用解密得到的挑战生成一个签名,并将该签名发送回服务器。
(3)服务器验证签名
验证签名::服务器使用公钥验证客户端发送的签名。签名验证成功,则说明客户端确实拥有对应的私钥。
建立信任::服务器允许用户访问,建立安全的 SSH 会话。
密钥生成流程
本地生成秘钥
以下是一般情况下使用 ssh-keygen
生成密钥对的步骤:
# 生成 SSH 密钥对
ssh-keygen -t rsa -b 4096 -C "[email protected]"
命令解释
-t rsa
指定生成 RSA 密钥对。-b 4096
指定密钥长度为 4096 位,提高了安全性。-C "[email protected]"
可以添加一些注释,一般用来标识密钥的用途。
ssh-keygen
命令的逐条选项的解释:Enter file in which to save the key (
/path/to/your/home/.ssh/id_rsa
):
默认情况下,密钥将保存在用户的主目录的.ssh
文件夹中,文件名为id_rsa
。如果你希望使用不同的文件名或路径,可以在此处输入。Enter passphrase (empty for no passphrase):
你可以为私钥设置密码(也称为密语或口令)。这样,每次你使用私钥时都需要提供这个密码。这提高了密钥的安全性。你可以选择留空,直接按 Enter,表示不设置密码。Enter same passphrase again:
如果你在上一步中设置了密码,这里需要再次输入相同的密码进行确认。
全部默认情况下,你将在 ~/.ssh/
目录下看到两个文件:id_rsa
(私钥)和 id_rsa.pub
(公钥)。
私钥需要保持机密,而公钥可以分享给需要验证你身份的地方,比如远程服务器。
可以通过系统自带的 cat
工具查看文件内容:(cat 全称为 concatenate),~
是用户主目录的简写。
# windows
cat ~\.ssh\id_rsa.pub
# macos linux
cat ~/.ssh/id_rsa.pub
服务器配置公钥
在本地的终端中,输入如下指令
cat ~/.ssh/id_rsa.pub | ssh your_user_name@your_remote_ip -p your_port "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
其中,需要将your_user_name
your_remote_ip
your_port
三个变量替换为自己主机的用户名,IP地址、与端口,用户名和端口一般默认为 root
和 22
。
这将把你的公钥追加到远程服务器上的 authorized_keys
文件中
VS Code 配置远程登录
在 Visual Studio Code 中使用 Remote-SSH 插件配置远程服务器的步骤如下:
安装 Remote-SSH 插件:
在 Visual Studio Code 中,打开 Extensions 视图,搜索并安装 "Remote - SSH" 插件。安装完成后,你需要重新启动 VS Code。
登录服务器有两种选项,一种是通过用户名与密码登录,另外一种是通过利用服务器上的公钥与本地的私钥鉴权登录的形式,用户名与密码登录在切换文件夹的时候需要多次输入密码,较为繁琐,因此下面演示第二种方式:
如果还没有将本地的公钥添加到远程服务器,需要参考上节文章操作内容将将本地生成的公钥(id_rsa.pub
文件的内容)添加到远程服务器的 ~/.ssh/authorized_keys
文件中。
配置 Remote-SSH:
- 在 Visual Studio Code 中,按下
Ctrl + Shift + P
打开命令面板。 - 输入 "Remote-SSH: Open Configuration File...",选择并编辑
ssh_config
文件。 - 在配置文件中添加类似以下的条目:
Host Server1
Hostname 172.16.0.1
User zhangsan
Port 22
ServerAliveInterval 180
IdentityFile ~/.ssh/secret_key.pem
Host
:服务器是名字为 Server1HostName
:远程 ssh 的 ip 信息User
是你的远程 ssh 的用户名Port
服务器监听端口号,默认端口为 22IdentityFile
本地密钥的地址
修改 ssh 默认端口
如果是公网服务器,建议修改 ssh 的默认端口,降低被攻击的风险。
vim /etc/ssh/sshd_config
找到 #Port 22
,默认是注释掉的,先把前面的 #号去掉 ,再插入一行设置成你想要的端口号,注意不要跟现有端口号重复
......
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
Port 22
Port 10022
.....
SSH默认监听端口是22,如果你不强制说明别的端口,”Port 22”注不注释都是开放22访问端口。上面我保留了22端口,防止之后因为各种权限和配置问题,导致连22端口都不能访问了,那就尴尬了。等一切都ok了,再关闭22端口。
增加了10022端口,大家修改端口时候最好挑10000~65535之间的端口号,10000以下容易被系统或一些特殊软件占用,或是以后新应用准备占用该端口的时候,却被你先占用了,导致软件无法运行。
重启 SSH 服务,最好也重启下服务器
systemctl restart sshd.service
# 或者执行下述指令
service sshd restart
如果服务器有 ufw 防火墙,记得要开放相关端口
# port为你设定的端口号
sudo ufw allow port
sudo ufw deny ssh
进阶
ssh config 设置跳板机
很多集群需要跳板机才可登录,我们需要先登录跳板机,再从跳板机登录内部机器。这会引入两个麻烦,一是登录要两次,如果配置 SSH config 还需要在跳板机也配置一份儿;二是拷贝文件十分麻烦,要拷贝两次。
在 SSH 配置中设置跳板机 (也称为堡垒机或跳转服务器), 需要使用 ProxyJump 指令。这里是一个基本的配置示例:
Host jumphost
HostName jump.example.com
User jumpuser
Port 22
IdentityFile ~/.ssh/jumphost_key
Host target
HostName target.internal.example.com
User targetuser
ProxyJump jumphost
这个配置做了以下几件事:
- 定义了跳板机
jumphost
- 定义了目标机器
target
- 使用
ProxyJump
指令指定通过jumphost
连接到target
使用这个配置, 您可以简单地运行 ssh target
来通过跳板机连接到目标机器。
还可以设置多级跳板:
Host target
HostName target.internal.example.com
User targetuser
ProxyJump jumphost1,jumphost2
这将通过 jumphost1 再到 jumphost2 最后到达 target。
堡垒机的作用:
参考文章
- 1
- 0
-
分享