세션 수를 제한하는 방법은 무엇입니까?


8

웹 세션을 추적하고 웹 앱으로 제한하는 방법이 필요합니다. "세션"은 단일 사용자가 상기 웹 앱의 페이지를 탐색하는 것으로 느슨하게 정의된다. 나는 그것이 다음과 같이 번역 될 수 있다고 생각한다.

  • 세션은 튜플로 정의 <clientIP,vHost>대안으로서 <clientIP,serverIP,serverPort>또는 <cookie,vHost>레이어 가능한 데이터에 따라
  • 사용자가 정의 된 로그인 URI에 인증 데이터를 보낸 후 세션이 시작됩니다.
  • 사용자가 정의 된 로그 아웃 URI에 도달 한 후 세션이 종료됩니다.
  • 클라이언트가 마지막 객체를 요청한 후 지정된 시간 초과가 만료되면 세션이 종료됩니다.

지정된 세션 제한에 도달하면 다음 사용자에게 사용자 정의 오류 페이지가 표시되어야합니다. 또한 모니터링 목적으로 현재 세션 수를 추적하고 모니터링 서버 (웹앱에 정기적으로 쿼리를 발행하는)를 허용 목록에 추가하여 제한에서 면제하는 기능이 필요합니다.

내가 할 수있는 것 :

  • 웹 응용 프로그램에 자체 팜이 정의되어 있고 리버스 프록시 모드에서 실행중인 RadWare AppDirector
  • 아파치 2.2
  • SLES 11 SP2

다른 옵션이 남아 있지 않으면 추가 프록시 서버를 사용하지 않는 것이 좋습니다.

이 모든 이유의 근거는 위에서 언급 한 웹 앱이 쉽게 오버로드되고 요청을 잘못 거부하기 시작하여 프로세스에서 일반적으로 양식 항목 데이터를 잃는 작업 사용자를 화나게합니다. 과부하 상태가 발생할 가능성이 적은 한도를 지정하여 부하가 급증 할 가능성이있는 경우 나중에 사용자에게 반환하라는 명확한 오류 조건을 만들려고합니다.

편집 : 웹 응용 프로그램은 첫 번째 계층 (Apache vHost에서 CGI 코드로 구현되는 프리젠 테이션 계층)이 다소 단순하고 응용 프로그램 서버 간의 기본 오류 처리 및 요청 부하 분산으로 제한되는 3 계층 구현입니다. 웹 서버에서 실행되는 웹 서버에 큰 부하를 가하지는 않습니다. 이것이 AppDirector 팜에서 단순한 장애 조치 모드 (로드 밸런싱 없음)로 실행하는 이유입니다.

이 시점 이후의 모든 것은 기본적으로 우리에게 블랙 박스입니다. 데이터 계층에서 우리는 MSSQL 데이터베이스를 가지고 있지만 공급 업체로부터 테이블 구조에 대한 의미있는 정보를 얻는 것은 거의 불가능합니다. 애플리케이션 서버는 폐쇄 소스이며 공급 업체는 구현을 위해 다소 포괄적 인 프레임 워크를 사용했지만 덜 복잡한 운영 관련 질문에 대답 할 수없는 것 같습니다.


웹앱에 대한 일반적인 정보를 제공 할 수 있습니까? 각 vHost에서 동일합니까? 또는 웹 앱과 독립적 인 솔루션을 원하기 때문에 세부 정보를 제공하지 않았습니까? 독점적 인 웹 앱입니까?
lsmooth

비 활동으로 인해 연결이 종료 된 후 누군가 세션 쿠키를 사용하여 세션을 재개 할 수 있습니까 (응용 프로그램의 시간 종료에 도달하지 않은 경우)?
manjiki

@jijix 이것은 구현의 복잡성을 더한다면 귀찮게하지 않을 정도로 드문 것으로 간주되는 국경 사건입니다. 그 외에는 "세션 제한을 확인하지 않고 세션을 복원" 하는 것이 가장 좋습니다 .
the-wabbit

나는 보통 httpd-access-log에서 "일반"URL을 세어이 작업을 수행합니다. 우리가 여기서 말하는 대략적인 동시 숫자는 무엇입니까? 아마도 스레드 제한이 httpd 측에서 도움이 될 수 있습니까?
Nils

HAProxy가 연결 수를 제한 할 수 있다는 것을 알고 있습니다. 그러나 당신은 조금 다른 것을 요구하고 있습니다 ...
Matt

답변:


5

궁극적으로 해결하려는 문제는 응용 프로그램의 용량과 관련이 있으며 여기서 문제를 해결해야합니다. 언급 한 구성 요소 중 어느 것도 HTTP 응용 프로그램의 세션 관리와 관련이 없습니다 .

iptables에서 최신 모듈로 적용하거나 fail2ban을 의도 한 목적과 반대되는 방식으로 적용 할 수있는 몇 가지 트릭이 있지만, 도구와 문제 영역을 매우 자세하게 이해해야합니다. 이러한 구성 요소 수준에서 액세스 제어를 구현할 수 있지만 세션 수에 따라 응용 프로그램의 게시 된 상태 정보를 기반 으로합니다.

또한 모니터링 목적으로 현재 세션 수를 추적하는 방법이 필요합니다

당분간 응용 프로그램이 수정 / 계측의 범위없는 블랙 박스라고 가정하면 (아주 불가능한) 세션 쿠키를 포함하여 아파치 로그 에서이 정보를 얻을 수 있습니다. 활성 쿠키 목록-로그 아웃 URL과 일치하거나 TTL에 표시되지 않은 항목을 목록에서 제거하십시오.


위의 질문을 잊어 버려요. 이것은 내가 정확히 얻은 것입니다.
lsmooth

RadWare AppDirector가 적어도 연장 된 치료에서이 문제를 해결할 수 없다고 확신하십니까? -다른 방법으로 달성 할 수있는 노드 과부하를 방지하기 위해 세션 제어가 요청됩니다.
Veniamin

확실하지 않습니다-위에서 말했듯이 스택의 다른 곳에서 세션 관리를 퍼지 할 수는 있지만 잘못된 위치에서 세션 관리 를 수행하는 것이 훨씬 어렵습니다. 문제가 발생하는 문제를 해결하는 것이 훨씬 쉽습니다.
symcbean

세션 관리를위한 올바른 장소를 고려할 경우 응용 프로그램이나 노드 단위로 통합 된 모듈이 AppDirector 수준에서로드 밸런싱과 함께 작동하는 방법이 명확하지 않다는 것이 확실합니다.
Veniamin

세션 추적에 아파치 로그를 사용한다는 아이디어에는 몇 가지 장점이 있습니다. 나머지는 앱을 작성하지 않았으며 추가 개발에 거의 영향을 미치지 않습니다. 그것을 결정하는 것은 나의 결정이 아니었고, 나의 권한은 그것이 실행되는 인프라에 국한되었다. 애플리케이션이 차선책이라는 점은 경영진에게 명확 해졌지만, 이것이 무엇이든 바꿀 수 있었더라도, 어떤 변화라도 상당한 시간이 걸립니다. 현재 제 직업은 "작동하는만큼"작동 모드를 찾는 것입니다.
the-wabbit

1

이것은 정확히 당신이 요구하는 것이 아니지만 F5로드 밸런서로 이미 다음을 수행했습니다.

  • 로그인 페이지에서 게시 요청 수를 계산하십시오.
  • 초당 로그인 수가 첫 번째 한계를 초과하면 사용자 지연
  • 초당 로그인 수가 두 번째 한계를 초과하면 사용자를 유지 보수 페이지로 보냅니다.

때때로 웹 사이트에 과부하가 걸렸을 때 (경마) 도움이되었습니다.


아이디어에 감사드립니다. 비슷한 것을 구현할 수 있는지 AppDirector 직원에게 확인해야합니다.
the-wabbit

@ syneticon-dj : (실제로 문제를 해결하지 못하는 BTW) 이와 같은 것을 구현할 수 있는지 확인하고 응용 프로그램을 수정할 수 없다면 실제로 문제가 있습니다. 반영 할 때 문제를 해결하기위한 적어도 두 가지 방법을 생각할 수 있지만 기술적으로 까다 롭고 잘못 구현하면 문제가 더 나아지기보다는 악화됩니다. 여기에 오는 것보다 더 많은 도움이 필요합니다.
symcbean

@symcbean 내가 할 수있는 일은 벤더의 개발자 및 지원 직원의 자격 부족과이 응용 프로그램을 무지하게 사용하기로 결정한 문제 를 해결할 수 없습니다 . 다른 아이디어가 있으시면 기뻐할 것입니다. "요구"는 일상적인 작업에서 복잡성을 증가시키지 않는 한 문제가되지 않습니다.
the-wabbit

1

이 문제는 RadWare AppDirector를 사용하거나 아래 설명에서 훌륭한 발견에 따라 Apache mod_security를 ​​사용하여 (완전하게) 해결할 수 있습니다.

AppDirector 솔루션의 경우 동일한 백엔드 서버에 두 개의 팜을 매핑하는 것이 가능하다고 생각합니다. 이 팜에는 서로 다른 기준과 운영 조건이 적용될 수 있습니다. 한 팜은 "기본"이고 다른 팜은 "세션"으로 정의한 URI :에 응답합니다. 후자는로드 밸런서에서 허용하는 세션 수에 제한을받습니다.

지금부터 두 가지 이유로 "로그인"이라는 "세션"용어를 대신 사용하려고합니다.

  • 사용자가 인증되는 원하는 상태를 명확하게 정의하므로 모호성을 피합니다.
  • AppDirector 사용 설명서와 GUI는 "연결"이라는 용어를 재정 의하여 "세션"과 동일한 모든 실제적인 목적에 대한 의미를 갖습니다 (아래 참조). 이것은 우리가 피하려고하는 혼란을 더합니다.

"로그인 된"팜이 선택한 연결 제한에 도달 한 경우 죄송한 페이지를 표시 할 수도 있습니다.

방법에 도달하기 전에 AppDirector 제품에 대한 운영 경험이 없다고 명확하게 진술해야하지만 경쟁적이고 약간 덜 진보 된로드 밸런서를 매일 관리해야합니다. 내가 사용하는 제품은 바로이 시나리오를 수행 할 수 있습니다. AppDirector 사용 설명서와 사용 가능한 온라인 설명서 중 AppDirector에 해당하는 정보를 찾았습니다. 그러나 개념은 비슷하지만 용어가 다릅니다. 나는 단순히 어리 석음이없는 모론이되지 않으면서도 옳은 일을하기를 바라면서 말로 표현할 때 로마에서 행동을하고 있습니다.

가장 큰 장애물은 매뉴얼에 대한 액세스 권한을 얻는 것이 었습니다. 인터넷 검색을 통해 구식 버전이 너무 오래되지 않았기 때문에 몇 가지 기술 자료 기사 와이 링크를 찾았습니다. Radware AppDirector – 구성 : 기본 응용 프로그램 .

다음은 주로 사용자 안내서를 통해 해석 된 솔루션 초안입니다.

로드 밸런서에 대한 클라이언트 항목은 "기본"세션과 "로그인 된 세션"을 모두 연결하는 데 사용되는 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 동작을 정의하는 데 사용할 수있는 방법은 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 팜은 동일한 서비스를 제공하는 네트워크 서버 그룹입니다. [...] 여러 서비스를 제공하는 서버를 여러 팜에서 사용할 수 있습니다."

서버는 백엔드 서버의 정의를 서버의 IP 주소를 나타내는 '물리 서버'객체 계층과 하나 이상의 물리적 서버에서 실행되는 서비스를 나타내는 '팜 서버'객체 계층으로 분리함으로써 더욱 차별화됩니다. .

팜에 대한 세션 제한은 '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."

클라이언트 테이블 및 해당 '일반 모드'는 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"

기본 응용 프로그램 페이지 의 서버 정의 창의 스크린 샷 에서 서버 연결 제한 상자는 bandwith limit 상자 옆에 표시됩니다.

따라서 구성에 따라 다르지만이 답변의 목적을 위해 클라이언트 테이블을 통해 정의 된 '연결'과 사용자가 정의 한 '세션'은 본질적으로 동일한 것입니다. 팜의 서버 개체마다 해당 효과에 대한 제한이 적용될 수 있습니다.

AppDirector는 물리적 서버와 팜 서버를 구분하므로 Apache 물리적 서버 개체에 매핑되는 두 개의 팜 서버를 정의 할 수 있습니다. 하나는 연결 제한이 낮습니다.

그러나 Apache는 두 팜 서버 객체 (예 : 각 팜 / 팜 서버) 콤보에서 사용되는 두 개의 개별 포트 또는 IP 주소에서 호출되는 방식으로 두 팜 서버 객체 모두의 호출에 응답해야합니다. 그러면 두 응용 프로그램 서버 진입 점을 정의 할 수 있습니까? 즉, 두 개의 포트 또는 IP 주소 (팜당 하나)에 응답하기 위해 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 상태 확인을 사용하면 부과 한 세션 제한에 포함되지 않습니다. 모니터링 서버에 경고를 전달하는 방법을 찾으십시오 :-)
  • 상태 확인을 통과하는 세 번째 팜을 설정하십시오. 지저분하지만 작동합니다.

1
지금까지 mod_security2 모듈이 내가 지정한 것과 매우 유사한 방식으로 세션을 처리 할 수 ​​있음을 발견했습니다 -secure.jwall.org/blog/2009/01/08/1231374852674.html . 나는 2 개의 농장에 대한 당신의 아이디어에 대해 더 많은 연구를 할 것입니다. 그러한 구현이 가능하다면 분명히 일을 단순화 할 것입니다.
the-wabbit

Radware 기술 지원팀의 답변 : "AD에서는 팜당 대역폭 만 제한 할 수 있습니다. [...] [A] 팜 기반의 총 세션 수를 제한하는 방법은 현재 사용할 수 없습니다." 그러면 mod_security입니다.
the-wabbit

좋아, 그것은 예상치 못한 것이었다. 내가 뭔가를 놓치지 않으면 나는 여전히 건강 점검 실패를 통해 농장을 폐쇄하는 것이 더 깨끗한 해결책이라고 생각합니다. mod_security에 대한 당신의 발견은 관계없이 매우 흥미 롭습니다.
ErikE

아마도 질문을 해석하는 데 약간의 지원이 있었지만 AppDirector의 서버 수준에서 세션 제한이있을 수 있습니다 (논리적으로 확실합니다). : 나는 하나 여기에 몇 가지 링크를 봤입니다 kb.radware.com/questions/2829/...
ErikE을

Radware KB 기사는 WAN 가속기 인 LinkProof에 관한 것입니다. 어떤 소프트웨어가 실행 중인지, AppDirector에 유사한 기능이 있는지는 알 수 없습니다. BTW : 세션 처리 코드는 확실 하다 AppDirector의 기능 세트의 일부 - 내가 그것을보고 기대 정확히 보이는 세션 테이블이 있습니다. 그러나 분명히 연결 수에만 sesssions의 수를 제한 할 수있는 방법이 없습니다. 내가 얻을 수있는 가장 많은 것은 "다른"Eric이 제안한대로 시간 단위당 특정 페이지 (예 : 로그인 페이지)의 적중 수를 제한하는 것입니다.
the-wabbit

0

AppDirector가 당신을 도울 수 없다면, 약간의 코딩이 필요한 또 다른 접근법이 있습니다. 다음과 같이 문제를 해결합니다.

  • 루프에서 아파치 로그 파일을 계속 읽은 다음 logrotate에서 다시 엽니 다.
  • 사용자가 로그인이 아닌 페이지를 방문 할 때 iptables 화이트리스트에 추가하십시오
  • 사용자가 로그 아웃하거나 활동이 없으면 (활성 세션의 타이머를 유지하십시오!) 화이트리스트에서 제거하십시오.
  • 허용 목록이 가득 찬 경우 허용되지 않은 모든 트래픽을 특수 포트로 리디렉션
  • 해당 포트에서 사용자 정의 오류로 간단한 가상 호스트를 실행하십시오.

세션 수를 그래프로 표시하는 것은 iptables 체인의 길이를 그래프로 나타내는 것만 큼 간단합니다. 모니터링 서버는 항상 화이트리스트에 올릴 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.