公司网站维护怎么做,泰安人才信息网官网,区块链app排名,2021发生的重大新闻5条官方文档介绍
在《检查SSH安全配置-sshd服务端未认证连接最大并发量配置》中我们简略地阐述了“MaxStartups参数”在SSH安全配置中的意义。但是#xff0c;并未对该参数做详细说明。
为啥没有详细说明呢#xff1f;因为俺也没弄明白#xff01;
我们先看一下sshd_config的…官方文档介绍
在《检查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)将以概率/10030%拒绝连接尝试。如果未经身份验证的连接数达到满60则概率线性增加并且所有连接尝试都被拒绝。 ^_^
是不是每个字都认识串起来就有点云里雾里了关键就是介绍得太朦胧缺少了很多上下文。然而官方信息就止于此了。
于是我问了AI百度Google。
Kimi AI的回答
MaxStartups 是 SSH 服务器sshd的一个配置参数用于控制未认证的并发连接数。它的作用是防止服务器被大量的未认证连接淹没从而保护服务器的资源和安全性。以下是 MaxStartups 参数的详细工作原理
配置格式
MaxStartups 的配置格式为 start:rate:full也可以只配置 start此时默认值为 start:30:start。
参数解释 start: 表示当未认证的连接数超过 start 时开始拒绝新的连接。 例如MaxStartups 10:30:100 中的 10 表示当未认证连接数超过 10 时开始拒绝新的连接。 rate: 表示拒绝连接的概率以百分比形式表示。 例如MaxStartups 10:30:100 中的 30 表示当未认证连接数超过 10 时拒绝连接的概率为 30%。 拒绝概率会线性增加直到达到 full 值。 full: 表示当未认证连接数达到 full 时拒绝所有新的连接尝试。 例如MaxStartups 10:30:100 中的 100 表示当未认证连接数达到 100 时所有新的连接尝试都会被拒绝。
工作原理 未认证连接: 当客户端尝试连接到 SSH 服务器时如果身份验证未完成例如密码错误该连接将被视为“未认证连接”。 未认证连接会占用 MaxStartups 的名额直到身份验证成功或连接被拒绝。 拒绝机制: 当未认证连接数超过 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, portport, usernameroot, passwordyour_password)log.info(fLogin successful to {ip}:{port})except Exception as e:log.error(fLogin 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_workers1000) 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 21 4、查看产生的登录失败数
lastb|wc -l 102
5、手动登录并故意输入错误密码然后查看登录失败数是否变化
~]# ssh -p4022 root192.168.XX.202 root192.168.XX.202s password: Permission denied, please try again. root192.168.XX.202s password: Permission denied, please try again. root192.168.XX.202s password: root192.168.XX.202: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). ~]# lastb|wc -l 105
6、手动登录并输入正确的密码
~]# ssh -p4022 root192.168.XX.202 root192.168.XX.202s 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 21 lastb|wc -l 205 ~]# python3 tmaxssh.py 192.168.XX.202 4022 1000 21 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}}
判定标准
没有任何回显信息