安全
在为 Kibana 编写代码时,请遵循这些最佳实践以避免常见漏洞。对 Open Web Application Security Project (OWASP) 的引用更深入地解释了每一类攻击。
本页面为专题参考。有关潜在承诺,请参阅“默认构建安全软件”原则。
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 是一类攻击,用户在不知情的情况下被迫在其已登录的易受攻击网站上执行操作。Kibana 通过要求 API 端点使用自定义请求头来防御此类攻击。有关更多信息,请参阅API 请求头。
最佳实践
- 确保所有 HTTP 路由都已向 Kibana HTTP 服务注册,以利用自定义请求头安全控制。
- 请注意,HTTP GET 请求不需要自定义请求头;任何更改数据的路由都应遵循 HTTP 规范并使用不同的方法(PUT、POST 等)
命令注入的 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 参数、查询参数和有效负载。最好使用仅允许特定键和值的模式 (schema)。至少要实现一个拒绝列表,以防止在对象键中使用
__proto__和prototype.constructor。 - 在调用生成新进程或从字符串执行代码生成的 API 时,通过检查 API 的参数是否源自 Object 来防范原型污染(检查
Object.hasOwnProperty)。一个例子是已废弃的 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 是一类攻击,易受攻击的服务器被迫发出非预期的请求,通常是针对 HTTP API。这通常被用作信息泄露或注入攻击的载体。
最佳实践
- 确保来自 Kibana 服务器的所有出站请求都使用硬编码的 URL。
- 如果用户输入被用于构造出站请求的 URL,请确保使用允许列表来验证端点,并确保正确转义用户输入。理想情况下,应在
kibana.yml中设置允许列表,以便只有服务器管理员可以更改它。- 在使用带有 Elasticsearch 客户端的
transport.request时,这一点尤为重要,因为不会执行自动转义。 - 请注意,URL 非常难以正确验证;最好使用用户输入的精确匹配验证,而仅在绝对必要时才使用 URL 解析或正则表达式验证。
- 在使用带有 Elasticsearch 客户端的
反向 Tabnabbing 是一种攻击,它利用指向恶意页面的链接来重写易受攻击的父页面。这通常被用作网络钓鱼攻击的载体。Kibana 通过使用 EUI 框架进行防御,该框架会自动向锚点标签、按钮和其他易受攻击的 DOM 元素添加 rel 属性。
最佳实践
- 尽可能使用 EUI 组件构建 UI。否则,请确保任何具有
href属性的 DOM 元素也指定了rel="noreferrer noopener"属性。有关更多信息,请参考 OWASP HTML5 安全备忘单。 - 如果使用非 EUI 的 markdown 渲染器,请为渲染的链接使用自定义链接渲染器。
信息泄露不是一种攻击,但它描述了敏感信息被意外泄露的情况。这可能是配置信息、堆栈跟踪或其他用户无权访问的数据。此问题无法通过单一安全控制来解决,但在高层面上,Kibana 依赖 hapi 框架自动屏蔽 HTTP 5xx 响应负载中的堆栈跟踪和详细错误消息。
最佳实践
- 查找可能意外泄露敏感信息的实例,特别是在错误消息、UI 以及向用户暴露的 URL 参数中。
- 确保敏感的请求数据不会被转发到外部资源。例如,复制客户端请求头并使用它们来发起另一个请求可能会意外泄露用户的凭据。