检查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}}'

判定标准:

没有任何回显信息

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

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

相关文章

zabbix数据采集以及自定义监控

目录 1.数据采集 2.自定义监控 2.1客户端 2.2服务端 ​​​​​​​1.数据采集 点击最新数据页面如下图 往下滑查看具体数据 并点击查看图像就可以看到图像了 就可以看到如下图内容 2.自定义监控 我们通过zabbix客户端任何模板就可以监控我们想要的任何资源 如果…

02.25 继承和多态

编写一个如下场景&#xff1a; 有一个英雄Hero类&#xff0c;私有成员&#xff0c;攻击&#xff0c;防御&#xff0c;速度&#xff0c;生命值&#xff0c;以及所有的set get 方法 编写一个 武器 Weapon 类&#xff0c;拥有私有成员攻击力&#xff0c;以及set get 方法 编写一个…

6. grafana的graph简介

1. Settings功能 2. Visualization功能 &#xff08;可视化的方式&#xff0c;后续会写一些&#xff09; 3. Display 功能&#xff08;显示方面的设置&#xff09; bars 柱状图方式显示 lines&#xff08;不选不会出功能&#xff09; line width 线条的粗细 staircase 会让折…

前缀和代码解析

前缀和是指数组一定范围的数的总和,常见的有两种,一维和二维,我会用两道题来分别解析 一维 DP34 【模板】前缀和 题目: 题目解析: 暴力解法 直接遍历数组,遍历到下标为 l 时,开始进行相加,直到遍历到下标为 r ,最后返回总和.这样做的时间复杂度为: O(n) public class Main …

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要 大规模预训练语言模型在自然语言处理&#xff08;NLP&#xff09;任务上取得了最新的最优结果&#xff08;SOTA&#xff09;。然而&#xff0c;这些模型容易受到对抗攻击的影响&#xff0c;尤其是对于表意文字语言&#xff08;如中文&#xff09;。 在本研究中&#xff0…

【原创工具】文件清单生成器 By怜渠客

【原创工具】文件清单生成器 By怜渠客 刚在论坛看到了一个文件列表生成器 文件列表生成器 - 吾爱破解 - 52pojie.cn &#xff0c;和我去年写的一个软件很像&#xff0c;当时我也是有需求&#xff0c;要把一个文件夹里及其子文件夹里所有的文件列出来&#xff0c;就临时弄了个小…

深度学习-6.用于计算机视觉的深度学习

Deep Learning - Lecture 6 Deep Learning for Computer Vision 简介深度学习在计算机视觉领域的发展时间线 语义分割语义分割系统的类型上采样层语义分割的 SegNet 架构软件中的SegNet 架构数据标注 目标检测与识别目标检测与识别问题两阶段和一阶段目标检测与识别两阶段检测器…

【Linux】初始操作系统和进程(一)

目录 前言&#xff1a; 一、冯诺依曼体系结构&#xff1a; 二、操作系统&#xff1a; 1.操作系统是什么&#xff1f; 2.为什么要有操作系统&#xff1f; 3.操作系统是如何管理下层的&#xff1f; 4.操作系统是如何对上层提供服务的&#xff1f; 三、进程&#xff1a; …

【链 表】

【链表】 一级目录1. 基本概念2. 算法分析2.1 时间复杂度2.2 空间复杂度2.3 时空复杂度互换 线性表的概念线性表的举例顺序表的基本概念顺序表的基本操作1. 初始化2. 插入操作3. 删除操作4. 查找操作5. 遍历操作 顺序表的优缺点总结优点缺点 树形结构图形结构单链表基本概念链表…

python-leetcode-字符串解码

394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; class Solution:def decodeString(self, s: str) -> str:stack []num 0curr_str ""for char in s:if char.isdigit():num num * 10 int(char)elif char [:stack.append((curr_str, num))curr_str, …

力扣 下一个排列

交换位置&#xff0c;双指针&#xff0c;排序。 题目 下一个排列即在组成的排列中的下一个大的数&#xff0c;然后当这个排列为降序时即这个排列最大&#xff0c;因为大的数在前面&#xff0c;降序排列的下一个数即升序。所以&#xff0c;要是想找到当前排列的下一个排列&…

ProGuard加密混淆SpringBoot应用代码

背景 我们的项目是基于SpringCloud架构的微服务应用&#xff0c;采用Docker离线部署方式交付客户&#xff0c;通过授权证书来控制应用的许可功能模块和使用时间。我们已经在代码层已经实现&#xff1a; 基于多维度硬件指纹的绑定验证&#xff0c;cpu id、mac地址、磁盘序列、…

动态链接器(九):.init和.init_array

ELF文件中的.init和.init_array段是程序初始化阶段的重要组成部分&#xff0c;用于在main函数执行前完成必要的初始化操作。 1 .init段和.init_array 段 1.1 作用 .init段包含编译器生成的初始化代码&#xff0c;通常由运行时环境&#xff08;如C标准库的启动例程&#xff0…

Ollama微调

Ollama是一款开源工具&#xff0c;其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型&#xff0c;如 Llama 2、Qwen2.5等。在上一篇文章中我们部署Ollama&#xff0c;并使用简单命令管理Ollama。接下来我们学习Ollama的高级应用。通过Ollama的Mod…

DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!

项目地址&#xff1a;GitHub - deepseek-ai/FlashMLA 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天&#xff01; ​ 一、开源周震撼启幕 继上周预告后&#xff0c;DeepSeek于北京时间今晨9点准时开源「FlashMLA」&#xff0c;打响开源周五连…

(七)懒加载预加载

&#xff08;一&#xff09;懒加载 1. 什么是懒加载 懒加载&#xff0c;即延迟加载。在访问页面时&#xff0c;先将 img 元素或其他元素的背景图片路径替换为占位图&#xff08;通常是 1*1px 的小图片&#xff09;&#xff0c;仅当元素进入浏览器可视区域时&#xff0c;才设置…

Revisiting Reverse Distillation for Anomaly Detection

重新审视反向蒸馏在异常检测中的应用 文章链接&#xff1a;点这里 源码链接&#xff1a;点这里 前言 此篇文章是在 Anomaly detection via reverse distillation from one-class embedding 这篇的基础上改进创新的。重新审视了反向蒸馏&#xff08;KD&#xff09;这一想法&am…

Windows CMD 命令大全(Complete List of Windows CMD Commands)

Windows CMD 命令大全&#xff1a; Windows CMD 是 Windows 系统内置的命令行工具&#xff0c;用于执行各种命令和管理任务。 称为Command Prompt。它提供了一个通过键入命令来与计算机系统进行交互的方式&#xff0c;类似于早期的DOS操作系统。以下是 CMD 的基础知识和常用命…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…

【JavaWeb13】了解ES6的核心特性,对于提高JavaScript编程效率有哪些潜在影响?

文章目录 &#x1f30d;一. ES6 新特性❄️1. ES6 基本介绍❄️2. 基本使用2.1 let 声明变量2.2 const 声明常量/只读变量2.3 解构赋值2.4 模板字符串2.5 对象拓展运算符2.6 箭头函数 &#x1f30d;二. Promise❄️1. 基本使用❄️2. 如何解决回调地狱问题2.1回调地狱问题2.2 使…