web-dev-qa-db-ja.com

CORSヘッダーを使用しながらApacheプロキシに基本認証を追加するにはどうすればよいですか?

バックグラウンド

サーバーメトリクスのグラフを表示するためにgrafanaを使用します。 GrafanaはJSアプリであり、この場合、グラファイトからデータを取得し、elasticsearchに検索クエリを保存しています。今のところ同じマシン上にありますが、3つのサービスすべてに独自の仮想ホストがあります。 JSルールのため、graphite-およびelasticsearch-vhostにCORSヘッダーを追加しました。グラファイトはpython/Djangoアプリであるため、graphite-vhostはWSGIへのルーティングリクエストです。 elasticsearch-vhostは、ポート443からlocalhost:9200にデータを転送するためのリバースプロキシです。これは、elasticsearch-serviceを直接世界に公開しないようにするのに役立ち、CORSヘッダーを追加する場所も提供します。これまでのところ、これは機能します。grafanaは両方のサービスと通信できます。

問題が発生する

Basic Authをgrafanaとgraphite-hostsに追加しました。これらは正常に機能し、期待どおりです。 grafanaは、データを取得して表示することができます。

Basic Authをelasticsearch-vhostに追加すると、問題が発生します。 Auth-settingsを<Location / >-ブロックに追加できますが、CORSヘッダーが無効になっているようです。認証を有効にすると、ブラウザまたはcurlでelasticsearchを使用できます。

ただし、grafanaはelasticsearchで構成済みのダッシュボードを検索できません。

GrafanaはGET-リクエストで始まるため、検索はOPTIONSよりも複雑なようです。これは401エラーで失敗します。おかしなことに、grafanaは既知のダッシュボード(単純なGET)を取得できます。

ヘッダーでのHTTPメソッドの制限については触れていません。

だから、これを要約すると:

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

Apacheの構成を確認したい場合は、どの部分を教えてください。「念のため」、かなりの長さの3つのvhostを投稿したくありません。

1
kronn

私は常にOPTIONS-リクエストを許可することでこれを解決しました。これらのリクエストは、サーバーがそこにあるかどうかを確認するための「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>

よりクリーンなアプローチは、グラファナとリクエストの作成方法を変更することですが、これにより、新しい問題を開かずに当面の問題を解決できます。

これは現在、セキュリティの観点から事態を悪化させることはありません。

  • OPTIONSには現在、詳細情報を公開するための本文がありません
  • OPTIONSは、常に何もしないという意味でべき等です
  • サーバーの単なる存在は、より重いGET /で確認することもできます。
  • OPTIONS以外の他のすべてのHTTPメソッドはパスワードで保護されています
3
kronn