安全最佳实践
编辑安全最佳实践
编辑为 Kibana 编写代码时,请务必遵循以下最佳实践,以避免常见的漏洞。请参阅所包含的开放 Web 应用程序安全项目 (OWASP) 参考资料,以了解有关这些类型攻击的更多信息。
跨站点脚本攻击 (XSS)
编辑XSS 是一类攻击,其中恶意脚本被注入到易受攻击的网站中。Kibana 通过使用 React 框架安全地编码页面中呈现的数据、使用 EUI 框架自动清理链接以及使用限制性的 Content-Security-Policy
标头来防御这种攻击。
最佳实践
-
检查可能导致浏览器 DOM 中出现未转义的用户输入的危险函数或赋值。避免使用
-
React:
dangerouslySetInnerHtml
。 -
浏览器 DOM:
Element.innerHTML
和Element.outerHTML
。
-
React:
- 如果绝对需要使用上述不安全的函数或赋值,请遵循这些 XSS 防御规则,以确保用户输入不会插入到不安全的位置,并且已正确转义。
- 使用 EUI 组件来构建 UI,尤其是在呈现
href
链接时。否则,在呈现链接之前清理用户输入,以确保它们不使用javascript:
协议。 - 不要使用
eval
、Function
和_.template
函数 — 这些函数受到 ESLint 规则的限制。 - 在客户端代码中使用
setTimeout
和setInterval
时要小心。如果攻击者可以操纵参数并将字符串传递给其中一个,则它会被动态评估,这等同于危险的eval
函数。
跨站点请求伪造 (CSRF/XSRF)
编辑CSRF 是一类攻击,其中用户被迫在他们已登录的易受攻击的网站上执行操作,通常是在他们不知情的情况下。Kibana 通过要求 API 端点使用自定义请求标头来防御这种攻击。有关更多信息,请参阅API 请求标头。
最佳实践
-
确保所有 HTTP 路由都已在Kibana HTTP 服务中注册,以便利用自定义请求标头的安全控制。
- 请注意,HTTP GET 请求不需要自定义请求标头;任何更改数据的路由都应遵守 HTTP 规范并使用不同的方法(PUT、POST 等)
远程代码执行 (RCE)
编辑命令注入的 OWASP 参考资料,代码注入的 OWASP 参考资料
RCE 是一类攻击,其中攻击者在易受攻击的服务器上执行恶意代码或命令。Kibana 通过使用 ESLint 规则来限制易受攻击的函数,以及通过钩入或强化第三方依赖项中这些函数的使用来防御这种攻击。
最佳实践
- 不要使用
eval
、Function
和_.template
函数 — 这些函数受到 ESLint 规则的限制。 - 不要使用动态
require
。 - 检查模板库的使用情况。确保用户提供的输入不会影响模板,并且仅用作呈现模板的数据。
- 当使用任何用户输入或用户控制的参数生成子进程时,要格外小心。
原型污染
编辑原型污染是 JavaScript 环境特有的攻击。攻击者可以滥用 JavaScript 的原型继承来“污染”应用程序中的对象,这通常被用作 XSS 或 RCE 漏洞的载体。Kibana 通过强化敏感函数(例如 child_process
公开的函数),以及默认要求对所有 HTTP 路由进行验证来防御这种攻击。
最佳实践
- 检查
anObject[a][b] = c
的实例,其中a
、b
和c
由用户输入控制。这包括以下逻辑代码步骤可以通过完全不同的操作在单独的文件中执行,或者通过递归使用动态操作的代码路径。 - 验证所有用户输入,包括 API URL 参数、查询参数和有效负载。最好使用只允许特定键和值的模式。至少,实现一个拒绝列表,以防止在对象键中使用
__proto__
和prototype.constructor
。 -
在调用生成新进程或从字符串执行代码生成的 API 时,通过检查
Object.hasOwnProperty
是否具有来自对象的 API 参数来防止原型污染。例如,已失效的 Code 应用程序的spawnProcess
函数。- 常见的 Node.js 攻击者:
child_process.spawn
、child_process.exec
、eval
、Function('some string')
、vm.runInContext(x)
、vm.runInNewContext(x)
、vm.runInThisContext()
- 常见的客户端攻击者:
eval
、Function('some string')
、setTimeout('some string', num)
、setInterval('some string', num)
- 常见的 Node.js 攻击者:
另请参阅
服务器端请求伪造 (SSRF)
编辑SSRF 是一类攻击,其中易受攻击的服务器被迫发出意外的请求,通常是向 HTTP API 发出请求。这通常被用作信息泄露或注入攻击的载体。
最佳实践
- 确保 Kibana 服务器的所有出站请求都使用硬编码的 URL。
-
如果使用用户输入来构造出站请求的 URL,请确保使用允许列表来验证端点,并且用户输入已正确转义。理想情况下,允许列表应在
kibana.yml
中设置,因此只有服务器管理员才能更改它。- 当使用 Elasticsearch 客户端的
transport.request
时,这一点尤其重要,因为不会执行自动转义。 - 请注意,URL 很难正确验证;用户输入的确切匹配验证是最可取的,而 URL 解析或 RegEx 验证只有在绝对必要时才应使用。
- 当使用 Elasticsearch 客户端的
反向标签劫持
编辑反向标签劫持是一种攻击,其中使用指向恶意页面的链接来重写易受攻击的父页面。这通常用作网络钓鱼攻击的载体。Kibana 通过使用 EUI 框架来防御这种攻击,该框架会自动将 rel
属性添加到锚标记、按钮和其他易受攻击的 DOM 元素。
最佳实践
- 尽可能使用 EUI 组件来构建 UI。否则,请确保具有
href
属性的任何 DOM 元素也指定了rel="noreferrer noopener"
属性。有关更多信息,请参阅OWASP HTML5 安全备忘单。 - 如果使用非 EUI markdown 渲染器,请为渲染的链接使用自定义链接渲染器。
信息泄露
编辑信息泄露不是一种攻击,但它描述了何时意外泄露敏感信息。这可能是配置信息、堆栈跟踪或其他用户无权访问的数据。此问题无法通过单一的安全控制来解决,但从高层次来看,Kibana 依赖 hapi 框架来自动修订 HTTP 5xx 响应有效负载中的堆栈跟踪和详细错误消息。
最佳实践
- 查找可能意外泄露敏感信息的实例,尤其是在错误消息、UI 和暴露给用户的 URL 参数中。
- 确保敏感的请求数据不会转发到外部资源。例如,复制客户端请求标头并使用它们来发出另一个请求可能会意外暴露用户的凭据。