如何限制会话数?


8

我需要一种跟踪和限制Web会话到Web应用程序的方法。“会话”被宽松地定义为浏览所述网络应用的页面的单个用户。我认为可以将其翻译为:

  • 将会话定义为元组<clientIP,vHost><clientIP,serverIP,serverPort>或者将其定义为元组<cookie,vHost>,具体取决于层和可用数据
  • 用户将身份验证数据发送到已定义的登录URI后,会话开始
  • 用户点击定义的注销URI后,会话结束
  • 如果在客户端请求最后一个对象后指定的超时时间已过,则会话结束

达到指定的会话限制后,应将下一个用户定向到自定义错误页面。我还需要一种方法来跟踪用于监视目的的当前会话数,以及能够将监视服务器列入白名单(该服务器定期向Webapp发出查询)并将其免于限制。

我可以使用的工具:

  • Web应用程序已定义自己的服务器场并以反向代理模式运行的RadWare AppDirector
  • 阿帕奇2.2
  • SLES 11 SP2

我宁愿不涉及其他代理服务器,但如果没有其他选择,会考虑使用它。

所有这些背后的基本原理是,上述Web应用程序很容易过载,并开始错误地拒绝请求,惹恼了(通常)在此过程中丢失表单输入数据的工作用户。通过指定一个不太可能发生过载情况的极限,我们希望创建一个定义明确的故障情况,如果负载可能达到峰值,则将告知用户稍后返回。

编辑:Web应用程序是3层实现,第一层(表示层,在Apache vHost中作为CGI代码实现)相当简单,并且显然仅限于基本错误处理和应用程序服务器之间的请求负载平衡。它不会在运行的Web服务器上施加任何重大负载-这就是为什么我们在AppDirector服务器场中仅以故障转移模式(无负载平衡)运行它的原因,这应该可以简化一些事情。

超出这一点的所有内容基本上对我们来说都是一个黑匣子-在数据层,我们拥有一个MSSQL数据库,但是几乎不可能从供应商那里获得有关表结构的任何有意义的信息。应用服务器是开源的,供应商使用了相当全面的框架来实现,但是似乎无法回答与操作有关的更为简单的问题。


您可以在网络应用上提供常规详细信息吗?每个vHost是否相同?还是没有提供详细信息,因为您可能想要一个独立于Web应用程序的解决方案?它是专有的Web应用程序吗?
lsmooth

关闭连接后,由于不活动,有人可以使用会话cookie(如果尚未达到应用程序的超时)恢复会话吗?
manjiki

@jijix这是一个边界案例,如果它增加了实现的复杂性,则被认为足够罕见,不必理会。除此之外,我认为最好将其指定为“在不检查会话限制的情况下恢复会话”
the-wabbit

我通常通过计算httpd-access-log中的“典型” URL来实现。我们在这里谈论的大概并行数是多少?也许线程限制在httpd端可能会有所帮助?
Nils

我知道HAProxy可以限制连接数。但是您要问的是一些不同的东西……
Matt

Answers:


5

您最终要解决的问题是应用程序的容量-这就是您应解决的问题。您提到的所有组件都与 HTTP应用程序的会话管理无关

您可以将一些技巧与iptables中的最新模块一起使用,或者以与设计目的相反的方式使用fail2ban-但这些都需要对工具和问题域有非常详细的了解。您可以在这些组件级别上实施访问控制,但是由来自应用程序的有关会话数的已发布状态信息来驱动

我还需要一种跟踪当前会话数以进行监视的方法

假设目前该应用程序是一个黑匣子,没有修改/检测范围(这是极不可能的),则可以通过包含会话cookie从apache日志中获取此信息-过滤或拖尾日志以维护有效Cookie的列表-当它们与注销URL一致或没有看到TTL时,从列表中删除条目。


忘记上面的问题,这正是我要解决的问题。
lsmooth,

您确定RadWare AppDirector至少在扩展处理中不能解决此问题吗?-请求会话控制以防止可以通过其他方式实现的节点过载。
Veniamin

不,我不知道-正如我上面说你可以在其他地方堆栈捏造会话管理-但它的很多,MUCH更难以做到这一点错了地方。在发生问题的地方解决问题要容易得多。
symcbean 2013年

如果您认为会话管理的正确位置是基于每个节点集成在应用程序中或其他地方的模块,则不清楚如何使它与AppDirector级别的负载平衡一起使用。
Veniamin

使用apache日志进行会话跟踪的想法有些好处。至于其余的-您知道我还没有编写该应用程序,并且对进一步开发的影响很小(如果有的话)。这不是我决定执行的决定,我的权限仅限于它所运行的基础结构。管理部门已经清楚了应用程序不是最佳的这一点,但是即使能够进行任何更改,任何更改都会花费大量时间。因此,我目前的工作是找到一种“尽其所能”的操作模式。
the-wabbit

1

这并不是您所要的,但是我已经使用F5负载平衡器完成了以下操作:

  • 计算登录页面上的发帖请求数。
  • 如果每秒登录数超过第一限制,则延迟用户
  • 如果每秒登录数超过第二个限制,则将用户引导至维护页面

由于网站有时会承受重负荷(赛马),因此它有所帮助。


感谢您的想法,我需要与AppDirector的人员核实是否可以实现类似的功能。
the-wabbit

@ syneticon-dj:如果您需要检查是否可以实现这样的功能(实际上并不能解决问题,顺便说一句)并且您无法修复该应用程序,那么您确实遇到了很多麻烦。经过思考,我至少可以想到另外两种解决问题的方法-但它们在技术上都要求很高-实施不正确会使问题变得更糟而不是更好。您需要的帮助比到达这里还要多。
symcbean 2013年

@symcbean我无能为力,无法解决问题,这是因为供应商的开发人员和支持人员缺乏资格,并且决定在无知的情况下使用此应用程序。如果您还有其他想法,我将很高兴听到它们。只要不增加日常操作的复杂性,“需求”就不是问题。
the-wabbit

1

通过使用RadWare AppDirector可以解决此问题,并且(出于完整性考虑)也可以通过使用Apache mod_security(根据您在以下注释中的出色发现)来解决。

对于AppDirector解决方案,我相信可以创建两个映射到同一后端服务器的服务器场。这些服务器场可以应用不同的条件和操作条件。一个服务器场将是“默认”服务器场,另一个服务器场将响应您定义为“会话”的URI :。后者将限制它在负载均衡器中接受的会话数量。

从现在开始,我出于以下两个原因将您的“会话”一词替换为“已登录”:

  • 它避免了歧义,因为它明确定义了用户已通过身份验证的期望状态。
  • 《 AppDirector用户指南》和GUI重新定义了“连接”一词,其所有实际含义均与“会话”相同,请参见下文。这增加了我们试图避免的混乱。

如果“已登录”服务器场已达到所选的连接限制,也可能会显示一个抱歉的页面。

在进行操作之前,我必须明确声明我没有AppDirector产品的操作经验,但是每天都要管理一个竞争性稍差的负载均衡器。我使用的产品可以立即解决此问题。我已经通过《 AppDirector用户指南》找到了信息,并且可以找到哪些在线文档,这表明对于AppDirector也是一样。但是,尽管概念相似,但术语却不同。我只是在措辞方面做一个罗马式的举动,希望能做到正确,而又不会太笨拙。

最大的障碍是获得一本手册,除非一个活跃的客户,否则该手册将不可用。通过一些谷歌搜索,有可能找到一个我希望不会过时的旧版本,我还找到了一些知识库文章,以及以下链接:Radware AppDirector –配置:基本应用程序

这是一个解决方案草案,主要通过《用户指南》进行解释:

客户端进入负载平衡器是通过VIP完成的,该VIP用于连接“默认”会话和“已登录的会话”。这可以通过《用户指南》第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策略绑定,后者用于选择合适的服务器场。因此,在《用户指南》第104页中描述了L7策略过程:

"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."

第106页描述了可用于定义L7行为的方法,您可以从中选择一种合适的方法来选择路由到“已登录”服务器场而不是“默认”服务器场:

"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."

从“ 基本应用程序”链接中可以看到,例如可以创建一个L7策略,以评估URI模式以路由到不同服务器场。可以将组成的URI模式'^ / login?= true'和'^ / loggedin'路由到您的“已登录”服务器场。组成的模式'^ / logout'(和所有其他URI:s)可以类似地路由到“默认”服务器场。

服务器场由《用户指南》第121页定义,因此:“ AppDirector服务器场是一组提供相同服务的网络服务器。可以在多个服务器场中使用提供多种服务的服务器。

通过将后端服务器的定义分为两层,进一步区分了服务器:代表服务器IP地址的“物理服务器”对象层和代表一个或多个物理服务器上运行的服务的“农场服务器”对象层。 。

根据“ AppDirector用户指南”,除了对每个物理服务器对象之外,还可以针对该场定义的每个Farm Server对象(以及通过其他方式)对场进行会话限制。第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."

第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物理服务器对象的场服务器,其中一个具有较低的连接限制。

但是,Apache还需要应答来自两个场服务器对象的呼叫,例如通过在两个单独的端口或ip地址上进行调用-每个(场/场服务器)组合都使用一个。问题就变成了,您是否能够定义两个应用程序服务器入口点?也就是说,您是否可以使Apache前端应用程序(/ vhost?)能够在两个端口或IP地址(每个服务器场一个)上进行应答?这是经过一些猜测的工作,因为我不想花太多时间在手册上,但是我相信当您实际查看AppDirector GUI和Apache时,您可以相当优雅地解决此问题。

设置连接限制有些奇怪。从物理服务器的连接限制第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."

因此,您需要为不受限制的“默认”服务器场服务器定义一个很高的连接限制(与通过用户库可能达到的最大数目有很大的余量),并将“已登录”服务器场服务器的连接限制设置为低到你所需要的。物理服务器定义将需要将两者之和作为其连接限制,作为激活所需会话限制的前提。


您的问题中也有此要求:

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

在《用户指南》第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运行状况检查,这些检查可能不会计入您施加的会话限制。找到一种通过以下方式将警报传递到监视服务器的方法:-)
  • 设置第三个服务器场,通过它通过运行状况检查。杂乱无章,但行得通。

1
到目前为止,我发现mod_security2模块能够以与我指定的方式非常相似的方式处理会话-secure.jwall.org/blog/2009/01/08/1231374852674.html。我将对您关于2个服务器场的想法进行更多研究,如果可以实施,那肯定会简化事情。
the-wabbit 2013年

Radware技术支持部门的回复:“在AD中,我们只能限制每个服务器场的带宽。[...] [A]当前无法限制服务器场中会话总数的方法。” 那就是mod_security了。
the-wabbit 2013年

好的,那是出乎意料的。除非我错过任何事情,否则我仍然认为通过不合格的健康检查关闭农场将是一个更清洁的解决方案。无论如何,您对mod_security的发现都非常有趣。
ErikE

尽管在解释问题时支持范围可能很小,但看来AppDirector中服务器级别的会话限制是可能的(对此肯定有逻辑)。我GOOGLE了几个环节,这里是一个:kb.radware.com/questions/2829/...
ErikE

Radware KB文章涉及LinkProof-WAN加速器。我不知道它正在运行什么软件,以及AppDirector是否会存在类似的设施。顺便说一句:会话处理代码肯定 AppDirector功能集的一部分-它具有一个会话表,该表看起来完全符合我的期望。但是显然,没有办法对会话的数量施加限制-仅在连接上。我能从中得到的最大好处是,按“另一个” Eric的建议,限制每个时间单位在给定页面(例如登录页面)上的点击次数。
the-wabbit 2013年

0

如果AppDirector无法帮助您,则这是另一种方法,需要一些编码。我将解决以下问题:

  • 在一个循环中,继续读取apache日志文件(并在logrotate上重新打开它)
  • 当用户访问任何页面(不仅仅是登录)时,请将其添加到iptables白名单中
  • 当用户注销或不活动后(因此,请为活动会话保留计时器!),将其从白名单中删除
  • 如果白名单已满,请将所有非白名单流量重定向到特殊端口
  • 使用您的自定义错误在该端口上运行一个简单的虚拟主机

绘制会话数的图表变得与绘制iptables链的长度一样简单。监视服务器可以简单地始终列入白名单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.