当前位置: 首页 > news >正文

检查SSH安全配置-关于“MaxStartups参数”

官方文档介绍

在《检查SSH安全配置-sshd服务端未认证连接最大并发量配置》中我们简略地阐述了“MaxStartups参数”在SSH安全配置中的意义。但是,并未对该参数做详细说明。

为啥没有详细说明呢?因为俺也没弄明白!

我们先看一下sshd_config的man文档是如何介绍该参数的。

Specifies the maximum number of concurrent unauthenticated connections to the SSH daemon.  Additional connections will be dropped until authentication succeeds or the LoginGraceTime expires for a connection.  The default is 10:30:100.

Alternatively, random early drop can be enabled by specifying the three colon separated values start:rate:full (e.g. "10:30:60").  sshd(8) will refuse connection attempts with a probability of rate/100 (30%) if there are currently start (10) unauthenticated connections.  The probability increases linearly and all connection attempts are refused if the number of unauthenticated connections reaches full (60).

指定SSH守护进程未认证的最大并发连接数。额外的连接将被丢弃,直到身份验证成功或连接的LoginGraceTime过期。默认值是10:30:100。

或者,可以通过指定三个冒号分隔的值start:rate:full来启用随机提前掉落(例如:“10:30:60”)。如果当前有10个未验证的连接,sshd(8)将以概率/100(30%)拒绝连接尝试。如果未经身份验证的连接数达到满(60),则概率线性增加,并且所有连接尝试都被拒绝。

==================================^_^=====================================

是不是每个字都认识,串起来就有点云里雾里了?关键就是介绍得太朦胧,缺少了很多上下文。然而官方信息就止于此了。

于是,我问了AI,百度,Google。

Kimi AI的回答

MaxStartups 是 SSH 服务器(sshd)的一个配置参数,用于控制未认证的并发连接数。它的作用是防止服务器被大量的未认证连接淹没,从而保护服务器的资源和安全性。以下是 MaxStartups 参数的详细工作原理:

配置格式

MaxStartups 的配置格式为 start:rate:full,也可以只配置 start,此时默认值为 start:30:start

参数解释

  1. start:

    • 表示当未认证的连接数超过 start 时,开始拒绝新的连接。

    • 例如,MaxStartups 10:30:100 中的 10 表示当未认证连接数超过 10 时,开始拒绝新的连接。

  2. rate:

    • 表示拒绝连接的概率,以百分比形式表示。

    • 例如,MaxStartups 10:30:100 中的 30 表示当未认证连接数超过 10 时,拒绝连接的概率为 30%。

    • 拒绝概率会线性增加,直到达到 full 值。

  3. full:

    • 表示当未认证连接数达到 full 时,拒绝所有新的连接尝试。

    • 例如,MaxStartups 10:30:100 中的 100 表示当未认证连接数达到 100 时,所有新的连接尝试都会被拒绝。

工作原理

  1. 未认证连接:

    • 当客户端尝试连接到 SSH 服务器时,如果身份验证未完成(例如密码错误),该连接将被视为“未认证连接”。

    • 未认证连接会占用 MaxStartups 的名额,直到身份验证成功或连接被拒绝。

  2. 拒绝机制:

    • 当未认证连接数超过 start 时,新的连接尝试将有 rate 概率被拒绝。

    • 拒绝概率会线性增加,直到未认证连接数达到 full,此时所有新的连接尝试都会被拒绝。

抛出疑问

更晕了,有没有~~

尽管还是不太清楚MaxStartups,对于start:rate:full三个参数了解却更加清晰了。另外,不清楚的点也总结到了:

1、MaxStartups作用范围:额外的连接将被丢弃,直到身份验证成功或连接的LoginGraceTime过期(缺省值:120秒)。跟源IP地址有没有关系?是同一个并发内还是全局场景下所有并发都生效?

注:LoginGraceTime:如果用户没有成功登录,服务器将在此时间之后断开连接。如果该值为0,则没有时间限制。缺省值是120秒。

2、达到full最大阈值,此后拒绝的是正常连接还是未认证链接?

3、未认证连接的定义也比较模糊。

我不知道你能不能看懂我说的问题,但是要解答这些问题,要么去读openssh的源代码,要么就要做实验。

实验验证

实验原理

1、编写脚本并发创建大量“未认证连接”(使用错误密码)

2、通过lastb可以查看登录失败记录,可以通过此来查看openssh产生的“未认证连接”数量

实验验证项

本实验将验证以下项目:

1、验证openssh在怎样一个阈值下会拒绝创建连接,拒绝创建的是正常连接还是“未认证连接”?

2、MaxStartups作用范围是在一个并发内,还是全局性的?

3、过多的“未认证连接”对openssh是否有影响?

实验步骤与代码

以下是一个使用 paramiko 库通过 Python 脚本创建 SSH 连接的示例代码:

import logging
import subprocess
import sys
from concurrent.futures.thread import ThreadPoolExecutor
import paramiko# 配置日志
log = logging.getLogger()
log.setLevel(logging.INFO)  # 设置日志级别为 INFO# 创建日志格式
fmt = logging.Formatter('%(asctime)s [%(levelname)s] [%(threadName)s] [%(filename)s:%(lineno)d] %(message)s')
streamH = logging.StreamHandler()
streamH.setFormatter(fmt)
streamH.setLevel(logging.INFO)
log.addHandler(streamH)# 禁用 paramiko 的日志输出
paramiko_logger = logging.getLogger("paramiko")
paramiko_logger.setLevel(logging.CRITICAL)  # 设置 paramiko 日志级别为 CRITICAL
paramiko_logger.propagate = False  # 禁用 paramiko 日志传播def doSsh(ip, port):ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:ssh.connect(ip, port=port, username='root', password='your_password')log.info(f"Login successful to {ip}:{port}")except Exception as e:log.error(f"Login failed to {ip}:{port}. Error: {e}")finally:ssh.close()if __name__ == '__main__':if len(sys.argv) != 4:log.error("Usage: python tmaxssh.py <ip> <port> <number>")sys.exit(1)ip = sys.argv[1]port = int(sys.argv[2])number = int(sys.argv[3])with ThreadPoolExecutor(max_workers=1000) as executor:futures = [executor.submit(doSsh, ip, port) for _ in range(number)]# 等待所有任务完成for future in futures:future.result()
实验步骤

1、清零lastb记录

echo >/var/log/btmp
lastb|wc -l            
2

2、修改MaxStartups配置项

MaxStartups 10:30:100
systemctl restart sshd

3、创建1000个“未认证连接”

python3 tmaxssh.py 192.168.XX.202 4022 1000 2>&1

4、查看产生的登录失败数

lastb|wc -l
102

5、手动登录并故意输入错误密码,然后查看登录失败数是否变化

~]# ssh -p4022 root@192.168.XX.202
root@192.168.XX.202's password: 
Permission denied, please try again.
root@192.168.XX.202's password: 
Permission denied, please try again.
root@192.168.XX.202's password: 
root@192.168.XX.202: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
~]# lastb|wc -l
105

6、手动登录并输入正确的密码

~]# ssh -p4022 root@192.168.XX.202
root@192.168.XX.202's password: 
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Tue Feb 25 14:56:57 2025 from 192.168.XX.230
~]# exit
注销

7、连续执行3、4步骤

~]# python3 tmaxssh.py 192.168.XX.202 4022 1000 2>&1 && lastb|wc -l
205
~]# python3 tmaxssh.py 192.168.XX.202 4022 1000 2>&1 && lastb|wc -l
305

实验总结

1、验证openssh在怎样一个阈值下会拒绝创建连接,拒绝创建的是正常连接还是“未认证连接”?
答:MaxStartups对正常会话创建没有影响,它是针对大量“未认证连接”的保护措施。实验表明,当达到 1000 个“未认证连接”时,只记录了 100 个,其他的均被拒绝。

2、MaxStartups作用范围是在一个并发内,还是全局性的?
答:第5个、7个实验表明:MaxStartups 不是全局生效的。每批 1000 个“未认证连接”中,只有 100 个被记录,而下一批 1000 个仍然会产生 100 个登录失败记录。OpenSSH 如何区分同一批并发的具体机制尚不明确。

3、过多的“未认证连接”对openssh是否有影响?
答:实验观察到,过多的“未认证连接”会导致 OpenSSH 响应变慢。

总结

MaxStartups start:rate:full 要配置(使用默认10:30:100即可),并且限制约严格约好,建议配置为:10:30:60或更低。

检查方法

执行以下命令验证MaxStartups是否为10:30:60或更严格的限制:

sshd -T | awk '$1 ~ /^\s*maxstartups/{split($2, a, ":");{if(a[1] > 10 || a[2] > 30 || a[3] > 60) print $0}}'

判定标准:

没有任何回显信息

相关文章:

检查SSH安全配置-关于“MaxStartups参数”

官方文档介绍 在《检查SSH安全配置-sshd服务端未认证连接最大并发量配置》中我们简略地阐述了“MaxStartups参数”在SSH安全配置中的意义。但是&#xff0c;并未对该参数做详细说明。 为啥没有详细说明呢&#xff1f;因为俺也没弄明白&#xff01; 我们先看一下sshd_config的…...

某查”平台请求头反爬技术解析与应对

一、请求头反爬技术概述 请求头&#xff08;HTTP Header&#xff09;是 HTTP 协议中用于在客户端和服务器之间传递信息的一部分。它包含了请求的来源、用户代理、内容类型等关键信息。许多网站通过检查请求头中的特定字段来判断请求是否来自合法的浏览器&#xff0c;从而防止爬…...

MOE结构解读和deepseek的MoE结构

不管dense还是MoE&#xff08;Mixture of Experts&#xff09;都是基于transformer的。 下面回顾下解码器块的主要架构&#xff1a; 注意力机制-层归一化&残差连接-FFN前馈神经网络-层归一化&残差连接。 dense模型是沿用了这个一架构&#xff0c;将post-norm换为pre-no…...

LLM+多智能体协作:基于CrewAI与DeepSeek的邮件自动化实践

文章目录 引言理解 Flows&#xff08;工作流&#xff09;与 Crews&#xff08;协作组&#xff09;一、环境准备与工具安装1.1 Python环境搭建1.2 创建并激活虚拟环境1.3 安装核心依赖库&#xff08;crewai、litellm&#xff09; 二、本地DeepSeek R1大模型部署2.1 Ollama框架安…...

基于C++“简单且有效”的“数据库连接池”

前言 数据库连接池在开发中应该是很常用的一个组件&#xff0c;他可以很好的节省连接数据库的时间开销&#xff1b;本文基使用C实现了一个简单的数据库连接池&#xff0c;代码量只有400行只有&#xff0c;但是压力测试效果很好&#xff1b;欢迎收藏 关注&#xff0c;本人将会…...

为什么要将PDF转换为CSV?CSV是Excel吗?

在企业和数据管理的日常工作中&#xff0c;PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档&#xff0c;而CSV因其简洁、易操作的特性&#xff0c;广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据&#xff0c;转换为CSV格式可能是一个高效…...

Redis 集群的三种模式:一主一从、一主多从和多主多从

本文记述了博主在学习 Redis 在大型项目下的使用方式&#xff0c;包括如何设置Redis主从节点&#xff0c;应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后&#xff0c;进而想要了解 Redis 集群如何使用&#xff0c;如何正确使用&#xf…...

面试题——简述Vue 3的服务器端渲染(SSR)是如何工作的?

面试题——简述Vue3的服务器端渲染&#xff08;SSR&#xff09;是如何工作的&#xff1f; 服务器端渲染&#xff08;SSR&#xff09;已经成为了一个热门话题。Vue 3&#xff0c;作为一款流行的前端框架&#xff0c;也提供了强大的SSR支持。那么&#xff0c;Vue 3的SSR究竟是如…...

2.25DFS和BFS刷题

洛谷P1101单词方阵&#xff1a;用sta存字符串&#xff0c;for找到‘y的位置&#xff0c;然后dfs对字符串用for进行一个一个的判断&#xff0c;不符合就return&#xff0c;下面再用for进行book标记&#xff0c;能执行下面的for说明上面没有return&#xff0c;所以说明找到&#…...

C语言基本知识------指针(4)

1. 回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的函数就是回调函数。 void qsort(void base,//指针…...

【OMCI实践】ONT上线过程的omci消息(六)

引言 在前四篇文章中&#xff0c;主要介绍了ONT上线过程的OMCI交互的第一、二、三个阶段omci消息&#xff0c;本篇介绍第四个阶段&#xff0c;OLT下发配置到ONT。前三个阶段&#xff0c;每个厂商OLT和ONT都遵循相同标准&#xff0c;OMCI的交换过程大同小异。但第四个阶段&…...

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构&#xff0c;顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考&#xff1a; C语言&#xff08;11&#xff09;-------------&#xff1e;while循…...

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票 作者:某七年数据开发工程师 | 2025年02月23日 关键词:SQL窗口函数、连续问题、股票分析、腾讯面试题 一、问题背景与难点拆解 在股票量化分析场景中,"连续N天满足条件"是高频面试题类型。本题要求在单表stoc…...

HybridCLR+Adressable+Springboot热更

本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易&#xff0c;动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目&#xff1a; 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…...

电脑连接示波器显示波形

通过网线连接示波器和电脑&#xff0c;将示波器波形显示在电脑上直接复制图片至报告中&#xff0c;以下是配置步骤。 一、设备 网线&#xff0c;Tektronix示波器&#xff0c;电脑 二、使用步骤 1.用网线连接电脑和示波器 2.电脑关掉WiFi&#xff0c;查看IPv4网关地址&#xf…...

监听其他音频播放时暂停正在播放的音频

要实现当有其他音频播放时暂停当前音频&#xff0c;你可以使用全局事件总线或 Vuex 来管理音频播放状态。这里我将展示如何使用一个简单的事件总线来实现这个功能。 首先&#xff0c;你需要创建一个事件总线。你可以在项目的一个公共文件中创建它&#xff0c;例如 eventBus.js…...

小熊猫C++安装EasyX最新教程

1.下载EasyX 官网下载&#xff1a; EasyX 官网https://easyx.cn/ 2.将下载文件改格式解压 注意&#xff1a;下载文件为.exe格式&#xff0c;需将其格式改成.zip格式&#xff01; 如何改格式&#xff1f; a.若文件名字未显示.exe (1).打开此电脑 (2).点击上端的查看 (…...

安装VM和Centos

安装VM 一、打开虚拟机 二、选择典型 三、选择光盘 四、指定虚拟机位置 五、设置磁盘大小并拆分为多个文件 六、完成 安装Centos 一、上述过程完成后我们直接打开虚拟机 二、语言选择中文 三、默认安装位置并点击完成 四、点击开始安装 五、点击设置密码 设置完密码后点击完成…...

git 命令 设置别名

在Git中&#xff0c;您可以通过以下命令查看所有的alias&#xff08;别名&#xff09;&#xff1a; git config --get-regexp alias 这个命令会列出所有配置的alias&#xff0c;例如&#xff1a; alias.st.status alias.co.checkout alias.br.branch ... 如果您想查看某个特定a…...

React + TypeScript 全栈开发最佳实践

React TypeScript 全栈开发最佳实践 一、环境搭建与项目初始化 node.js和npm的安装请参考我的文章。 1.1 脚手架选择与工程创建 # 使用Vite 5.x创建ReactTS项目&#xff08;2025年主流方案&#xff09; npx create-vitelatest my-app --template react-ts cd my-app npm in…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...