如何在 Linux 服务器上配置基于 SSH 密钥的身份验证

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。

如何在 Linux 服务器上配置基于 SSH 密钥的身份验证

介绍

SSH是一种加密协议,用于管理服务器并与服务器通信。虽然登录 SSH 服务器的方式有多种,下面我们将重点关注设置 SSH 密钥。

SSH 密钥提供了一种极其安全的登录服务器的方式。

SSH 密钥如何工作?

SSH 服务器可以使用多种不同的方法对客户端进行身份验证。其中最基本的是密码身份验证,它易于使用,但不是最安全的。

尽管密码以安全的方式发送到服务器,但它们通常不够复杂或不够长,不足以抵御重复、持续的攻击。现代处理能力与自动化脚本相结合,暴力破解受密码保护的帐户很常见。尽管还有其他方法可以增加额外的安全性(fail2ban等等),但 SSH 密钥被证明是一种可靠且安全的替代方案。

SSH 密钥对是两个加密安全密钥,可用于向 SSH 服务器验证客户端的身份。每个密钥对由公钥和私钥组成。

私钥由客户保留,并应绝对保密。对私钥的任何泄露都将允许攻击者登录到配置有关联公钥的服务器,而无需进行额外的身份验证。作为额外的预防措施,可以使用密码在磁盘上对密钥进行加密。

关联的公钥可以自由共享,不会产生任何负面后果。公钥可用于加密只有私钥才能解密的消息。该属性被用作使用密钥对进行身份验证的一种方式。

公钥已上传到我们希望能够使用 SSH 登录的远程服务器。该密钥被添加到我们将登录的用户帐户内的一个特殊文件中,如:~/.ssh/authorized_keys.

当客户端尝试使用 SSH 密钥进行身份验证时,服务器可以测试客户端是否拥有私钥。如果客户端可以证明它拥有私钥,则会生成 shell 会话或执行请求的命令。

第 1 步 — 创建 SSH 密钥

配置服务器的 SSH 密钥身份验证的第一步是在本地计算机上生成 SSH 密钥对。

为此,我们可以使用一个名为ssh-keygen 的特殊实用程序,它包含在标准 OpenSSH 工具套件中。默认情况下,这将创建 3072 位 RSA 密钥对。

在本地计算机上,通过键入以下内容生成 SSH 密钥对:

ssh-keygen
OutputGenerating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):

该实用程序将提示选择将生成的密钥的位置。默认情况下,密钥将存储在用户主目录中的~/.ssh目录中。私钥将被id_rsa调用,关联的公钥将被id_rsa.pub调用。

通常,在此阶段最好坚持使用默认位置。这样做将允许 SSH 客户端在尝试进行身份验证时自动找到 SSH 密钥。如果想选择非标准路径,请立即输入,否则,请按ENTER接受默认值。

如果之前已生成过 SSH 密钥,可能会看到如下所示的提示:

Output/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?

如果选择覆盖磁盘上的密钥,将无法再使用以前的密钥进行身份验证。选择“是”时要非常小心,因为这是一个无法逆转的破坏性过程。

OutputCreated directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

接下来,系统将提示输入密钥的密码。这是一个可选密码,可用于加密磁盘上的私钥文件。

既然要输密码了,那么为什么还要用SSH密钥?原因如下:

  • SSH 私钥(可以受密码保护的部分)永远不会在网络上公开。该密码仅用于解密本地计算机上的密钥。这意味着无法针对密码进行基于网络的暴力破解。
  • 私钥保存在受限制的目录中。SSH 客户端将无法识别未保存在受限目录中的私钥。密钥本身还必须具有受限权限(仅所有者可以读取和写入)。这意味着系统上的其他用户无法窥探。
  • 任何希望破解 SSH 私钥密码的攻击者都必须已经有权访问系统。这意味着他们已经有权访问用户帐户或根帐户。如果处于这种情况,密码可以防止攻击者立即登录我们的其他服务器。这样我们就有时间创建和实施新的 SSH 密钥对并删除受损密钥的访问权限。

由于私钥永远不会暴露于网络并通过文件权限进行保护,因此除自己(和根用户)之外的任何人都不应访问此文件。如果这些条件受到损害,密码可作为额外的保护层。

密码是可选的添加项。如果我们输入一个,则每次使用此密钥时都必须提供它(除非正在运行存储解密密钥的 SSH 代理软件)。这里建议使用密码,但如果不想设置密码,可以按ENTER绕过此提示。

OutputYour identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname
The key's randomart image is:
+---[RSA 3072]----+
|o   ..oo.++o ..  |
| o o +o.o.+...   |
|. . + oE.o.o  .  |
| . . oo.B+  .o   |
|  .   .=S.+ +    |
|      . o..*     |
|        .+= o    |
|        .=.+     |
|       .oo+      |
+----[SHA256]-----+

到这里我们已经拥有可用于进行身份验证的公钥和私钥。下一步是将公钥放在服务器上,以便可以使用 SSH 密钥身份验证登录。

第 2 步 — 将 SSH 公钥复制到服务器

有多种方法可以将公钥上传到远程 SSH 服务器。我们使用的方法很大程度上取决于可用的工具以及当前配置的详细信息。

以下方法都产生相同的最终结果。首先描述最简单、最自动化的方法,随后的方法都需要额外的手动步骤。

使用复制公钥ssh-copy-id

将公钥复制到现有服务器的最简单方法是使用名为ssh-copy-id 的实用程序。由于其简单性,如果可用,建议使用此方法。

ssh-copy-id工具包含在许多发行版的 OpenSSH 软件包中,因此本地系统上可能已提供该工具。要使此方法发挥作用,当前必须具有对服务器的基于密码的 SSH 访问权限。

要使用该实用程序,需要指定要连接的远程主机,以及具有基于密码的 SSH 访问权限的用户帐户。

输入:

ssh-copy-id username@remote_host

会看到这样的消息:

OutputThe authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

这意味着本地计算机无法识别远程主机。这将在第一次连接到新主机时发生。键入yes并按ENTER继续。

接下来,该实用程序将扫描本地帐户以查找我们之前创建的密钥。当它找到密钥时,它会提示输入远程用户帐户的密码:

Output/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
username@203.0.113.1's password:

输入密码(出于安全目的,输入内容不会显示)并按ENTER。该实用程序将使用提供的密码连接到远程主机上的帐户。然后,它会将密钥内容复制到远程帐户主目录中名为~/.ssh``authorized_keys~/.ssh/id_rsa.pub文件中。

我们将看到如下所示的输出:

OutputNumber of key(s) added: 1Now try logging into the machine, with:   "ssh 'username@203.0.113.1'"
and check to make sure that only the key(s) you wanted were added.

此时,id_rsa.pub密钥已上传到远程帐户。

使用 SSH 复制公钥

如果没有ssh-copy-id可用的帐户,但可以通过基于密码的 SSH 访问服务器上的帐户,则可以使用传统的 SSH 方法上传密钥。

我们可以通过在本地计算机上输出公共 SSH 密钥的内容并通过 SSH 连接将其传输到远程服务器来实现此目的。另一方面,我们可以确保该~/.ssh目录存在于我们正在使用的帐户下,然后将我们通过管道传输的内容输出到authorized_keys该目录中调用的文件中。

我们将使用>>重定向符号附加内容而不是覆盖它。这将使我们能够添加密钥而不会破坏之前添加的密钥。

完整的命令如下所示:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

可能会看到这样的消息:

OutputThe authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

这说明本地计算机无法识别远程主机。这将在第一次连接到新主机时发生。键入yes并按ENTER继续。

之后,系统将提示输入尝试连接的帐户的密码:

Outputusername@203.0.113.1's password:

输入密码后,密钥内容将被复制到远程用户帐户的文件id_rsa.pub末尾。

第 3 步 — 使用 SSH 密钥向服务器进行身份验证

如果已成功完成上述过程之一,则无需远程帐户密码即可登录远程主机。

登录就行,没啥说的:

ssh username@remote_host

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 开源扫雷游戏 JMine 发布介绍视频

Java 开源扫雷游戏 JMine 发布介绍视频 Java 开源扫雷游戏 JMine 是笔者开发的基于 Swing 的 Java 扫雷游戏,现已发布介绍视频。视频请见:https://www.bilibili.com/video/BV1Qe411m7qM/ JMine 比较重视的还原了微软的扫雷游戏。在算法设计中&#xff…

变量和对象的解构赋值

解构赋值是一种 JavaScript 语言特性,允许你将数组或对象的属性直接赋值给变量。这对于从函数返回多个值或初始化多个变量非常有用。 对象解构赋值: 当你有一个对象,你想将它的属性赋值给一些变量时,你可以使用解构赋值。例如&am…

JavaScript-运算符-笔记

1.算术运算符 加 -减 *乘法 /除法 乘方: ** a**6:a的6次方 --- a*a*a*a*a*a 取余: % 10%31 偶数: 能被2整除 和2取余等于0 奇数: 不能被2整除 和2取余不等于0 能被6整除(是6的倍数): 和6取余等于0 2.递增递减运算符 : 依次加1 -- : 依次减1 单独使…

【RockChip | RV1126】学习与开发

【RockChip | RV1126】学习与开发 文章目录 【RockChip | RV1126】学习与开发1. 资料1. 资料 您好,这是关于A191型RV1126的资料包,请您及时接收哦~链接: https://pan.baidu.com/s/1FXWVxa27Q78nI78d2QKlBQ?pwd=j7mk 提取码: j7mk 若您在开发过程中遇到技术问题,需要帮助时:…

3D Gaussian Splatting 训练自己的数据scene

目录 训练教程: 1 colmap安装: 2.1生成初始点云 2.2训练流程 读ColmapScene

基于OpenCV的图像翻转和镜像

我们将解释如何在Python中实现图像的镜像或翻转。大家只需要了解各种矩阵运算和矩阵操作背后的基本数学即可。 01. 依赖包要求 NumPy —用于矩阵运算并对其进行处理。 OpenCV —用于读取图像并将其转换为2D数组(矩阵)。 Matplotlib —用于将矩阵绘制为…

react setState调用为什么会触发整个组件函数的重新运行

react setState调用为什么会触发整个组件函数的重新运行例如下面的代码 function App(){const [age,setAge]useState(5);const clickHandler()>{setAge(5)}console.log("点击div时候&#xff0c;我也会被刷新")return (<div onClick{clickHandler}><di…

【LeetCode:228. 汇总区间 | 区间】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

分析抖音直播弹幕评论和礼物的websocket数据流信息,通过proto协议解析消息内容思路

现在定位到一个解析的大概位置&#xff1a; e.decode function(e, t) {e instanceof o || (e o.create(e));for (var n, i, s void 0 t ? e.len : e.pos t, u new r.webcast.im.MemberMessage(r.webcast. 通过请求找到发送请求的js代码位置&#xff0c;然后通过跟踪这…

【远程计算机,这可能是由于 Credssp 加客数据库修正】解决方案

1、winR打开运行窗口 输入gpedit.msc命令&#xff0c;若找不到&#xff0c;可以进行如下文件编辑格式为cmd echo offpushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txtdir /b C:\Win…

centos通过yum 安装nginx和基本操作

Yum安装Nginx 1、配置Centos 7 Nginx Yum源仓库(注意系统版本要匹配&#xff0c;此步根据环境来确认&#xff0c;不是必须的&#xff09; rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 2、安装Nginx yum install n…

宏基因组序列无参考基因组装工具idba-ud的介绍及详细使用方法

介绍 idba-ud工具是一种用于组装无参考基因组的工具&#xff0c;它可以将高通量测序数据转化为基因组序列。它是idba工具的升级版本&#xff0c;专门用于组装多样性的无参考基因组。 idba-ud的主要作用是通过组装测序数据&#xff0c;生成无参考基因组的序列。它能够处理短读…

C#中List<T>底层原理剖析

C#中List底层原理剖析 1. 基础用法2. List的Capacity与Count&#xff1a;3.List的底层原理3.1. 构造3.2 Add()接口3.3 Remove()接口3.4 Inster()接口3.5 Clear()接口3.6 Contains()接口3.7 ToArray()接口3.8 Find()接口3.8 Sort()接口 4. 总结5. 参考 1. 基础用法 list.Max() …

【tkinter 电子时钟 实现时间日期 可实现透明 无标题栏】

下面是一个使用tkinter实现的简单的电子时钟&#xff0c;包括时间和日期的显示。该窗口是透明的&#xff0c;没有标题栏。 效果&#xff1a; import tkinter as tk from datetime import datetimedef update_time():now datetime.now()time_label.configure(textnow.strftim…

CSS效果(工作中常用)

1、css文字溢出省略号 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略…

labelme的json转mask,实测有效

1、创建一个conda的虚拟环境 conda creat -n labelme python3.82、转到你的标注文件夹&#xff08;包括json和图片&#xff09; cd C:/Users/Administrator/Desktop/json3、你需要在标注文件夹下用txt写下以下代码&#xff0c;并保存bat文件。 放在最后一个就可以了 echo of…

JSON和AJAX

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种无需重新加载整个页面就能更新部分网页的技术。它使用JavaScript的XMLHttpRequest对象来发送异步请求&#xff0c;并获取服务器响应。AJAX可以用于在不刷新页面的情况下更新网页内容、与服务器交换数据并更新…

while猜数字实例——C++版

案例描述&#xff1a;系统随机生成一个1到100之间的数字&#xff0c;玩家进行猜测&#xff0c;如果猜错&#xff0c;提示玩家数字过大或过小&#xff0c;如果猜对恭喜玩家胜利并退出游戏。 逻辑框图&#xff1a; #include<bits/stdc.h> using namespace std; int main()…

如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码

最好的中文TTS项目Bert-vits2更新了中文特化分支&#xff0c;但可能由于时间仓促&#xff0c;代码中存在不少的bug&#xff0c;作为普通用户&#xff0c;有的时候也想为自己喜欢的开源项目做一点点贡献&#xff0c;帮助作者修改一些简单的bug&#xff0c;那么该如何开始&#x…

Vert.x学习笔记-什么是事件总线

广义事件总线介绍Vert.x的事件总线Vert.x的事件总线的实现方式Vert.x的事件总线通信模式事件总线与消息队列的区别点对点通信模式请求-应答通信模式发布-订阅通信模式 Vert.x的事件总线应用场景Vert.x的事件总线消息Vert.x的事件总线消息示例Vert.x的事件总线的消息类型 拓展 广…