安全最佳实践

编辑

为 Kibana 编写代码时,请务必遵循以下最佳实践,以避免常见的漏洞。请参阅所包含的开放 Web 应用程序安全项目 (OWASP) 参考资料,以了解有关这些类型攻击的更多信息。

跨站点脚本攻击 (XSS)

编辑

XSS 的 OWASP 参考资料

XSS 是一类攻击,其中恶意脚本被注入到易受攻击的网站中。Kibana 通过使用 React 框架安全地编码页面中呈现的数据、使用 EUI 框架自动清理链接以及使用限制性的 Content-Security-Policy 标头来防御这种攻击。

最佳实践

  • 检查可能导致浏览器 DOM 中出现未转义的用户输入的危险函数或赋值。避免使用

  • 如果绝对需要使用上述不安全的函数或赋值,请遵循这些 XSS 防御规则,以确保用户输入不会插入到不安全的位置,并且已正确转义。
  • 使用 EUI 组件来构建 UI,尤其是在呈现 href 链接时。否则,在呈现链接之前清理用户输入,以确保它们不使用 javascript: 协议。
  • 不要使用 evalFunction_.template 函数 — 这些函数受到 ESLint 规则的限制。
  • 在客户端代码中使用 setTimeoutsetInterval 时要小心。如果攻击者可以操纵参数并将字符串传递给其中一个,则它会被动态评估,这等同于危险的 eval 函数。

跨站点请求伪造 (CSRF/XSRF)

编辑

CSRF 的 OWASP 参考资料

CSRF 是一类攻击,其中用户被迫在他们已登录的易受攻击的网站上执行操作,通常是在他们不知情的情况下。Kibana 通过要求 API 端点使用自定义请求标头来防御这种攻击。有关更多信息,请参阅API 请求标头

最佳实践

远程代码执行 (RCE)

编辑

命令注入的 OWASP 参考资料代码注入的 OWASP 参考资料

RCE 是一类攻击,其中攻击者在易受攻击的服务器上执行恶意代码或命令。Kibana 通过使用 ESLint 规则来限制易受攻击的函数,以及通过钩入或强化第三方依赖项中这些函数的使用来防御这种攻击。

最佳实践

  • 不要使用 evalFunction_.template 函数 — 这些函数受到 ESLint 规则的限制。
  • 不要使用动态 require
  • 检查模板库的使用情况。确保用户提供的输入不会影响模板,并且仅用作呈现模板的数据。
  • 当使用任何用户输入或用户控制的参数生成子进程时,要格外小心。

原型污染

编辑

原型污染是 JavaScript 环境特有的攻击。攻击者可以滥用 JavaScript 的原型继承来“污染”应用程序中的对象,这通常被用作 XSS 或 RCE 漏洞的载体。Kibana 通过强化敏感函数(例如 child_process 公开的函数),以及默认要求对所有 HTTP 路由进行验证来防御这种攻击。

最佳实践

  • 检查 anObject[a][b] = c 的实例,其中 abc 由用户输入控制。这包括以下逻辑代码步骤可以通过完全不同的操作在单独的文件中执行,或者通过递归使用动态操作的代码路径。
  • 验证所有用户输入,包括 API URL 参数、查询参数和有效负载。最好使用只允许特定键和值的模式。至少,实现一个拒绝列表,以防止在对象键中使用 __proto__prototype.constructor
  • 在调用生成新进程或从字符串执行代码生成的 API 时,通过检查 Object.hasOwnProperty 是否具有来自对象的 API 参数来防止原型污染。例如,已失效的 Code 应用程序的spawnProcess 函数。

    • 常见的 Node.js 攻击者:child_process.spawnchild_process.execevalFunction('some string')vm.runInContext(x)vm.runInNewContext(x)vm.runInThisContext()
    • 常见的客户端攻击者:evalFunction('some string')setTimeout('some string', num)setInterval('some string', num)

另请参阅

服务器端请求伪造 (SSRF)

编辑

SSRF 的 OWASP 参考资料

SSRF 是一类攻击,其中易受攻击的服务器被迫发出意外的请求,通常是向 HTTP API 发出请求。这通常被用作信息泄露或注入攻击的载体。

最佳实践

  • 确保 Kibana 服务器的所有出站请求都使用硬编码的 URL。
  • 如果使用用户输入来构造出站请求的 URL,请确保使用允许列表来验证端点,并且用户输入已正确转义。理想情况下,允许列表应在 kibana.yml 中设置,因此只有服务器管理员才能更改它。

    • 当使用 Elasticsearch 客户端的 transport.request 时,这一点尤其重要,因为不会执行自动转义。
    • 请注意,URL 很难正确验证;用户输入的确切匹配验证是最可取的,而 URL 解析或 RegEx 验证只有在绝对必要时才应使用。

反向标签劫持

编辑

反向标签劫持的 OWASP 参考资料

反向标签劫持是一种攻击,其中使用指向恶意页面的链接来重写易受攻击的父页面。这通常用作网络钓鱼攻击的载体。Kibana 通过使用 EUI 框架来防御这种攻击,该框架会自动将 rel 属性添加到锚标记、按钮和其他易受攻击的 DOM 元素。

最佳实践

  • 尽可能使用 EUI 组件来构建 UI。否则,请确保具有 href 属性的任何 DOM 元素也指定了 rel="noreferrer noopener" 属性。有关更多信息,请参阅OWASP HTML5 安全备忘单
  • 如果使用非 EUI markdown 渲染器,请为渲染的链接使用自定义链接渲染器。

信息泄露

编辑

信息泄露不是一种攻击,但它描述了何时意外泄露敏感信息。这可能是配置信息、堆栈跟踪或其他用户无权访问的数据。此问题无法通过单一的安全控制来解决,但从高层次来看,Kibana 依赖 hapi 框架来自动修订 HTTP 5xx 响应有效负载中的堆栈跟踪和详细错误消息。

最佳实践

  • 查找可能意外泄露敏感信息的实例,尤其是在错误消息、UI 和暴露给用户的 URL 参数中。
  • 确保敏感的请求数据不会转发到外部资源。例如,复制客户端请求标头并使用它们来发出另一个请求可能会意外暴露用户的凭据。