Preciso de uma maneira de acompanhar e limitar as sessões da web a um aplicativo da web. Uma "sessão" é definida livremente como o único usuário navegando nas páginas do referido aplicativo da web. Eu acho que pode ser traduzido para:
- uma sessão é definida como uma tupla
<clientIP,vHost>
alternativamente como<clientIP,serverIP,serverPort>
ou<cookie,vHost>
, dependendo da camada e dos dados disponíveis - uma sessão inicia após o usuário enviar dados de autenticação para um URI de login definido
- uma sessão termina após o usuário acessar o URI de logout definido
- uma sessão termina se um tempo limite especificado expirar após o cliente solicitar o último objeto
Depois que o limite de sessão especificado for atingido, o próximo usuário deverá ser direcionado para uma página de erro personalizada. Também preciso de uma maneira de rastrear o número atual de sessões para fins de monitoramento e a capacidade de colocar na lista de permissões o servidor de monitoramento (que está emitindo consultas para o aplicativo da Web periodicamente) e isentá-lo do limite.
Com o que posso trabalhar:
- RadWare AppDirector em que o aplicativo Web possui um próprio farm definido e está sendo executado no modo de proxy reverso
- Apache 2.2
- SLES 11 SP2
Eu preferiria não envolver um servidor proxy adicional, embora o considere se nenhuma outra opção permanecer.
A lógica por trás de tudo isso é que o aplicativo da Web mencionado acima é facilmente sobrecarregado e começa a negar solicitações erraticamente, irritando os usuários que geralmente perdem dados de entrada de formulário no processo. Ao especificar um limite em que uma condição de sobrecarga é menos provável, esperamos criar uma condição de falha bem definida, na qual os usuários serão solicitados a retornar mais tarde se for provável que a carga ocorra.
Editar : o aplicativo da web é uma implementação em três camadas, com a primeira camada (camada de apresentação, implementada como código CGI em um Apache vHost) bastante simplista e aparentemente limitada ao tratamento básico de erros e ao balanceamento de carga entre os servidores de aplicativos. Ele não impõe nenhuma carga significativa nos servidores Web em que é executado - é por isso que o executamos no mero modo de failover (sem balanceamento de carga) no farm do AppDirector, o que deve simplificar um pouco as coisas.
Tudo além desse ponto é basicamente uma caixa preta para nós - na camada de dados, temos um banco de dados MSSQL, mas é quase impossível obter do fornecedor qualquer informação significativa sobre a estrutura da tabela. Os servidores de aplicativos são de código fechado, o fornecedor usou uma estrutura bastante abrangente para a implementação, mas parece incapaz de responder a perguntas ainda menos complexas relacionadas à operação.
fonte
Respostas:
O problema que você está tentando resolver está na capacidade do aplicativo - e é aí que você deve resolver o problema. Nenhum dos componentes que você mencionou tem algo a ver com o gerenciamento de sessões para um aplicativo HTTP.
Existem alguns truques que você pode aplicar com o módulo recente no iptables ou usando o fail2ban da maneira oposta à finalidade para a qual foi projetado - mas esses dois exigem uma compreensão muito detalhada das ferramentas e do domínio do problema. Você pode implementar o controle de acesso no nível desses componentes, mas orientado pelas informações publicadas do estado do aplicativo no número de sessões.
Supondo, por enquanto, que o aplicativo seja uma caixa preta sem escopo para modificação / instrumentação (o que é altamente improvável), você pode obter essas informações dos logs do apache incluindo o cookie da sessão - filtre ou siga os logs para manter um lista de cookies ativos - e remova as entradas da lista quando coincidirem com o URL de logout ou não foram vistas para o TTL.
fonte
Não é exatamente isso que você está pedindo, mas eu já fiz o seguinte com os balanceadores de carga F5:
Como o site às vezes estava sob carga pesada (corridas de cavalos), isso ajudou.
fonte
Esse problema é solucionável usando o RadWare AppDirector e (para ser completo) provavelmente também usando o Apache mod_security conforme sua excelente descoberta no comentário abaixo.
Para uma solução AppDirector, acredito que é possível criar dois farms mapeados para os mesmos servidores back-end. Esses farms podem ter critérios e condições operacionais diferentes aplicados a eles. Um farm seria o "padrão" e o outro responderia aos URI: s que você define como sendo "uma sessão". O último obteria um limite para a quantidade de sessões que ele aceita no balanceador de carga.
A partir de agora, substituirei o termo "sessão" por "logado" por dois motivos:
Também é possível mostrar uma página de desculpas se o farm "logado" atingiu o limite de conexão escolhido.
Antes de começar, como devo declarar claramente que não tenho experiência operacional com o produto AppDirector, mas administro diariamente um balanceador de carga concorrente e um pouco menos avançado. O produto que eu uso pode fazer esse cenário imediatamente. Encontrei informações no Guia do usuário do AppDirector e qual documentação on-line está disponível, o que sugere que o mesmo se aplica ao AppDirector. No entanto, embora os conceitos sejam semelhantes, a terminologia é diferente. Estou simplesmente fazendo um ato quando em Roma com relação à redação, esperando acertar bastante sem ser obviamente um idiota sem noção.
O maior obstáculo foi o acesso a um manual, que não é disponibilizado, a menos que se seja um cliente ativo. Através de algumas pesquisas no Google, foi possível encontrar uma versão antiga que, espero, não esteja muito desatualizada, também encontrei alguns artigos da base de conhecimento e este link: Radware AppDirector - Configuração: aplicativo básico .
Aqui está um rascunho da solução, interpretado principalmente pelo Guia do Usuário:
A entrada do cliente no balanceador de carga é feita por meio de um VIP, usado para conectar as sessões "padrão" e as "sessões de logon". Isso é alcançado através de uma política L4, conforme a p.99 no Guia do Usuário:
A política L4 pode ser vinculada às políticas L7, usadas para selecionar um farm adequado. O processo da política L7 é descrito assim no Guia do Usuário p.104:
Os métodos disponíveis para definir um comportamento L7 estão descritos na p.106, dos quais você pode escolher um método adequado para escolher o roteamento para o seu farm "logado" em vez do farm "padrão":
Como visto no link do aplicativo básico , pode-se, por exemplo, criar uma política L7 que avalie os padrões de URI para rotear para diferentes farms. Os padrões de URI inventados '^ / login? = True' e '^ / login' podem ser roteados para o farm "logado". O padrão criado '^ / logout' (e todos os outros URI: s) também pode ser roteado para um farm "padrão".
Um farm é definido pelo Guia do Usuário p.121, assim: "Um farm do AppDirector é um grupo de servidores em rede que fornecem o mesmo serviço [...] Um servidor que fornece vários serviços pode ser usado em vários farms".
Um servidor é ainda mais diferenciado ao separar a definição de servidor backend em duas camadas, a camada de objeto 'Physical Server', que representa o endereço IP de um servidor, e a camada de objeto 'Farm Server', que representa serviços em execução em um ou mais servidores físicos .
A limitação de sessão em um farm pode, de acordo com o 'Guia do Usuário do AppDirector', ser realizada por cada objeto do Servidor do Farm definido para um farm (e por outros meios), além do objeto do Servidor Físico. Isso é descrito entre outros lugares na p.137:
A tabela do cliente e seu 'modo regular' estão definidos na p.153:
Em uma captura de tela de uma janela de definição de servidor na página Aplicativo Básico , a caixa de limite de conexão do servidor é vista ao lado da caixa de limite de largura de banda.
Então, dependendo da configuração, mas para os fins desta resposta, uma 'conexão' conforme definida na Tabela do Cliente e uma 'sessão' conforme definida por você basicamente acabam sendo a mesma coisa. E um limite para esse efeito pode ser imposto por objeto de servidor em um farm.
Como o AppDirector diferencia entre servidores físicos e servidores de farm, seria possível definir dois servidores de farm mapeados para o objeto de servidor físico do Apache, um com um limite de conexão baixo.
No entanto, o Apache também precisa atender chamadas de ambos os objetos do servidor do farm, por exemplo, sendo chamado em duas portas ou endereços IP separados - um sendo usado por cada combinação (servidor do farm / farm). A questão então se torna: você pode definir dois pontos de entrada do servidor de aplicativos? ou seja, você pode equipar seu aplicativo front end Apache (/ vhost?) para responder em duas portas ou endereços IP (um por farm)? Isso é um pouco de trabalho de adivinhação, já que não desejo gastar muito tempo com o manual, mas tenho certeza de que você poderia resolver isso com bastante elegância ao realmente olhar a GUI do AppDirector e o Apache.
Definir o limite de conexão é um pouco peculiar. De servidores físicos, limite de conexão p.140:
Portanto, seria necessário definir um limite de conexão muito alto (com uma ampla margem para o número máximo possível por meio de sua base de usuários) para o servidor de farm irrestrito "padrão" e definir o limite de conexão para o servidor de farm "conectado" como baixo como você precisa. A definição do servidor físico precisaria ter a soma dos dois como seu Limite de conexão, como condição prévia para ativar o limite de sessão desejado.
Você também tem este requisito em sua pergunta:
Isso é chamado de 'Nenhuma Página de Serviço HTTP' no Guia do Usuário, p.134:
Para a parte de monitoramento, não fiz uma pesquisa completa, mas eis o que penso:
O AppDirector parece ter MIBs. Provavelmente, é difícil encontrar o OID certo, como normalmente é, mas é possível encaixá-lo na sua ferramenta de escolha.
Este poderia exigir algum pensamento criativo. Supondo que o AppDirector não inclua um modelo para isso imediatamente, que tal:
fonte
Se o AppDirector não puder ajudá-lo, aqui está outra abordagem que exigirá um pouco de codificação. Eu resolveria o problema da seguinte maneira:
Representar graficamente o número de sessões se torna tão simples quanto representar graficamente o comprimento da cadeia iptables. O servidor de monitoramento pode simplesmente estar sempre na lista de permissões.
fonte