安全最佳实践
编辑安全最佳实践编辑
在为 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)编辑
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 参数中。
- 确保敏感请求数据不会转发到外部资源。例如,复制客户端请求标头并使用它们发出另一个请求可能会意外泄露用户的凭据。