--- title: "开启安全功能 ES 集群就安全了吗?" date: 2023-12-26 lastmod: 2023-12-26 description: "通过网关增强ES集群安全,设置认证失败延迟返回与实时监控,有效防止暴力破解。配置告警规则及时响应,提升密码安全性。" tags: ["Gateway"] summary: "背景 # 经常跟 ES 打交道的朋友都知道,现在主流的 ES 集群安全方案是:RBAC + TLS for Internal + HTTPS 。 作为终端用户一般只需要关心用户名和密码就行了。作为管理和运维 ES 的人员来说,可能希望 ES 能提供密码策略来强制密码强度和密码使用周期。遗憾的是 ES 对密码强度和密码使用周期没有任何强制要求。如果不注意,可能我们天天都在使用“弱密码”或从不修改的密码(直到无法登录)。而且 ES 对连续的认证失败,不会做任何处理,这让 ES 很容易遭受暴力破解的入侵。 那还有没有别的办法,进一步提高安全呢? 其实,网关可以来帮忙。 虽然网关无法强制提高密码复杂度,但可以提高 ES 集群被暴力破解的难度。 大家都知道,暴力破解–本质就是不停的“猜”你的密码。以现在的 CPU 算力,一秒钟“猜”个几千上万次不过是洒洒水,而且 CPU 监控都不带波动的,很难发现异常。从这里入手,一方面,网关可以延长认证失败的过程–延迟返回结果,让破解不再暴力。另一方面,网关可以记录认证失败的情况,做到实时监控,有条件的告警。一旦出现苗头,可以使用网关阻断该 IP 或用户发来的任何请求。 场景模拟 # 首先,用网关代理 ES 集群,并在 default_flow 中增加一段 response_status_filter 过滤器配置,对返回码是 401 的请求,跳转到 rate_limit_flow 进行降速,延迟 5 秒返回。 - name: default_flow filter: - elasticsearch: elasticsearch: prod max_connection_per_node: 1000 - response_status_filter: exclude: - 401 action: redirect_flow flow: rate_limit_flow - name: rate_limit_flow filter: - sleep: sleep_in_million_seconds: 5000 其次,对于失败的认证,我们可以通过 Console 来做个看板实时分析,展示。" --- ## 背景 经常跟 ES 打交道的朋友都知道,现在主流的 ES 集群安全方案是:RBAC + TLS for Internal + HTTPS 。 {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image.png" "" %}} 作为终端用户一般只需要关心用户名和密码就行了。作为管理和运维 ES 的人员来说,可能希望 ES 能提供密码策略来强制密码强度和密码使用周期。遗憾的是 ES 对密码强度和密码使用周期没有任何强制要求。如果不注意,可能我们天天都在使用“弱密码”或从不修改的密码(直到无法登录)。而且 ES 对连续的认证失败,不会做任何处理,这让 ES 很容易遭受暴力破解的入侵。 那还有没有别的办法,进一步提高安全呢? 其实,网关可以来帮忙。 虽然网关无法强制提高密码复杂度,但可以提高 ES 集群被暴力破解的难度。 大家都知道,暴力破解--本质就是不停的“猜”你的密码。以现在的 CPU 算力,一秒钟“猜”个几千上万次不过是洒洒水,而且 CPU 监控都不带波动的,很难发现异常。从这里入手,一方面,网关可以延长认证失败的过程--延迟返回结果,让破解不再暴力。另一方面,网关可以记录认证失败的情况,做到实时监控,有条件的告警。一旦出现苗头,可以使用网关阻断该 IP 或用户发来的任何请求。 ## 场景模拟 首先,用网关代理 ES 集群,并在 default_flow 中增加一段 [response_status_filter](https://docs.infinilabs.com/gateway/main/zh/references/filters/response_status_filter/) 过滤器配置,对返回码是 401 的请求,跳转到 rate_limit_flow 进行降速,延迟 5 秒返回。 ``` - name: default_flow filter: - elasticsearch: elasticsearch: prod max_connection_per_node: 1000 - response_status_filter: exclude: - 401 action: redirect_flow flow: rate_limit_flow - name: rate_limit_flow filter: - sleep: sleep_in_million_seconds: 5000 ``` {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image(1).png" "" %}} 其次,对于失败的认证,我们可以通过 Console 来做个看板实时分析,展示。 折线图、饼图图、柱状图等,多种展示方式,大家可充分发挥。 最后,可在 Console 的告警中心,配置对应的告警规则,实时监控该类事件,方便及时跟进处置。 ### 效果测试 先带上正确的用户名密码测试,看看返回速度。 {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image(2).png" "" %}} 0.011 秒返回。再使用错误的密码测试。 {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image(3).png" "" %}} 整整 5 秒多后,才回返结果。如果要暴力破解,每 5 秒钟甚至更久才尝试一个密码,这还叫暴力吗? ### 看板示例 此处仅仅是抛砖引玉,欢迎大家发挥想象。 {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image(4).png" "" %}} ### 告警示例 建立告警规则,用户 1 分钟内超过 3 次登录失败,就产生告警。 {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image(5).png" "" %}} 可在告警中心查看详情,也可将告警推送至微信、钉钉、飞书、邮件等。 {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image(6).png" "" %}} 查看告警详情,是 es 用户触发了告警。 {{% load-img "/img/blog/2023/prevent-brute-force-attacks-using-gateway/image(7).png" "" %}} 最后,剩下的工作就是对该账号的处置了。如果有需要可以考虑阻止该用户或 IP 的请求,对应的过滤器文档在[这里](https://docs.infinilabs.com/gateway/main/zh/references/filters/request_user_filter/),老规矩加到 default_flow 里就行了。如果小伙伴有其他办法提升 ES 集群安全,欢迎和我们一起讨论、交流。我们的宗旨是:让搜索更简单!