一文彻底搞懂什么是SSH中间人攻击(Man-in-the-middle attack)

news2024/12/23 8:58:50

文章目录

    • 【1】背景
    • 【2】中间人攻击原理
      • 登录报错信息提示
      • 从首次登录服务器说起
      • 中间人攻击原理
      • 重装服务器导致ssh无法登录的解决方案
    • 【3】如何避免中间人攻击?
    • 【4】什么是Known_hosts ?
      • known_hosts中的文件来自哪里?
      • 这个/etc/ssh/ssh_host_ecdsa_key.pub 和/root/.ssh/id_rsa.pub的区别是啥呢?
    • 【5】什么是authorized_keys?
      • 公钥登录的原理
      • 公钥登录的sshd配置

【1】背景

服务器重新安装之后,ssh无法连接,提示中间人攻击(man-in-the-middle-attack)。之前也遇到过,按照网上的操作能解决,但是一知半解,今天趁此把该问题消化掉。

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

【2】中间人攻击原理

登录报错信息提示

其实如果仔细阅读这个报错提示应该也能理解一二。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:7g/bojcSbdVWBrfNrQ5+k+XQZuo4mp0V7MnUPD21nec.
Please contact your system administrator.
Add correct host key in /c/Users/reggie/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /c/Users/reggie/.ssh/known_hosts:2
ECDSA host key for [xxx.xxx.com]:12222 has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

从首次登录服务器说起

首次ssh登录服务器背后都发生了什么呢?

[root@hadoop100 ~/.ssh]#ssh root@10.50.10.179
The authenticity of host '10.50.10.179 (10.50.10.179)' can't be established.
ECDSA key fingerprint is SHA256:Ld7RCy+1lIgwlW6cLVNt6ULM++jXM+XRYZ5NixblOb0.
ECDSA key fingerprint is MD5:31:36:dc:fe:37:af:5c:85:e5:58:85:63:73:86:ec:d4.
Are you sure you want to continue connecting (yes/no)? yes

上面的文字意思就是 无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

  • ECDSA key fingerprint 是远程服务器公钥的指纹信息

“公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是31:36:dc:fe:37:af:5c:85:e5:58:85:63:73:86:ec:d4,再进行比较,就容易多了。

  • 这一步如果你可以登录远程服务器,可以校验
]# ssh-keyscan -t ECDSA -p 22 127.0.0.1 2>/dev/null | ssh-keygen -E sha256 -lf -
256 SHA256:Ld7RCy+1lIgwlW6cLVNt6ULM++jXM+XRYZ5NixblOb0 127.0.0.1 (ECDSA)
  • 如果不能登录,例如你要ssh github,那么一般这种公网上的服务器一般都会公布自己的公钥指纹信息,这个和文件下载附带rsa256检验文件是一个道理.
  • 输入yes之后提示如下表示host主机已经得到认可
Warning: Permanently added '10.50.10.179' (ECDSA) to the list of known hosts
  • 接着要求输入密码
root@10.50.10.179's password:
  • 如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

在这里插入图片描述

中间人攻击原理

SSH之所以能够保证安全,原因在于它采用了公钥加密。

ssh整个登录过程 :
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。
因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。

重装服务器导致ssh无法登录的解决方案

当然如果服务器重新安装也会被系统认为发生了中间人攻击,例如A服务器重装之后,其known_hosts文件中记录的B的公钥1 与 连接时B传过来的公钥2不匹配。
解决办法是只需要在known_hosts中将旧的服务器信息删掉或者忽略known_hosts认证即可。

  • 方法一:删除A的known_hosts文件中记录的B的公钥(手动进行,不适用于自动化部署情形)
  • 方法二:修改配置文件,在ssh登陆时不通过known_hosts文件进行验证(安全性有所降低),修改完重启sshd
StrictHostKeyChecking no 
UserKnownHostsFile /dev/null

【3】如何避免中间人攻击?

建议使用公钥登录,不要使用明文登录,首次明文登录之后可以禁止root用户的明文登录。

【4】什么是Known_hosts ?

known_hosts文件是一个客户端文件,包含所有远程连接的已知主机,ssh客户端使用这个文件。该文件为客户端向他们连接的服务器进行身份验证。

known_hosts 文件包含所有已知主机的主机公钥。StrictHostKeyChecking 这个参数可以选择关闭校验known_hosts
但如果使用,则由系统管理员准备。它会自动维护系统中的每个用户文件。每次用户连接到未知主机时,未知主机密钥都会添加到此文件中。
但是,如果机器被黑客攻击或受到威胁,黑客可以使用 know_hosts 文件,查看连接到这台机器的所有机器的列表,并将这些机器作为目标。为避免这种风险,并非 known_host 密钥中的所有 IP 地址都以明文格式定义。具体格式可参考

known_hosts中的文件来自哪里?

客户端的该文件内容来自于服务器的/etc/ssh/ssh_host_ecdsa_key.pub。
在这里插入图片描述

这个/etc/ssh/ssh_host_ecdsa_key.pub 和/root/.ssh/id_rsa.pub的区别是啥呢?

远程主机的用户目录下的公钥变了无所谓,客户端连接主要是看主机公钥是否该表以辨识中间人攻击。
主机密钥只是普通的 SSH 密钥对。每个主机可以为每种算法拥有一个主机密钥。主机密钥几乎总是存储在以下文件中:

/etc/ssh/ssh_host_dsa_key 
/etc/ssh/ssh_host_ecdsa_key 
/etc/ssh/ssh_host_ed25519_key 
/etc/ssh/ssh_host_rsa_key

主机密钥通常在安装 SSH 服务器时自动生成。它们可以随时再生。但是,如果更改主机密钥,客户端可能会警告更改的密钥。当有人试图执行中间人攻击时,也会报告已更改的密钥。

更改密钥最好使用 SSH 密钥管理工具来完成,该工具也会在客户端更改它们,或者使用证书。

以下是man ssh中的定义

ssh automatically maintains and checks a database containing identification for all hosts it has ever been used with.  Host keys
     are stored in ~/.ssh/known_hosts in the user's home directory.  Additionally, the file /etc/ssh/ssh_known_hosts is automatically
     checked for known hosts.  Any new hosts are automatically added to the user's file.  If a host's identification ever changes, ssh
     warns about this and disables password authentication to prevent server spoofing or man-in-the-middle attacks, which could other‐
     wise be used to circumvent the encryption.  The StrictHostKeyChecking option can be used to control logins to machines whose host
     key is not known or has changed.

     When the user's identity has been accepted by the server, the server either executes the given command in a non-interactive ses‐
     sion or, if no command has been specified, logs into the machine and gives the user a normal shell as an interactive session.
     All communication with the remote command or shell will be automatically encrypted.

【5】什么是authorized_keys?

主要是用于公钥远程登录时.
远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

  $ ssh user@host   'mkdir -p .ssh && cat >> .ssh/authorized_keys'   < ~/.ssh/id_rsa.pub

这个在远程主机上执行脚本的语句,依次分解开来看:

(1)"$ ssh user@host",表示登录远程主机;
(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:
(3)"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;
(4)'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

写入authorized_keys文件后,公钥登录的设置就完成了。如果管理的机器并不多,可以使用ssh-copy -i 进行.

公钥登录的原理

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

公钥登录的sshd配置

如果客户端的公钥已经加入授信列表还无法连接,请确认远程主机上的以下几个参数是否开启。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

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

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

相关文章

gcc内联汇编

1. 介绍 用汇编编写的程序虽然运行速度快&#xff0c;但开发速度非常慢&#xff0c;效率也很低。如果只是想对关键代码段进行优化&#xff0c;或许更好的办法是将汇编指令嵌入到 C 语言程序中&#xff0c;从而充分利用高级语言和汇编语言各自的特点。但一般来讲&#xff0c;在…

华为机试_HJ81 字符串字符匹配【简单】【收藏!】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码 学习代码 收藏点 一、strstr函数 二、stdlib.h 描述 判断短字符串S中的所有字符是否在长字符串T中全部出现。 请注意本题有多组样例输入。 数据范围:1≤len(S),len(T)≤200 进阶&#xf…

如何解决“德语/文”等外文字符显示乱码问题

目录 1“德文/语字符”等外文显示乱码原因 2 如何解决“德文/语字符”等外文显示乱码 2.1 使用支持多个“编码”切换的工具打开该文本 2.2 使用变音字符的标准ASCII字符 2.3 将计算机系统切换至西欧编码 3 结尾 1“德文/语字符”等外文显示乱码原因 以德文/语为例&#…

vue3(二)

前一篇讲了 vue3的生命周期钩子的使用。 本节接着讲 vue3的数据通信。 provide/inject 依赖注入 App.vue <script setup lang"ts"> import { ref, provide } from vue import List from ./components/List.vue import User from ./components/User.vue impo…

知识点8--Docker镜像的秘密

前面的知识点我们介绍了docker的日常使用&#xff0c;但其实docker存在的核心意义是交付环境&#xff0c;也就是镜像&#xff0c;本片知识点带大家了解一下镜像的秘密。 镜像本身是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;包…

【Tensorflow学习二】神经网络优化方法学习率、激活函数、损失函数、正则化

文章目录预备知识tf.wheretf.random.RandomState.rand() 返回一个[0,1)之间的随机数np.vstack() 将数组按照垂直方向叠加np.mgrid[ ] np.ravel( ) np.c_[ ] 一起使用可以生成网格坐标点复杂度、学习率复杂度指数衰减学习率激活函数Sigmoid激活函数Tanh激活函数ReLu激活函数Leak…

今天面了个00后测试员,让我见识到了内卷届的天花板

深耕IT行业多年&#xff0c;我们发现&#xff0c;对于一个程序员而言&#xff0c;能去到一线互联网公司&#xff0c;会给我们以后的发展带来多大的影响。 很多人想说&#xff0c;这个我也知道&#xff0c;但是进大厂实在是太难了&#xff0c;简历投出去基本石沉大海&#xff0…

Linux安装KVM

一、虚拟化技术 1、全虚拟化和半虚拟化技术 如果给KVM、XEN简单归类的话&#xff0c;KVM是完全虚拟化技术又叫硬件辅助虚拟化技术&#xff08;Full Virtualization)。相反&#xff0c;XEN是半虚拟化技术&#xff08;paravirtualization&#xff09;&#xff0c;也叫做准虚拟化…

线上环境内存溢出-OutOfMemoryError

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 线上环境内存溢出-OutofMemoryError前言一、OutOfMemoryError是什么&#xff1f;二、实际情况&#xff08;参考&#xff09;解决方案1.实战总结前言 公司线上环境&#xff0…

getBoundingClientRect属性研究

getBoundingClientRect属性研究 概念 getBoundingClientRect 返回 width、height和下图中的6个属性 实测总结&#xff1a; 抓住一个核心点&#xff0c;就是height、width的值&#xff1a; box-sizing 是 content-box时&#xff0c;width和height 内容borderpaddingbox-siz…

国家级专新特精“小巨人”「皖仪科技」携手企企通,打造采购数字化平台成功上线

近日&#xff0c;安徽皖仪科技股份有限公司&#xff08;以下简称“皖仪科技”&#xff09;携手企企通共同打造的数字化采购管理系统成功上线。基于皖仪科技的采购业务流程和规则&#xff0c;形成全新的数字化采购体系&#xff0c;在推动企业降本增效的同时&#xff0c;实现企业…

单商户商城系统功能拆解42—应用中心—商城公告

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

冠状病毒疾病优化算法 (COVIDOA)附matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

npp各个平台npp数据比较

文章目录1GEE中的npp数据2 与其他数据的比较1GEE中的npp数据 在GEE上查阅npp&#xff0c;可以看到有连个数据集&#xff0c;一个是Terra的&#xff0c;另一个是Aqua的。 我比较了两个的不同&#xff0c;发现Terra是2000-目前的&#xff0c;而Aqua是2002-目前的&#xff0c;都是…

2022吴恩达机器学习课程——第一课

注&#xff1a;参考B站视频教程 视频链接&#xff1a;【(强推|双字)2022吴恩达机器学习Deeplearning.ai课程】 文章目录第一周一、监督学习与无监督学习二、线性回归三、梯度下降第二周一、向量化二、特征缩放第三周一、逻辑回归二、训练逻辑回归模型三、逻辑回归中的梯度下降四…

[运维]如何快速压缩一个数据库的硬盘占用大小(简单粗暴但有效)

文章目录前言一、数据库文件为什么会那么大&#xff1f;1.数据空间2.日志空间3.索引空间4.其他二、我的解决方案总结前言 在维护网站时我们经常会遇到数据库占用服务器磁盘空间的问题。高端的食材往往只需要采用最朴素的烹饪方式。本文我讲一个简单粗暴但有效的方法。本文以Sq…

RabbitMQ快速上手以及RabbitMQ交换机的四种模式

Win10安装&#xff1a; ​win10下安装 RabbitMQ​_柚几哥哥的博客-CSDN博客 Linux安装&#xff1a; Linux下载安装 RabbitMQ​_柚几哥哥的博客-CSDN博客 一、基础使用 1、导入依赖 <!--RabbitMQ--><dependency><groupId>org.springframework.boot</g…

JAVA12_06学习总结(JDBC,工具类优化)

今日内容 1. PreparedStatement PreparedStatement--预编译步骤1)注册驱动2)获取数据库连接对象3)准备sql语句--不需要拼接--需要的参数全部使用 ? 占位符4)通过数据库连接对象,获取预编译对象,同时将sql语句房费数据库,将参数和参数类型都存储在预编译中Connection中的方法…

均匀传输线的串扰和饱和长度

下图为串扰的电路模型&#xff0c;动态线与静态线之间通过互容与互感联系&#xff0c;这样也说明了动态线的信号耦合到静态线上的条件是存在di/dt或者dv/dt时&#xff0c;也就是说只在信号边沿上产生串扰&#xff0c;当电压或者电流为常数的时候静态线上就不会有串扰的信号。 信…

扩散模型:Diffusion models as plug-and-play priors作为即插即用先验的扩散模型

扩散模型&#xff1a;Diffusion models as plug-and-play priors作为即插即用先验的扩散模型0.摘要1.概述2.方法2.1.问题设置2.2.将去噪扩散概率模型作为先验3.实验&#xff1a;图像生成3.1.MNIST的简单说明3.2.使用现成组件条件生成脸部图像4.实验&#xff1a;语义分割附录B&a…