セッション数を制限するには?


8

Webセッションを追跡してWebアプリに制限する方法が必要です。「セッション」は、上記のWebアプリのページを閲覧する単一のユーザーとして大まかに定義されます。次のように翻訳できます。

  • セッションは、レイヤーまたは使用可能なデータに応じて、または<clientIP,vHost>としてタプルとして定義されます<clientIP,serverIP,serverPort><cookie,vHost>
  • ユーザーが認証データを定義済みのログインURIに送信した後にセッションが開始します
  • ユーザーが定義されたログアウトURIに到達した後にセッションが終了する
  • クライアントが最後のオブジェクトを要求した後、指定されたタイムアウトの期限が切れると、セッションが終了します

指定されたセッション制限に達した後、次のユーザーはカスタムエラーページにリダイレクトされます。また、監視目的で現在のセッション数を追跡する方法と、監視サーバー(webappにクエリを定期的に発行している)をホワイトリストに登録して制限から除外する機能も必要です。

私が扱えるもの:

  • Webアプリケーションに独自のファームが定義され、リバースプロキシモードで実行されているRadWare AppDirector
  • Apache 2.2
  • SLES 11 SP2

他のオプションが残っていない場合は考慮しますが、追加のプロキシサーバーを使用しないことをお勧めします。

これらすべての背後にある理論的根拠は、前述のWebアプリが過負荷になりやすく、リクエストを不規則に拒否し始め、プロセスで(通常)フォームエントリデータを失う作業中のユーザーを怒らせます。過負荷状態になる可能性が低い制限を指定することにより、負荷が急上昇する可能性が高い場合にユーザーが後で戻るように指示される、明確に定義された障害状態を作成したいと考えています。

編集:Webアプリは3層の実装であり、最初の層(プレゼンテーション層、Apache vHostのCGIコードとして実装)はかなり単純化されており、アプリケーションサーバー間の基本的なエラー処理と要求負荷分散に限定されています。実行するWebサーバーに大きな負荷をかけることはありません。これが、AppDirectorファームで単なるフェールオーバーモード(負荷分散なし)で実行しているためです。

この時点以降はすべて基本的にブラックボックスです。データ層にはMSSQLデータベースがありますが、テーブル構造に関する意味のある情報をベンダーから入手することはほぼ不可能です。アプリケーションサーバーはクローズドソースであり、ベンダーは実装にかなり包括的なフレームワークを使用していますが、操作に関連するそれほど複雑でない質問には答えられないようです。


Webアプリの一般的な詳細を提供できますか?各vHostで同じですか?または、Webアプリから独立したソリューションが必要な場合があるため、詳細を提供しませんでしたか?独自のWebアプリですか?
lsmooth 2013年

接続が閉じられた後、非アクティブのため、誰かがセッションCookieを使用してセッションを再開できますか(アプリケーションのタイムアウトに達していない場合)?
マンジキ2013年

@jijixこれはボーダーケースであり、実装の複雑さを増す場合に気にしないほど珍しいと考えられています。それ以外は、「セッション制限をチェックせずにセッションを再開する」と指定するのが最善だと思います。
the-wabbit 2013年

私は通常、httpd-access-logの「典型的な」URLを数えることによってこれを行います。ここで話しているおおよその同時数は何ですか?おそらくスレッド制限がhttpd側でここで役立つかもしれませんか?
Nils

HAProxyが接続数を制限できることは知っています。しかし、あなたは少し違う何かを求めています...
Matt

回答:


5

あなたが最終的に解決しようとしている問題は、アプリケーションの能力にあります-そしてそれがあなたが問題を解決するべき場所です。あなたが言及したどのコンポーネント、HTTPアプリケーションのセッション管理とは何の関係もありません

iptablesの最近のモジュールで適用できるいくつかのトリックがあり、それが意図された目的とは逆の方法でfail2banを使用しています。これらのコンポーネントのレベルでアクセス制御を実装できますが、セッション数に関するアプリケーションからの公開された状態情報によって駆動されます。

監視目的で現在のセッション数を追跡する方法も必要です

とりあえず、アプリケーションがブラックボックスであり、変更/インストルメンテーションのスコープない(非常にありそうもない)と仮定すると、セッションCookieを含めることで、Apacheログからこの情報を取得できます。アクティブなCookieのリスト-ログアウトURLと一致するか、TTLに表示されていない場合は、リストからエントリを削除します。


上記の私の質問を忘れてください、これはまさに私が得ていたものです。
lsmooth 2013年

RadWare AppDirectorが少なくとも長期的な治療でこの問題を解決できないと確信していますか?-セッション制御は、他の方法で達成できるノードの過負荷を防ぐために要求されます。
Veniamin 2013年

あなたが他の場所スタック内のセッション管理をごまかすことができます上記の私が言ったように- -私はわからないんけど、そのくらいMUCHより困難は間違った場所にそれを行うこと。問題が発生している場所で問題を修正する方がはるかに簡単です。
symcbean 2013年

セッション管理の適切な場所が、アプリケーションまたは他の場所にノードごとに統合されたモジュールであると考える場合、AppDirectorレベルでロードバランシングと連携させる方法が明確ではありません。
Veniamin 2013年

セッション追跡にApacheログを使用するという考えには、いくつかのメリットがあります。残りについては-あなたは私がアプリを書いていないので、(もしあれば)今後の開発にほとんど影響を与えません。それを導入するのは私の決断ではなく、私の権限はそれが実行されるインフラストラクチャに限定されています。アプリケーションが最適ではないという点は管理​​者に明らかにされていますが、これが何かを変更できたとしても、変更によってかなりの時間がかかります。したがって、私の現在の仕事は、「できるだけ良い」操作モードを見つけることです。
the-wabbit 2013年

1

これは正確にはあなたが求めているものではありませんが、私はF5ロードバランサーで次のことをすでに行っています:

  • ログインページで投稿リクエストの数をカウントします。
  • 1秒あたりのログイン数が最初の制限を超えている場合、ユーザーを遅らせます
  • 1秒あたりのログイン数が2番目の制限を超えている場合、ユーザーをメンテナンスページに送ります

ウェブサイトは時々重い負荷(競馬)を受けていたので、それは助けになりました。


アイデアをありがとう、私は同様の何かを実装できるかどうかAppDirectorの人に確認する必要があります。
the-wabbit 2013年

@ syneticon-dj:このようなものを実装できるかどうかを確認する必要がある場合(実際には問題を解決できませんが、BTW)、アプリケーションを修正できない場合は、実際に問題が山積しています。リフレクションでは、問題を解決するための少なくとも2つの方法を考えることができますが、どちらも技術的に要求が厳しいため、正しく実装しないと、問題は改善するのではなく悪化します。ここに来るより多くの助けが必要です。
symcbean 2013年

@symcbean私ができることは何も問題を解決しません。ベンダーの開発者とサポートスタッフ内の資格の欠如と、このアプリケーションを無知で使用することの決定です。他にアイデアがありましたら、お聞かせください。「要求が厳しい」ことは、日常業務の複雑さを増さない限り問題ではありません。
the-wabbit 2013年

1

この問題は、RadWare AppDirectorを使用することで解決できます。また、(完全を期すために)以下のコメントの優れた結果に従って、Apache mod_securityを使用することで解決できる可能性があります。

AppDirectorソリューションの場合、同じバックエンドサーバーにマッピングする2つのファームを作成できると思います。これらのファームには、さまざまな基準と運用条件を適用できます。1つのファームは「デフォルト」になり、もう1つは「セッション」として定義したURIに応答します。後者の場合、ロードバランサーで受け入れるセッションの量に制限があります。

これからは、次の2つの理由から、「ログイン」を「セッション」に置き換えます。

  • ユーザーが認証されるという望ましい状態を明確に定義するため、あいまいさを回避できます。
  • AppDirectorユーザーガイドとGUIは、「接続」という用語を再定義して、すべての実用的な目的で「セッション」と同じ意味を持つようにしています。以下を参照してください。これにより、混乱を避けることができます。

「ログインした」ファームが選択した接続制限に達した場合に、申し訳ありませんページを表示することもできます。

方法を説明する前に、AppDirector製品の操作経験がないことを明確に示す必要がありますが、競合するわずかに高度ではないロードバランサーを毎日管理します。私が使用する製品は、このシナリオをすぐに実行できます。AppDirectorユーザーガイドと、AppDirectorについても同様であることを示唆するオンラインドキュメントについての情報を見つけました。ただし、概念は似ていますが、用語は異なります。私は言葉遣いに関してローマ時代の行動をしているだけであり、あまりにも明らかに無知なバカであることがなく、それをかなり正しくすることを望んでいます。

最大の障害は、アクティブな顧客でない限り利用できないマニュアルへのアクセスを取得することでした。いくつかグーグルすることで、古すぎない古いバージョンを見つけることができました。ナレッジベースの記事とこのリンクRadware AppDirector – Configuration:Basic Applicationも見つけました。

以下は、主にユーザーガイドで解釈されるソリューションドラフトです。

ロードバランサへのクライアントエントリは、「デフォルト」セッションと「ログインセッション」の両方を接続するために使用されるVIPを介して行われます。これは、ユーザーガイドのp.99にあるL4ポリシーを通じて実現されます。

"When AppDirector receives the first packet of a session destined to a
Virtual IP address, it searches for a Layer 4 Policy that matches the
Layer 4 Protocol, Destination port, Source IP, etc. Then, based on this
information, AppDirector selects the farm allocated to this service and
the best server for the task from that farm, and forwards the packet to
that server.

L4ポリシーは、適切なファームを選択するために使用されるL7ポリシーに関連付けることができます。L7ポリシープロセスは、ユーザーガイドp.104に記載されています。

"The Layer 7 content aware decision making mechanism allows you to have
a single point of entry to the site, and provides differentiated service
for different user groups.

A Layer 7 decision is made using a mechanism called Delayed Binding.
When Delayed Binding is used, AppDirector first performs a TCP handshake
with the client to receive the HTTP request. AppDirector parses the HTTP
request’s data, usually HTTP headers, and performs the load balancing
decision. Only after that, does AppDirector select a farm and a server.
Lastly, AppDirector initiates a TCP handshake with the server and
forwards the traffic to it
[...]
When Layer 7 Policies are used, farm selection is based on matching the
request data with a list of Layer 7 Policies defining the Layer 7
parameters differentiating the service. The process of server selection
within the farm can also be content-based, using a third Layer 7
parameter."

L7の動作を定義するために使用できる方法については、p.106で説明しています。これらのうち、適切な方法を選択して、「デフォルト」のファームではなく「ログインした」ファームへのルーティングを選択できます。

"Methods are the basic building blocks for Layer 7 service selection.
They define content by which traffic is differentiated. You can use
the same Method to select one or more services. The following Method
Types are available:

- URL: Looks for a specified host name and/or path in the HTTP request.
- File Type: Looks for a specified File Type in the HTTP request.
- Header Field: Looks for a specified Header Field in the HTTP request.
- Cookie: Looks for a specified Cookie in the HTTP request.
- Regular Expression: Looks for a regular expression anywhere in the
HTTP request. AppDirector supports Posix 1002.3 regular expressions;
the string can be up to 80 characters.
- Text: Looks for a text string anywhere in the HTTP request."

基本アプリケーションリンクで見られるように、たとえば、異なるファームへのルーティングのためにURIパターンを評価するL7ポリシーを作成できます。作成されたURIパターン '^ / login?= true'および '^ / loggedin'は、「ログインした」ファームにルーティングできます。構成されたパターン '^ / logout'(および他のすべてのURI)は、同様に「デフォルト」のファームにルーティングできます。

ファームはユーザーガイドp.121で定義されています。「AppDirectorファームは、同じサービスを提供するネットワークサーバーのグループです[...]複数のサービスを提供するサーバーは、複数のファームで使用できます。」

サーバーは、バックエンドサーバーの定義を2つのレイヤーに分割することでさらに区別されます。「物理サーバー」オブジェクトレイヤーはサーバーのIPアドレスを表し、「ファームサーバー」オブジェクトレイヤーは1つ以上の物理サーバーで実行されているサービスを表します。

ファームでのセッション制限は、「AppDirectorユーザーガイド」に従って、物理サーバーオブジェクトごとに加えて、ファームに定義された各ファームサーバーオブジェクトごとに(および他の方法で)実行できます。これは、p.137の他の場所で説明されています。

"The Connection Limit is the maximum number of users that can be directed
to a server for a service provided by the farm. The number of users allowed
depends on the Sessions mode selected because it determines the number of
active entries in the Client Table for sessions destined to the specific server.

When the Entry Per Session or Server Per Session modes are selected, the number
of active entries destined to the same server is higher than in the Regular
mode (see Regular, page 153).

When the Regular mode is selected, all requests from a single client IP destined
to the same server are reflected by a single entry in the Client Table (see
Client Table Views, page 164).

The default value for the Connection Limit parameter is 0. When it is configured
to 0, it is disabled for this server and there is no user number limit."

クライアントテーブルとその「通常モード」はp.153で定義されています。

"The Layer 3 Client Table is always used when Entry Per Session is used.
AppDirector uses the Layer 3 Client Table to ensure Layer 3 persistency.

This table contains information about the server selected for each client
(Source IP address) in each farm, and it allows AppDirector to select a
server for a new session.
[...]
In the Regular mode, AppDirector maintains Layer 3 persistency. In this mode,
each entry is identified by the following parameters:
• Layer 4 Policy VIP Address
• Client IP Address
• Destination TCP/UDP Port Used from the Client to the Server"

基本アプリケーション」ページのサーバー定義ウィンドウのスクリーンショットでは、サーバー接続制限ボックスが帯域幅制限ボックスのすぐ横に表示されています。

したがって、構成によって多少異なりますが、この回答の目的では、クライアントテーブルを介して定義された「接続」と、ユーザーが定義した「セッション」は基本的に同じものになります。そして、その効果に対する制限は、ファーム内のサーバーオブジェクトごとに課すことができます。

AppDirectorは物理サーバーとファームサーバーを区別するため、Apache物理サーバーオブジェクトにマッピングする2つのファームサーバーを定義することができます。1つは接続制限が低いものです。

ただし、Apacheは両方のファームサーバーオブジェクトからの呼び出しに応答する必要もあります。たとえば、2つの個別のポートまたはIPアドレスで呼び出され、それぞれが(ファーム/ファームサーバー)コンボで使用されます。次に、2つのアプリケーションサーバーエントリポイントを定義できますか。つまり、2つのポートまたはIPアドレス(ファームごとに1つ)で応答するようにApacheフロントエンドアプリケーション(/ vhost?)を装備できますか?私はマニュアルにあまり時間をかけたくないので、これは多少の推測作業によるものですが、実際にAppDirector GUIとApacheを見ると、かなりエレガントに解決できると思います。

接続制限の設定には少し癖があります。物理サーバーからの接続制限p.140:

"Connection Limit

Maximum number of Client Table entries that can run simultaneously on 
the physical server. This depends on the farm’s Sessions mode (see 
Sessions Modes, page 150). When the limit is reached, new requests are 
no longer directed to this server. All open sessions are continued.

When the Connection Limit parameter is configured to 0 (default), this 
mechanism is disabled for this physical server and there is no user 
number limit.

Note: When configuring the physical server, ensure that the Connection 
Limit in the farm servers with the same Server Name is lower than or 
equal to the Connection Limit in the physical server. Total number of 
active sessions that run simultaneously on the farm servers must not 
be higher than the Connection Limit value defined on the physical server."

したがって、無制限の「デフォルト」のファームサーバーに対して非常に高い接続制限(ユーザーベースで可能な最大数までの広いマージン)を定義し、「ログインした」ファームサーバーの接続制限を次のように設定する必要があります。あなたがする必要があるように低い。物理サーバーの定義では、目的のセッション制限をアクティブにするための前提条件として、2つの合計を接続制限として持つ必要があります。


あなたの質問にもこの要件があります:

After the specified session limit has been reached, the next user should be
directed to a custom error page.

これは、ユーザーガイドp.134では「HTTPサービスページなし」と呼ばれています。

When all servers belonging to a farm cannot be used for a specific
session, AppDirector can reply to a Web request (destined to port 80)
with a simple Web page, indicating that the service is currently not
available. Servers that cannot be used for a session include servers
in Not In Service or in No New Sessions mode. No HTTP Service Page is
configured for each farm. Each Web page is limited to 1K of HTML code.

監視の部分については、徹底的な調査は行っていませんが、私が思うのは次のとおりです。

track the current number of sessions for monitoring purposes

AppDirectorにMIBがあるようです。おそらく、通常どおりに正しいOIDを見つけるのは面倒ですが、選択したツールにそれをたどることができるでしょう。

whitelist the monitoring server (which is issuing queries to the webapp
periodically) and exempt it from the limit.

これはいくつかの創造的な思考を必要とする可能性があります。AppDirectorにこの機能のテンプレートが含まれていないと想定すると、次のようになります。

  • 「ログイン」ファーム外のURIは、セッション制限の影響を受けません。監視してください、とにかくそれは同じバックエンドサーバーです。
  • 代わりにAppDirectorヘルスチェックを使用してください。これらのチェックは、課したセッション制限にカウントされない可能性があります。ただし、監視サーバーにアラートを渡す方法を見つけてください:-)
  • ヘルスチェックに合格する3番目のファームをセットアップします。乱雑ですが、うまくいきます。

1
これまでのところ、mod_security2モジュールは、指定したもの(secure.jwall.org/blog/2009/01/08/1231374852674.html)と非常によく似た方法でセッションを処理できることがわかりました。2つのファームのアイデアについてさらに調査を行います。そのような実装が可能であれば、物事は単純化されます。
the-wabbit 2013

ラドウェアのテクニカルサポートからの応答:「ADではファームごとの帯域幅しか制限できません。[...] [A]ファームベースのセッションの合計数を制限する方法は現在利用できません。」だからmod_securityです。
the-wabbit 2013

OK、予想外でした。何かを見逃したのでない限り、ヘルスチェックに失敗して農場を閉鎖するほうが、よりクリーンな解決策になると思います。mod_securityに関するあなたの発見は関係なく非常に興味深いものです。
ErikE 2013

おそらく、質問の解釈ではサポートが少し狭かったのですが、AppDirectorのサーバーレベルでのセッション制限が可能であるように思われます(これには確かにいくつかのロジックがあります)。:私は1つ、ここで、いくつかのリンクをGoogleで検索されkb.radware.com/questions/2829/...
ErikEを

ラドウェアのKB記事は、WANアクセラレータであるLinkProofに関するものです。どのソフトウェアが実行されているのか、AppDirectorに同様の機能が存在するのかどうかはわかりません。ところで:セッション処理コードは確かにあるのAppDirectorの機能セットの一部は、 -それは私がそれを見て期待する正確に何に見えるセッションテーブルを持っています。しかし、どうやら、セッション数に制限を課す方法はなく、接続に限られます。私がそれから得ることができる最大のものは、「もう一方の」エリックが示唆したように、時間単位あたりの特定のページ(たとえば、ログインページ)のヒット数を制限することです。
the-wabbit 2013

0

AppDirectorで解決できない場合は、少しコーディングが必要な別のアプローチを以下に示します。私は次のように問題に取り組みます:

  • ループで、Apacheログファイルを読み続けます(そしてlogrotateで再度開きます)
  • ユーザーが(ログインだけでなく)任意のページにアクセスしたときに、それらをiptablesホワイトリストに追加します
  • ユーザーがログアウトしたとき、または非アクティブになった後(アクティブなセッションのタイマーを維持してください!)、ホワイトリストから削除します。
  • ホワイトリストがいっぱいの場合は、ホワイトリストにないすべてのトラフィックを特別なポートにリダイレクトします
  • あなたのカスタムエラーでそのポートで簡単な仮想ホストを実行してください

セッション数のグラフ化は、iptablesチェーンの長さをグラフ化するのと同じくらい簡単になります。監視サーバーは、常に常にホワイトリストに登録できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.