web-dev-qa-db-ja.com

許可されたユーザーのみが接続できるように、「localhost」上のサーバーを保護します

HTTPサーバーを実行するアプリケーション(IPythonノートブックなど)を検討します。これにより、(設計上)認証されたユーザーが任意のコードを実行できるようになります(これがIPythonの重要なポイントです。Jupyteret al、バグではありません)。

明らかに、サーバーを実行しているユーザー以外のユーザーが認証できるのは、惨事です。

これは、承認されたユーザーのみが適切な資格情報を提供できるようにし、これらの資格情報が適切なサーバーにのみ提供されるようにすることで実行できます。

これを完全に自動化された方法で処理したいと思います。

理想的な解決策は、TLSサーバーとクライアント証明書のようです。問題は、これには手動の厄介なセットアップが必要なことです。手動でセットアップするのではなく、サーバー自体で実行できるものにしたいのです。

注:サーバーはクライアントと同じユーザーとして実行されているため、クライアントブラウザーがユーザーごとの構成を保存するために使用するディレクトリへの書き込みアクセス権を持っています。 notは特権ユーザーとして実行されているため、ファイアウォールルールを変更することはできません。

完全ソリューションは、特定のサーバー証明書を適用し、サーバー固有のクライアント証明書を提供する方法です。これらはすべて、サーバープロセス(HTTPSを実行する単なるコマンドラインプログラムです)によって(外部的に)制御されます。サーバ)。

いいえ、サーバーを非特権ユーザーとして実行することはできません。これは本当にIDEブラウザをGUIとして使用するものです。それはneedsを呼び出したユーザーの権限で任意のコードを実行できるようにするためです。したがって、完全に安全な認証。

はい、127.0.0.1以外の接続を拒否できます。これは、同じマシン上の他のユーザーによるローカルの攻撃者に対しては役立ちません。

これは可能ですか、それともブラウザを埋め込む必要がありますか? Chromium Embedded FrameworkはTLS証明書の信頼の制御を処理しないため、役に立ちません。

5
Demi

両方のサーバーアプリケーションのコードを操作できると仮定して、サーバーの起動時に実行中のユーザーのみが読み取り可能なファイルにランダムな値をドロップし、それを認証トークンとして(直接または応答のソルトとして)使用します挑戦)。たとえば、起動時に簡単なスクリプトを使用してhttpパスワードを設定し、プレーンテキストをファイルにドロップできます。ただし、クライアント証明書と同様に、データをクライアントに取り込むプロセスは手動のままです。

onlyクライアントを書き直すことなくこれをユーザーに透過的に機能させる方法は、ブラウザーのCookieにトークンを入力してサーバーに書き込んだすべての承認済みユーザーが使用できるようにWebアプリケーションを構成することです。接続に特定のCookieを必要とし、割り当てられたポートでリッスンする構成ファイルは、識別されたユーザーとして実行しているサーバーを起動しましたしたがって、OSの認証メカニズムを使用して、最初に再認証を意味します。ただし、これはマスターサーバーインスタンスに多くの特権を与え、統合認証を複雑にすることを意味します。しかし、ポートとプロセスの管理は悪夢になります。

VMだけを与えることはできませんか?

1
symcbean