如何在使用 CORS 标头时向 apache 代理添加基本身份验证?

如何在使用 CORS 标头时向 apache 代理添加基本身份验证?

背景

我使用 grafana 来显示我们服务器指标的图表。Grafana 是一个 JS 应用程序,在我们的例子中,它从 graphite 获取数据并将搜索查询存储在 elasticsearch 中。所有这三个服务都有自己的 vhost,尽管目前它们在同一台机器上。由于 JS 规则,我在 graphite 和 elasticsearch-vhost 中添加了 CORS 标头。graphite-vhost 将请求路由到 WSGI,因为 graphite 是一个 python/django 应用程序。elasticsearch-vhost 是一个反向代理,用于将数据从端口转发443localhost:9200。这有助于不直接向世界开放 elasticsearch 服务,也为我提供了一个添加 CORS 标头的地方。到目前为止,这一切都是有效的:grafana 可以与这两种服务对话。

问题出现

我添加了Basic Authgrafana 和 graphite-hosts。它们工作正常,符合预期。grafana 能够检索和显示数据。

在添加Basic Auth到 elasticsearch-vhost 时,我遇到了问题。虽然我可以在<Location / >-block 中添加 Auth-settings,但它似乎禁用了 CORS-headers。激活身份验证后,我可以在浏览器或 curl 中使用 elasticsearch。

但是,grafana 无法在 elasticsearch 中搜索已配置的仪表板。

搜索似乎比 更复杂GET,因为 grafana 以OPTIONS-request 开头。这会失败并出现 401 错误。有趣的是,grafana 可以并且确实检索已知的仪表板(这是一个简单的GET)。

我没有在标头中提到 HTTP 方法的限制。

总结一下:

How can I add basic auth to an apache proxy while using CORS headers?

如果您想查看 apache 配置,请告诉我哪些部分,我不想“为了确保万无一失”而发布三个相当长的 vhost。

答案1

我通过始终允许OPTIONS-requests 解决了这个问题。这些请求仅用作“ping”,以检查服务器是否存在。

<Proxy *>
  Order deny,allow
  Allow from all

  AuthType Basic
  AuthBasicProvider file
  AuthUserFile /path/to/passwords

  # This allows OPTIONS-requests without authorization
  <LimitExcept OPTIONS>
    Require valid-user
  </LimitExcept>

</Proxy>

更干净的方法可能是改变 grafana 及其提出请求的方式,但这可以解决眼前的问题而不会引发新的问题。

从安全角度来看,这目前不会使情况变得更糟:

  • OPTIONS目前尚无机构能够透露更多信息
  • OPTIONS是幂等的,因为它总是什么都不做
  • 还可以使用更重的方法来检查服务器是否存在GET /
  • 所有其他 HTTP 方法均受OPTIONS密码保护

相关内容