Mais segurança em suas aplicações com Yii e PHPIDS

  1. 1) Instalação
  2. 2) Reagindo ao ataque:
  3. 3) Habilitando/Desabilitando
  4. 4) Próxima versão 0.3
  5. 5) Como atualizar?
  6. Créditos e agradecimentos a equipe de desenvolvedores do PHPIDS.

PHPIDS é conhecido projeto que pode ser visto em php-ids.org.

PHPIDS é um sistema de detecção de intrusos, basicamente baseado em regras o IDS reconhece ataques filtrando as informações enviadas para o sistema, retornando uma classificação e um relatório do que for considerado um ataque potencial. A partir dessa informação o sistema pode reagir ao ataque, enviar e-mails de alerta, gerar logs detalhados, bloquear o usuário, gerar black list, etc.

O projeto PHPIDS foi encapsulado na forma de componente de aplicação do Yii e pode ser baixado em http://www.yiiframework.com/extension/phpids/ junto da suas instruções de instalação e uso.

Esse how-to mostra desda sua instalação e mais detalhadamente algumas possibilidades de uso.

Este componente foi testado nas versões 1.1.5 e 1.1.4 com PHP 5.2. A versão atual do componente é 0.2 na inscrição desse how-to.

1) Instalação

Faça o download da versão mais recente do componente PHPIDS em http://www.yiiframework.com/extension/phpids/

Descompacte o arquivo em ….webapp/protected/components/ids

Torne o diretório .../components/ids/IDS/tmp acessível para escrita

Atualize seu main.php em …/protected/config

...
//'preload'=>array('log'),
'preload'=>array('log','ids'),
...
components = array(
...
        'ids'=>array(
            'class'=>'application.components.ids.CPhpIds',
        ),
)

Adicione o componente ids ao preload da aplicação. Em componentes adicione a entrada do componente ids e suas configurações. O arquivo acima é o mínimo para o funcionamento do ids.

Todos os formulários da aplicação serão filtrados pela PHPIDS, as variáveis $_REQUEST, $_GET, $_POST e $_COOKIE são verificadas por tipos de ataques relatados nas regras de detecação do IDS. Caso um ataque potencial seja detectado a aplicação é interrompida antes do processamento da requisição, uma exception é lançada com uma mensagem de erro genérica sem detalhes para o atacante e um log detalhado é gerado.

Esse log é gerado pelo componente Log da aplicação Yii, sendo assim, um ataque pode ser enviado por e-mail (EmailLog), ou armazenado em banco, arquivo ou simplesmente exibido no navegador com o WebLog.

Podemos elaborar mais esta configuração, um detalhes simples é a mensagem enviada ao atacante:

'ids'=>array(
            'class'=>'application.components.ids.CPhpIds',
		'genericMessage'=>'Ocorreu um erro inesperado!', //Mensagem enviada ao atacante
        ),
…

O objetivo é que esta mensagem não tenha detalhes sobre o ataque, nem informe ao atacante que seu ataque foi detectado. E o devido tratamento seja dado internamente pela aplicação, enviando e-mails de Alerta ou simplesmente bloqueando o usuário.

Essa mensagem não entra no log, informações detalhadas sobre o ataque são geradas e enviadas para o componente de log.

2) Reagindo ao ataque:

'ids'=>array(
            'class'=>'application.components.ids.CPhpIds',
		'genericMessage'=>'Ocorreu um erro inesperado!', //Mensagem enviada ao atacante
		'callback'=>create_function('',"echo 'Error!'; Yii::app()->end(); return false;"),
        ),
…

O parametro callback recebe um callback válido como parametro, veja a função call_user_func no manual do PHP. Pode ser uma função, ou uma classe e o método que deve ser chamado. No exemplo acima criamos uma função simples, imprime erro, encerra a aplicação.

Através dessa configuração o desenvolvedor pode tratar da melhor forma os ataques detectados, enviando e-mails, alertas, criando um black list, removendo o acesso do usuário, finalizando a sessão, etc. Após o processamento do callback a exception padrão do componente não será lançada, encerrar a requisição passa a ser responsabilidade do desenvolvedor através da função/método passado como callback.

3) Habilitando/Desabilitando

'ids'=>array(
            'class'=>'application.components.ids.CPhpIds',
		'genericMessage'=>'Ocorreu um erro inesperado!', //Mensagem enviada ao atacante
		'callback'=>create_function('',"echo 'Error!'; Yii::app()->end(); return false;"),
		'enable'=>create_function('','return $_GET["r"] != "site/contact";'),
        ),
…

O parametro enable serve para habilitar ou desabilitar a execução do PHPIDS. Esse parametro pode receber diretamente um valor boolean, true para executar a verificação IDS ou false para não executar. Ou pode receber um callback válido que deve retornar um valor boolean. Com essa configuração a IDS pode ser ativada em apenas algumas requisições baseadas nas regras do callback válido passado como parametro. Veja a função call_user_func para saber mais sobre callbacks válidos.

4) Próxima versão 0.3

  • Para próxima versão, mais possibilidades de configuração do PHPIDS, como Log interno do IDS, tmp folder e outras.

  • Tendo sua principal mudança no processamento do callback, que recebera como parametro a avaliação do impacto do ataque, assim o desenvolvedor poderá decidir como reagir baseado no nível de conhecimento do atacante.

5) Como atualizar?

Faça download do arquivo default_rules.xml atualizado em http://php-ids.org/ e substitua a versão antiga na pasta …/protected/components/ids/IDS

Créditos e agradecimentos a equipe de desenvolvedores do PHPIDS.