首页 / 资讯中心 / 文章详情

CAS 认证节流 Hazelcast 分布式存储配置指南

CAS 认证节流 Hazelcast 分布式存储配置指南 ★ FEATURED ARTICLE
后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载本篇技术指南讲解 Apereo CAS 中基于 Hazelcast 分布式 Map 实现的认证节流Authentication Throttling方案如何通过启用cas-server-support-throttle-hazelcast模块让集群中所有 CAS 节点共享同一份失败认证尝试记录从而在多节点部署下统一限制暴力破解与密码猜测行为。读完本文你将掌握该模块的依赖启用方式、cas.authn.throttle.hazelcast全系列配置项含集群网络与 TLS 加密、节流速率判定原理以及从自动配置到后台清理任务的完整源码实现链路。功能概述用分布式 Map 记录节流尝试CAS 的认证节流功能用于限制失败的登录尝试以对抗密码猜测等滥用场景。官方文档 Configuring-Authentication-Throttling-Hazelcast.md 明确指出This feature uses a distributed Hazelcast map to record throttled authentication attempts.即该功能使用一张分布式 Hazelcast Map默认名为ipMap来记录被节流的认证尝试。与基于单机内存 Map 的方案不同分布式 Map 让集群内的所有 CAS 节点读写同一份节流数据任何节点记录的失败尝试都能被其他节点感知因此特别适合部署在负载均衡之后的多节点 CAS 集群。该组件同时依赖并需要 CAS 审计功能见 Audits.md因为节流事件的记录与审计inspektr体系共享同一套事件采集链路失败尝试会作为审计动作默认动作码AUTHENTICATION_FAILED被登记。启用模块在配置 overlayconfiguration overlay中添加以下依赖即可启用该模块implementation org.apereo.cas:cas-server-support-throttle-hazelcast模块的 Maven 坐标为org.apereo.cas:cas-server-support-throttle-hazelcast。从源码结构看该模块内部仅有三个类文件职责高度聚焦CasHazelcastThrottlingAutoConfigurationSpring Boot 自动配置入口CasHazelcastThrottlingAutoConfiguration.javaHazelcastMapThrottledSubmissionsStore基于 HazelcastIMap的节流记录存储实现HazelcastMapThrottledSubmissionsStore.javaCasHazelcastThrottlingConfigurationTests对应的单元测试CasHazelcastThrottlingConfigurationTests.java。模块由特性开关feature flag控制自动配置类标注了ConditionalOnFeatureEnabled(feature Throttling, module hazelcast)只有认证节流特性启用且使用 hazelcast 存储时才会装配。配置详解cas.authn.throttle.hazelcast该模块的全部配置统一挂在cas.authn.throttle.hazelcast前缀下其顶层属性模型为HazelcastThrottlePropertiesHazelcastThrottleProperties.java它直接继承自BaseHazelcastPropertiesBaseHazelcastProperties.java内含两大块cluster集群配置与coreHazelcast 核心配置。Hazelcast 核心配置cas.authn.throttle.hazelcast.core对应属性类HazelcastCorePropertiesHazelcastCoreProperties.java属性默认值说明cas.authn.throttle.hazelcast.core.license-key无Hazelcast 企业版许可证密钥。启用 WAN 复制、SSL 等企业特性时必需cas.authn.throttle.hazelcast.core.enable-compressionfalse使用默认 Java 序列化时是否启用压缩cas.authn.throttle.hazelcast.core.enable-management-center-scriptingtrue是否允许从 Management Center 执行脚本cas.authn.throttle.hazelcast.core.enable-jettrue是否在 Hazelcast 实例上启用 Jet 服务分布式批处理/流处理引擎SQL 服务依赖它Hazelcast 集群核心cas.authn.throttle.hazelcast.cluster.core对应属性类HazelcastCoreClusterPropertiesHazelcastCoreClusterProperties.java该组配置直接决定节流 Map 的数据分布、备份与驱逐行为属性默认值说明cas.authn.throttle.hazelcast.cluster.core.instance-name无必填当前 Hazelcast 实例名称支持 Spring 表达式语言ExpressionLanguageCapable。测试用例中将其设为throttlehzstorecas.authn.throttle.hazelcast.cluster.core.async-filluptrue复制模式下新成员加入时是否异步填充true不阻塞读写但数据渐进可见false阻塞读写直到填充完成cas.authn.throttle.hazelcast.cluster.core.replicatedfalse是否使用 Replicated Map全量复制到所有成员读快但内存占用高、更新量大时扩展性差cas.authn.throttle.hazelcast.cluster.core.partition-member-group-type无分区组策略PER_MEMBER、HOST_AWARE、CUSTOM、ZONE_AWARE、SPIcas.authn.throttle.hazelcast.cluster.core.logging-typeslf4jHazelcast 日志适配jdk、log4j、slf4j、nonecas.authn.throttle.hazelcast.cluster.core.max-no-heartbeat-seconds300节点心跳超时秒数超过则认为节点死亡cas.authn.throttle.hazelcast.cluster.core.map-merge-policyPUT_IF_ABSENTMap 合并策略PUT_IF_ABSENT、HIGHER_HITS、DISCARD、PASS_THROUGH、EXPIRATION_TIME、LATEST_UPDATE、LATEST_ACCESScas.authn.throttle.hazelcast.cluster.core.max-size85Map 最大条目数cas.authn.throttle.hazelcast.cluster.core.max-size-policyUSED_HEAP_PERCENTAGE上限策略FREE_HEAP_PERCENTAGE、FREE_HEAP_SIZE、FREE_NATIVE_MEMORY_PERCENTAGE、FREE_NATIVE_MEMORY_SIZE、PER_NODE、PER_PARTITION、USED_HEAP_PERCENTAGE、USED_HEAP_SIZE、USED_NATIVE_MEMORY_PERCENTAGE、USED_NATIVE_MEMORY_SIZEcas.authn.throttle.hazelcast.cluster.core.eviction-policyLRU驱逐策略LRU、LFU、NONEcas.authn.throttle.hazelcast.cluster.core.backup-count1同步备份副本数范围 06。设为 0 表示不备份性能优先cas.authn.throttle.hazelcast.cluster.core.async-backup-count0异步备份副本数。异步备份不阻塞主操作cas.authn.throttle.hazelcast.cluster.core.timeout5TCP/IP 配置与成员加入集群的连接超时秒cas.authn.throttle.hazelcast.cluster.core.cp-member-count0CP 子系统成员数CP 子系统至少需要 3 个成员Hazelcast 集群网络cas.authn.throttle.hazelcast.cluster.network对应属性类HazelcastNetworkClusterPropertiesHazelcastNetworkClusterProperties.java属性默认值说明cas.authn.throttle.hazelcast.cluster.network.tcpip-enabledtrue是否启用 TCP/IP join 机制。新成员通过连接一个或多个已知成员来获知集群全貌cas.authn.throttle.hazelcast.cluster.network.members[localhost]集群已知成员列表必须包含所有 CAS 节点含当前节点可用逗号分隔多个地址如10.11.12.1,10.11.12.2cas.authn.throttle.hazelcast.cluster.network.port5701Hazelcast 成员间通信端口cas.authn.throttle.hazelcast.cluster.network.port-auto-incrementtrue是否允许端口自动递增。设为false可固定单端口测试用例中即固定为5710cas.authn.throttle.hazelcast.cluster.network.outbound-ports空出站端口定义列表cas.authn.throttle.hazelcast.cluster.network.local-address无服务器 socket 绑定的本机地址覆盖值cas.authn.throttle.hazelcast.cluster.network.public-address无对外广播给其他成员与客户端的公共地址cas.authn.throttle.hazelcast.cluster.network.network-interfaces无允许使用的网卡接口支持*与-范围通配如10.3.10.*、10.3.10.4-18逗号分隔cas.authn.throttle.hazelcast.cluster.network.ipv4-enabledtrue是否仅使用 IPv4 协议栈部分平台如 AWS 不支持 IPv6默认关闭 IPv6Hazelcast 网络 TLS 加密cas.authn.throttle.hazelcast.cluster.network.sslHazelcast 支持通过 TLSTransport Layer Security协议配合密钥库key store与信任库trust store在集群成员之间、以及成员与客户端之间建立端到端的 socket 级加密通信。对应属性类HazelcastNetworkSslPropertiesHazelcastNetworkSslProperties.java。注意Hazelcast SSL 属于企业版特性启用该功能需要合法的 Hazelcast Enterprise License。CAS 在启用 SSL 后会使用配置的密钥库自动初始化 SSL 上下文并提供一个默认的 SSL context factory 实现来引导配置。主要属性如下属性默认值说明cas.authn.throttle.hazelcast.cluster.network.ssl.protocolTLSTLS/SSL 协议算法建议明确版本如TLSv1.2cas.authn.throttle.hazelcast.cluster.network.ssl.keystore无密钥库文件路径使用双向认证时必需cas.authn.throttle.hazelcast.cluster.network.ssl.keystore-password无访问密钥库中密钥的口令cas.authn.throttle.hazelcast.cluster.network.ssl.key-store-typeJKS密钥库类型常用还有PKCS12cas.authn.throttle.hazelcast.cluster.network.ssl.trust-store无信任库文件路径存放受信任证书集合cas.authn.throttle.hazelcast.cluster.network.ssl.trust-store-typeJKS信任库类型cas.authn.throttle.hazelcast.cluster.network.ssl.trust-store-password无解锁信任库的口令cas.authn.throttle.hazelcast.cluster.network.ssl.mutual-authentication无双向认证REQUIRED强制客户端证书或OPTIONAL请求但不强制cas.authn.throttle.hazelcast.cluster.network.ssl.cipher-suitesJVM 全部支持套件允许使用的密码套件逗号分隔cas.authn.throttle.hazelcast.cluster.network.ssl.trust-manager-algorithm/key-manager-algorithm无提供信任管理器 / 认证密钥的算法名称Linux 熵源性能提示在 Linux 下JVM 默认使用/dev/random生成随机数。如果系统熵不足以跟上随机数的消耗速率加解密可能阻塞长达数分钟。可通过设置系统属性-Djava.security.egdfile:/dev/./urandom缓解。需要注意若熵确实不足该选项不会阻塞返回的随机值理论上可能更容易遭受密码学攻击因此应权衡使用。与节流核心配置联动Hazelcast 存储只是节流记录的载体节流的判定策略仍由cas.authn.throttle下的核心配置决定属性模型见 ThrottleProperties.java失败判定cas.authn.throttle.failure对应ThrottleFailurePropertiesThrottleFailureProperties.java属性默认值说明cas.authn.throttle.failure.codeAUTHENTICATION_FAILED记录到审计日志的失败动作码标识认证失败事件cas.authn.throttle.failure.threshold-1阈值内的失败登录次数cas.authn.throttle.failure.range-seconds-1阈值对应的时间区间秒cas.authn.throttle.failure.throttle-window-seconds0账号保持锁定/节流状态的秒数超过该时间后释放。不设置则按失败阈值与速率计算阈值速率Threshold Rate失败阈值速率按threshold / rangeSeconds计算。例如threshold1、rangeSeconds3时速率为0.333333。一次认证请求是否被节流取决于该请求的提交速率当前时间与上一次提交时间的差值的倒数是否超过失败阈值速率——超过 1 次/3 秒的失败速率通常被视为自动化认证尝试是制定节流策略的合理依据。无论策略如何都需在安全与可用性之间权衡过于严格可能阻止合法认证。核心与调度cas.authn.throttle.core / cas.authn.throttle.schedulecas.authn.throttle.coreThrottleCoreProperties.javausername-parameter从请求中提取用户名的参数名、header-name从请求头提取值的头名、app-code审计日志中的应用标识默认CAS。cas.authn.throttle.scheduleSchedulingProperties.java节流记录的后台清理任务。ThrottleProperties构造器中将其默认设为enabledtrue、start-delayPT10S、repeat-intervalPT30S。可选cron-expression与cron-time-zone当使用 cron 表达式时必须将 start delay 与 repeat interval 置空。该调度周期直接决定了 Hazelcast 节流 Map 中记录的最大空闲存活时长见下文源码分析。源码级实现原理自动配置与ipMap的创建CasHazelcastThrottlingAutoConfiguration.java 是模块装配的入口其核心逻辑定义常量MAP_KEY ipMap作为分布式 Map 的名字通过Qualifier(casTicketRegistryHazelcastInstance)注入 CAS 已有的 Hazelcast 实例该实例同时服务于 ticket registry体现复用同一集群的部署思路将cas.authn.throttle.schedule.repeat-interval解析为秒作为 Map 条目的最大空闲时间maxIdleSeconds调用HazelcastConfigurationFactory.buildMapConfig(hz, MAP_KEY, timeout)构建 Map 配置并注册到 HazelcastConfig返回HazelcastMapThrottledSubmissionsStore以throttleSubmissionStore为 bean 名装配。Map 配置的构建细节在 HazelcastConfigurationFactory.buildMapConfig 中可见默认非 replicated情况下会生成标准MapConfig应用maxSizePolicy、maxSize、evictionPolicy、backupCount、asyncBackupCount、mapMergePolicy等集群核心配置设置maxIdleSeconds为节流调度周期并使用二进制内存格式InMemoryFormat.BINARY若replicatedtrue则生成ReplicatedMapConfig并应用asyncFillup。节流记录的存储与判定HazelcastMapThrottledSubmissionsStoreHazelcastMapThrottledSubmissionsStore.java继承自 BaseMappableThrottledSubmissionsStore.java后者实现了接口 ThrottledSubmissionsStore.java 的put、get、contains、remove、clear、entries、exceedsThreshold、release等方法。其核心判定逻辑提交速率submissionRate 1000.0 / (now - entry)即两次提交时间差的毫秒数换算为次/秒超阈值判定exceedsThreshold比较当前提交速率与阈值速率若前者大于后者则请求将被节流释放逻辑release会逐条检查——已过期的直接删除仍在expiration窗口内的保留提交速率低于阈值速率的记录被释放删除。Hazelcast 实现唯一重写的方法是removeIf它将底层Map强转为IMap使用hzMap.removeAll(Predicate)将条件判断下推至 Hazelcast 集群执行而不是在本地迭代删除从而保证多节点数据一致性。单条节流记录的数据结构ThrottledSubmissionThrottledSubmission.java包含id、keyIP 或 IP用户名、valueUTC 提交时间、username、clientIpAddress与expiration并提供hasExpiredAlready()与isStillInExpirationWindow()两个过期判断方法。请求拦截与后台清理节流的触发位于认证请求拦截器链中AbstractInMemoryThrottledSubmissionHandlerInterceptorAdapterAbstractInMemoryThrottledSubmissionHandlerInterceptorAdapter.java在认证失败时构造ThrottledSubmission并put进存储在请求进入时先检查该 key 是否仍在节流窗口内、再调用exceedsThreshold判定是否需要拦截release()则委托给存储的release(thresholdRate)。后台清理由 InMemoryThrottledSubmissionCleaner.java 驱动其Scheduled注解的默认值为initialDelayStringPT10S、fixedDelayStringPT15S可通过cas.authn.throttle.schedule.*覆盖每次运行会遍历所有ThrottledSubmissionHandlerInterceptor并调用release()从而周期性地从 Hazelcast Map 中淘汰过期与可释放的记录。验证与测试模块自带集成测试 CasHazelcastThrottlingConfigurationTests.java它同时加载了 Hazelcast Ticket Registry 自动配置与本模块自动配置并以真实属性启动cas.authn.throttle.hazelcast.cluster.network.port-auto-incrementfalse cas.authn.throttle.hazelcast.cluster.network.port5710 cas.authn.throttle.hazelcast.cluster.core.instance-namethrottlehzstore测试流程完整覆盖存储生命周期注入throttleSubmissionStorebean →put一条记录 →get断言可读取 → 断言entries().count()非零 →removeIf按条件删除 →remove按 key 删除 → 断言条目数为 0。该测试验证了ThrottledSubmissionsStore各操作在 Hazelcast 后端下的正确行为可作为自定义扩展时的参考模板。高可用与多节点部署注意事项根据 Configuring-Authentication-Throttling-Failure.md 的说明CAS 的节流组件适用于满足推荐 HA 架构的部署场景负载均衡启用**会话亲和session affinity**时内存版组件可用亲和性按源 IP 路由来自固定位置的攻击者会绑定到同一 CAS 节点节流记录因此完整而分布式攻击请求被不确定地路由到不同节点会让内存版组件记录分散且攻击源本身多变精确统计本就无意义——节流组件假定恒定源 IP 才能有效跟踪关键结论登录节流组件不足以检测或阻止分布式密码暴力破解无论使用内存还是 Hazelcast 存储都应配合其他防护手段。选用 Hazelcast 存储的核心收益在于当集群较大、会话亲和无法严格保证时ipMap的分布式特性让所有节点共享同一份失败记录节流判定不再依赖请求是否命中同一节点从而在保证一致性的同时简化运维对路由策略的依赖。配置时请务必正确维护cluster.network.members列表包含全部 CAS 节点并确保cluster.network.port在各节点间可达若启用 TLS 加密还需为所有节点配置一致的信任库并准备 Hazelcast Enterprise License。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS 认证失败限流Authentication Throttling配置指南Apereo CAS 认证失败限流Authentication Throttling配置指南 CAS 提供了一套内建的登录失败限流机制用于限制连续失败的登后端认证鉴权单点登录Apereo CAS OIDC 认证的 MongoDb JWKS 存储实战指南Apereo CAS OIDC 认证的 MongoDb JWKS 存储实战指南 本篇技术指南围绕 Apereo CAS 的 OpenID Connect 认证能后端认证鉴权单点登录Apereo CAS 认证事件 Redis 存储Redis Authentication Events 配置与实现详解Apereo CAS 认证事件 Redis 存储Redis Authentication Events 配置与实现详解 在 Apereo CAS 中认证事件后端认证鉴权单点登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站