2016-12-08 33 views
2

私はnginxの基本認証を使用していますが問題はありませんが、ユーザーが認証された別個の場所の数を制限したいのです 最終的な目標は、ウェブサイトはいくつかのデータをリアルタイムで「監視」しているので、別のIPから同じユーザ/パスの組み合わせを使用した場合、またはどちらのユーザもデータの取得を停止するか、 か、 。Nginxの基本認証と認証された場所の数

+0

「監視」はどのように行われますか?永続的な接続がnginx経由で開いたままになっていますか?同じユーザー/パスが使用されているときに望ましい動作は何ですか、http 403は行いますか?ユーザーは、同じIPからの複数のセッションを並行して持つことができますか? – ffeast

+0

1セッションあたり1セッション – forcewill

答えて

0

ユーザーはPCと携帯電話で同時にログインし、2つの異なるIPアドレスを持つことができるので、これは良い考えではないと思います。また、http-authはあなたが望むことをするようには設計されていません。ユーザーがログアウトせずに出ると、ip-addressを覚えて、何とか期限切れにする必要があります。セッションがどれくらい有効であるかを推測することは、全体的には難しいでしょう。もう1つの問題は、ほとんどのユーザーは静的IPを持っておらず、24時間ごとにプロバイダから切断されるということです。有効なログイン後にそれが発生した場合はどうなりますか?

この種の問題に対処する最も一般的な方法はセッションクッキーです。これらはワンタイムパスワードとして記述することができ、望みどおりに、または有効期限が切れるまで使用することができます。セッションIDは通常、ある種類のデータベースに保存され、これらのセッションをユニークにすることは大きな問題ではないため、必要なものになる可能性があります。幸いなことに、 ngx_http_auth_request_moduleは、この欠けている部分を実装するだけで、独自のnginx-moduleを開発することなく手に入れることができます(使用可能なモジュールについては、https://www.nginx.com/resources/wiki/modules/を参照してください)。

一方、そうしないでください。真剣に。あなたがセキュリティを気にかけているならば、すでに実証済みのものを再利用しようとしないでください。例えば。 ngx_http_auth_jwt_moduleは、OpenIDを使用することができます。これにより、サーバーに賢明なユーザーデータを保存する必要がなくなります(絶対に必要な場合を除き、誰もパスワードを保存しないため)。

これらの方法にはいずれもnginxモジュールが必要です。これらのモジュールは、ご使用のサーバーにインストールされていない可能性があります。それらを構築する権限がなければ、他の人が非ルートサーバーのためのソリューションを提案できるように、あなたの質問にそれを追加することを提案します。

さらに簡単にするには、毎回ダウンロードリンクを生成し、ip-addressとダウンロードリンクアドレスをデータベースに保存することを検討する必要があります。ユーザーがそのファイルをダウンロードし、完了したらエントリを削除します。そのためには Content-Disposition: attachment; filename=FILENAME -HTTP-Headerを使用することができます。download.phpは同様に呼び出されたファイルを保存しません。

また、ngx_http_auth_jwt_moduleを置き換えてhttp-authでOpenIDを使用するjavascriptを見つけることもできます。これは、ajaxで認証を行うことも可能であるため、機能します。

最後に、http-authを実行したい場合は、デフォルトではこの認証方法でパスワードが暗号化されないため、HTTPSも使用します。

0

あなたがしたいことは珍しいので、プロセスを処理するための多くのロジックを記述する必要があります。

コードでは、ログインしているユーザーごとにユーザーIDとIPアドレスのペアを格納し、これに対してそれぞれのログイン試行を検証する必要があります。以前の答えが指摘したように、ログインなどを期限切れにする必要があります。基本的には、セッションハンドラをロールバックする必要があります。

これは不可能ではなく、特に難しいことではありませんが、Nginxが利用できるスクリプト言語の1つで、Nginxの限られたエコシステムのために推奨されていないPerlまたは強く推奨されるLua (例えばCloudflareで使用される)大規模なNginxのluaエコシステムのために。

3rd party Nginx Lua Moduleと関連するモジュールでコンパイルするか、Nginxをアンインストールするだけで、すでに含まれている必要があるすべてのものが含まれているOpenresty Bundleを使用する必要があります。

ここではいくつかのツールは、あなたのビルディングブロック、あなたがすることなく、希望する場合は、直接nginxのでOpenrestyものを実装することができます

Openresty Session Library

Openresty Redis Session Library

Openresty Encrypted Session Module

ノートとして使用することができますそれはNginxと便利なモジュールの単なる便利なバンドルですので、Openrestyを実行します。