linux关于ssh免密登录、known_hosts文件

news2024/9/22 15:51:24

1. 关于ssh

SSH 是 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是目前广泛采用的安全登录协议,专为远程登录会话和其他网络服务提供安全性的协议,替代以前不安全的Telnet协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

scp、sftp等都是基于ssh协议来进行远程传输的。

2. 对称加密和非对称加密

  • 对称加密:例如AES,加密和解密使用同一个密钥,不安全,如果密钥丢失,加密的信息就会被窃取,并且可以篡改信息,重新加密;对于接收方来说,并不知道这串加密的信息是受信任的发来的还是黑客伪造的。

  • 非对称加密:例如RSA,加密和解密使用不同的密钥,存在一对密钥对,公钥和私钥,公钥可以发送给别人,私钥需要自己保存。常用的公钥加密,私钥解密,例如:小明要发送消息给小红,小红把自己的公钥给小明,小明利用小红的公钥加密发送给小红,小红再使用自己的私钥进行解密。即使小红的公钥被窃取,黑客没有小红的私钥也解密不了信息。

3. ssh免密登录原理

服务器A要免密登录服务器B,则要把服务器A的公钥存到服务器B的授权公钥文件中;先在服务器A上生成一对秘钥(ssh-keygen),然后将公钥拷贝到服务器B的authorized_keys文件中。

原理:

  • 服务器A向服务器B发送一个连接请求,信息包括服务器A此时登录的用户名、服务器A的ip以及要免密登录的服务器B的用户名;
  • 服务器B收到请求,会从服务器A要免密登录服务器B的用户名家目录下 authorized_keys 中查找是否有相同的服务器A用户名、服务器Aip;
  • 如果有,服务器B会随机生成一个字符串,然后使用服务器A的公钥进行加密,再发送给服务器A;
  • 服务器A接到服务器B发来的信息后,会使用私钥进行解密,然后将解密后的字符串发送给服务器B;
  • 服务器B接到服务器A发来的信息后,会和之前生成的字符串进行比对,如果一致,则允许免密登录。

4. ssh免密登录配置

在进行配置之前需要先关闭防火墙,并且最好给服务器设置主机名,并配置 /etc/hosts 文件映射。

systemctl status firewalld.service # 查看防火墙状态
systemctl stop firewalld.service # 关闭防火墙
systemctl disable firewalld.service # 移除防火墙开机自启动

步骤:

  1. 假设A服务器需要免密登录B服务器,那么在A服务器执行命令:ssh-keygen -t rsa(默认就是RSA加密算法,可不用加-t rsa);密钥对生成过程会提示输入私钥加密密码,可以直接回车不使用密码保护。命令执行完成后会在~/.ssh目录下生成两个文件:id_rsa(私钥)和id_rsa.pub(公钥)
  2. 将公钥文件id_rsa.pub中的内容拷贝到B服务器的~/.ssh目录下的授权公钥文件authorized_keys中

5. ssh免密登录注意事项

首先,假设A服务器要免密登录B服务器,我们将A服务器通过ssh-keygen命令生成的公钥写进B服务器authorized_keys文件中。涉及以下注意事项:

A服务器生成的公钥如下:root@sangfor-node7 代表这是root用户生成的公钥

请添加图片描述

如果我们将其拷贝到B服务器/root/.ssh/authorized_keys文件中,那么A服务器就能以B服务器的root账号免密登录成功,也就是:ssh root@B服务器 可以免密登录成功;但是如果是以B服务器的其它账号进行登录,则无法免密,例如:ssh admin@B服务器 需要输入admin账号的密码才可以登录。

如果我们希望A服务器也能以B服务器的admin账号免密登录成功,那么还需要将A服务器的公钥拷贝到B服务器:/home/admin/.ssh/authorized_keys文件中(即admin用户的家目录下)。

另外,A服务器生成的公钥文件中包含 root@sangfor-node7 代表这是root用户生成的公钥;如果A服务器是以root账号去执行命令:ssh root@B服务器 可以免密登录成功;但是如果A服务器是以其它账号,例如wyf,去执行命令:ssh root@B服务器 则需要输入密码;因为B服务器/root/.ssh/authorized_keys文件中存储的是A服务器root用户的公钥,如果我们希望A服务器以wyf账号登录去执行命令:ssh root@B服务器 也可以免密登录成功;那么需要在A服务器切换成wyf账号,执行 ssh-keygen,那么生成的公钥文件位于 /home/wyf/.ssh/ 目录下,并且包含 wyf@sangfor-node7 ,代表这是wyf用户的公钥。再把这个公钥写入B服务器authorized_keys文件中即可。

如下:

请添加图片描述
请添加图片描述

最后,还需要注意域名问题,由于A服务器配置了主机名为 sangfor-node7,因此生成的公钥文件包含主机名,如:root@sangfor-node7,但是B服务器并不知道这个主机名代表哪个ip地址,因此需要在B服务器的 /etc/hosts 文件中配置 sangfor-node7 主机名和ip的映射。

6. github配置本机ssh公钥步骤及原理

如果我们要把本地代码以ssh方式push到github上,为避免每次push都需要输入github账号和密码,则需要配置本机免密登录github,免密登录原理和A服务器免密登录B服务器一样。

配置步骤参考文档:https://blog.csdn.net/wenfu814/article/details/120625844

7. known_hosts文件

A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告,并且需要用户交互式的输入yes/no, 避免受到DNS Hijack之类的攻击;如果公钥相同,则不会发出警告。

例如:
A服务器首次ssh登录B服务器,由于A服务器的known_hosts文件中没有B服务器的公钥,因此控制台会发出警告,并且需要用户输入yes/no

请添加图片描述

当我们输入yes之后,A服务器的known_hosts文件会增加一条记录(B服务器的公钥);再输入B服务器的密码,ssh登录成功

请添加图片描述

当A服务器再次ssh登录B服务器,B依然会传递给A一个公钥,OpenSSH会核对公钥,将该公钥和A服务器known_hosts文件保存的B服务器的公钥进行对比,由于相同,则不会发出警告,直接让用户输入密码

请添加图片描述

如果我们不希望在进行ssh登录时进行公钥检查,可以加上 "StrictHostKeyChecking no" 跳过公钥检查,就不需要用户手动输入yes/no(这在一些自动化场景经常使用到)

请添加图片描述

备注:如果A通过ssh登陆B时提示 Host key verification failed.;原因是A的known_hosts文件中记录的B的公钥1与连接时B传过来的公钥2不匹配。
解决方法:删除A的known_hosts文件中记录的B的公钥,当再次ssh登录B时,重新写入B服务器最新的公钥即可。

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

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

相关文章

springboot车辆管理系统的设计与实现毕业社会源码031034

车辆管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中&…

java常量定义在interface和final class的区别?

问题现象: java常量定义在 interface 和 final class 的区别? 问题分析: 最近在项目开发规范中,发现有要求使用 interface类 来定义常量! 这让我想起来以前一直是用 final class 来定义常量的;那么这两者是…

【Eigen】Eigen库基础语法

这里是Eigen库的一些基础语法&#xff0c;摘自《视觉SLAM十四讲》&#xff0c;修改了书中代码的一些bug&#xff0c;部分地方添加了一些自己的理解。 头文件相关 #include <Eigen/Core> // Eigen 核心部分 #include <Eigen/Dense> // 稠密矩阵的代数运算&#xff…

Java - 通过反射进行赋值以及函数调用

Java - 通过反射进行赋值以及函数调用前言一. 通过反射进行赋值1.1 测试1.2 总结二. 通过反射进行函数调用前言 说来惭愧&#xff0c;虽然反射在Java中是非常重要和常见的一种机制。但是&#xff0c;每当自己去写这方面的代码的时候&#xff0c;总是容易愣住。还得想一想代码怎…

题库API搭建接口

题库API搭建接口 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.cn/ 题库后台…

社招前端vue面试题汇总

用过pinia吗&#xff1f;有什么优点&#xff1f; 1. pinia是什么&#xff1f; 在Vue3中&#xff0c;可以使用传统的Vuex来实现状态管理&#xff0c;也可以使用最新的pinia来实现状态管理&#xff0c;我们来看看官网如何解释pinia的&#xff1a;Pinia 是 Vue 的存储库&#xff…

机器学习数据不均衡处理教程

机器学习数据不均衡处理教程 学习对数据进行过采样和欠采样、应用 SMOTE、集成方法和成本敏感型学习假设 课程英文名&#xff1a;Machine Learning with Imbalanced Data 此视频教程共13.5小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下…

Apriori算法及例题

一&#xff1a;Apriori算法介绍 关联规则挖掘是数据挖掘中最活跃的研究方法之一 。最早是由 Agrawal 等人提出的1993最初提出的动机是针对购物篮分析问题提出的&#xff0c;其目的是为了发现交易数据库中不同商品之间的联系规则。这些规则刻画了顾客购买行为模式&#xff0c;可…

Java去除文档阴影

Java去除文档阴影 一、前言 文稿扫描大家用的都比较频繁、想是各种证件、文件都可以通过扫描文稿功能保存到手机。相比直接拍照&#xff0c;在扫描文稿时&#xff0c;程序会对图像进行一些矫正。比如去除阴影、修正倾斜、旋转矫正等。进行这些处理后的图片要更加容易识别。今…

学习下c++原来它和Java有很多相似的地方

Java和CJava和C区别简单学习下C语法C 是什么&#xff1f;C工作原理&#xff1a;C标识符C基本数据类型C关键字封装&#xff0c;继承&#xff0c;多态简单回顾下Java语法Java的基础语法&#xff1a;Java注释Java标识符Java修饰符Java 接口和继承Java8 新增的特性Java和C区别 Java…

VTK-vtkPointInterpolator/vtkInterpolatorKernel

欢迎大家加入社区&#xff0c;雪易VTK社区-CSDN社区云 前言&#xff1a;目前在做模型的ReMesh&#xff0c;在研究这个接口&#xff0c;希望能有所帮助。 vtkPointInterpolator 描述&#xff1a; 变量&#xff1a; Strategy&#xff1a;MASK_POINTS, NULL_VALUE, CLOSEST_POI…

【css遇到的问题】vue中使用select下拉框,数据绑定但是默认不显示问题

文章目录问题描述原因分析问题描述 在vue中使用原生的select下拉框的时候&#xff0c;绑定数据内容但是发现其中默认显示第一条的并不显示 需求实现效果 实际实现效果 循环出select内的数据以后&#xff0c;发现原本默认显示第一条的select框变成了空白&#xff0c;要选择后…

【Mysql】事务

文章目录一.什么是事务1.1. 事物的属性1.2. 事务的版本支持1.3. 事务的提交方式1.4. 事务常见操作证明事务的回滚事务崩溃情况下验证回滚结论二.事务隔离级别2.1. 如何理解隔离性2.2. 隔离性级别2.3. 脏读,幻读,不可重复读2.4. 查看,设置隔离级别2.5. 隔离性验证三.一致性(Cons…

T046基于51单片机无线蓝牙控制8位LED灯亮灭proteus仿真原理图PCB

功能&#xff1a; 0.本项目采用STC89C52作为单片机系统的控制MCU 1.通过蓝牙发送指令控制LED灯 2.通过手机APP可以控制8路LED灯的亮灭&#xff0c;可以全亮全灭。 3.通过手机APP可以控制8路LED灯的亮度。每个灯的亮度有3档。具体控制指令如下 a)发送Ox&#xff0c;开启指定LED灯…

日常学习之:Yaml 和 Json 有什么区别

安装 json 是 python 内置 yaml 需要安装 pip install pyyaml格式 对于同样一段数据&#xff1a; test_data {"金山中学":{"101班":{"王宁": {"语文":33,"数学":22,"英语":18}}}}我们用下面的代码分别存入 ya…

ALE的基本介绍、使用与配置

本文将介绍ale插件的基本使用与配置&#xff0c;将从linter的介绍到具体插件的使用与bug的修复~ 本文仅仅时抛砖引玉&#xff0c;更多的使用技巧与功能可以查看项目介绍 ALE的基本介绍、使用与配置ale的介绍ale的基本配置与使用查看你可用的linter安装iverilog——for windowal…

Redisson之lock()和tryLock()的区别

Redisson之lock()和tryLock()的区别和原理解析 在Redisson中 lock() 方法 与 tryLock() 方法是有区别的&#xff01; 我们先来阐述两者的区别&#xff0c;再分析它们的源码。 lock() 与 tryLock() 的区别 &#xff08;1&#xff09;返回值&#xff1a; lock() 是没有返回值…

Vue中的diff算法深度解析

模板tamplate经过parse&#xff0c;optimize&#xff0c;generate等一些列操作之后&#xff0c;把AST转为render function code进而生成虚拟VNode,模板编译阶段基本已经完成了&#xff0c;那么这一章&#xff0c;我们来探讨一下Vue中的一个算法策略–dom diff 首先来介绍下什么…

Java8 遍历List 使用stream().parallel()并发安全

1. parallelStream是什么&#xff1a; java 8引入了并行流的概念来进行并行处理&#xff0c;而并行流(Parallel Stream)利用所有可用CPU内核的优势&#xff0c;并行处理任务。其原理(Parallel Stream)是可以把大任务分成多个小任务执行, 最后再把执行结果进行合并, ForkJoinPoo…

数仓DWS层之旁路缓存优化

优化原因&#xff1a; 外部数据源的查询常常是流式计算的性能瓶颈。以本程序为例&#xff0c;每次查询都要连接 Hbase&#xff0c;数据传输需要做序列化、反序列化&#xff0c;还有网络传输&#xff0c;严重影响时效性。可以通过旁路缓存对查询进行优化。 旁路缓存模式是一种非…