官方文档介绍在《检查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。 参数解释
工作原理
抛出疑问更晕了,有没有~~ 尽管还是不太清楚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 连接的示例代码: [code]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()[/code]实验步骤1、清零lastb记录 echo >/var/log/btmp 2、修改MaxStartups配置项 MaxStartups 10:30:100 3、创建1000个“未认证连接” python3 tmaxssh.py 192.168.XX.202 4022 1000 2>&1 4、查看产生的登录失败数 lastb|wc -l 5、手动登录并故意输入错误密码,然后查看登录失败数是否变化 ~]# ssh -p4022 root@192.168.XX.202 6、手动登录并输入正确的密码 ~]# ssh -p4022 root@192.168.XX.202 Last login: Tue Feb 25 14:56:57 2025 from 192.168.XX.230 7、连续执行3、4步骤 ~]# python3 tmaxssh.py 192.168.XX.202 4022 1000 2>&1 && lastb|wc -l 实验总结1、验证openssh在怎样一个阈值下会拒绝创建连接,拒绝创建的是正常连接还是“未认证连接”? 2、MaxStartups作用范围是在一个并发内,还是全局性的? 3、过多的“未认证连接”对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}}' 判定标准: 没有任何回显信息 免责声明:本内容来源于网络,如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |