PolicyD, também conhecido como Cluebringer, é uma ferramenta que permite limitar a quantidade de emails enviados pelo servidor através do Postfix. Neste tutorial mostrarei como instalar a última versão (policyD v2.1) no Linux Debian 7 e configurar o WebUI com NginX para gerenciar as regras.
Veremos também como limitar os emails enviados pelo Roundcube, e no final deste artigo poderemos, opcionalmente, modificar o Postfix para que não permita o envio de email por scripts PHP que não sejam através de contas cadastradas e verificadas (isso aumentará a segurança contra ataques hackers por code injection ou outras vulnerabilidades).
* Procurei documentaçöes durante semanas para conseguir escrever este artigo que ficará como referência, pois essa solução (completa) não existe em qualquer outro tutorial online. Em sites especializados fala-se que a grande falha do Cluebringer é não conseguir limitar o envio pelo Roundcube, vamos ao tutorial e irei provar que isso não é verdade.
* Este tutorial foi testado em nosso servidor Debian 7 com ISPConfig 3 e Postfix, clique aqui e veja como instalar.
* Sempre faça backup/snapshot do servidor antes de instalar e configurar pacotes de aplicativos Linux, caso algo de errado aconteça você poderá restaurar o sistema.
A Baixe a versão 2.1.x: Essa versão permite conexões IPv6 além de ter recursos extras. Acesse o console SSH como superusuário root e digite:
* Note que faremos a instalação manual do aplicativo pois essa versão não está disponível no repositório Debian. Note também que instalaremos o WebUI um web panel que facilitará o gerenciamento de regras.
> cd /root
> wget http://download.policyd.org/v2.1.x-201310261831/cluebringer_2.1.x~201310261831_all.deb
> wget http://download.policyd.org/v2.1.x-201310261831/cluebringer-webui_2.1.x~201310261831_all.deb
B Desinstale a versão anterior caso tenha instalado: Se você seguiu outros tutoriais antes de encontrar este provavelmente tem a versão “postfix cluebringer” instalada, para removê-la:
> apt-get remove postfix-cluebringer postfix-cluebringer-mysql postfix-cluebringer-webui
C Instale o PolicyD: Talvez seja necessário baixar algumas bibliotecas adicionais para suprir dependências dos pacotes, execute os comandos abaixo para resolvê-las e instalar:
> apt-get update
> apt-get install libconfig-inifiles-perl libcache-fastmmap-perl liblist-moreutils-perl
> dpkg -i cluebringer_2.1.x~201310261831_all.deb
> dpkg -i cluebringer-webui_2.1.x~201310261831_all.deb
D Crie as tabelas no Banco de Dados: O instalador adicionou alguns arquivos ao sistema, acesse o diretório /usr/share/doc/cluebringer/database/ para configurar o MySQL:
D.1) Acesse o diretório, descompacte alguns dumps necessários e torne o conversor executável:
> cd /usr/share/doc/cluebringer/database/
> gunzip *.gz
> chmod 744 /usr/share/doc/cluebringer/database/convert-tsql
D.2) As instruções para criar as tabelas apresentam problema com InnoDB no MySQL, execute o conversor para corrigir isso (será criado um novo arquivo chamado policyd.sql):
> for i in core.tsql access_control.tsql quotas.tsql amavis.tsql checkhelo.tsql checkspf.tsql greylisting.tsql accounting.tsql; do ./convert-tsql mysql55 $i; done > policyd.sql
D.3) Ainda dentro do diretório database/ acesse o console do MySQL para criar as tabelas:
* Como exemplo criaremos a tabela com o nome policyd e com as credenciais (Usuário: policyd e Senha: y3Wj7r6X2WbZ)
> mysql -u root -p
* Será solicitado a senha admin do MySQL
mysql> CREATE DATABASE policyd; mysql> CREATE USER 'policyd'@'localhost' IDENTIFIED BY 'y3Wj7r6X2WbZ'; mysql> GRANT ALL PRIVILEGES ON policyd.* TO 'policyd'@'localhost'; mysql> USE policyd; mysql> \. policyd.sql mysql> quit
A Configure o acesso ao banco de dados: Edite o arquivo /etc/cbpolicyd/cluebringer.conf:
Substitua o bloco de código a partir da linha 134: [database] #DSN=DBI:SQLite:dbname=policyd.sqlite DSN=DBI:mysql:database=policyd;host=localhost #Username=root #Password= #
Por este: [database] #DSN=DBI:SQLite:dbname=policyd.sqlite DSN=DBI:mysql:database=policyd;host=localhost Username=policyd Password=y3Wj7r6X2WbZ #
Desative ainda o módulo Greylist na linha 181 (opcionalmente pode deixá-lo ativado caso queira testar e souber o que está fazendo):
enable=0
B Configure o acesso do Web Panel (WebUI) ao banco de dados: Edite o arquivo /etc/cbpolicyd/webui.conf:
Substitua o bloco de código a partir da linha 9: #$DB_DSN="sqlite:////tmp/cluebringer.sqlite"; $DB_DSN="mysql:host=localhost;dbname=cluebringer"; $DB_USER="root"; #$DB_PASS=""; $DB_TABLE_PREFIX="";
Por este: #$DB_DSN="sqlite:////tmp/cluebringer.sqlite"; $DB_DSN="mysql:host=localhost;dbname=policyd"; $DB_USER="policyd"; $DB_PASS="y3Wj7r6X2WbZ"; $DB_TABLE_PREFIX="";
C Inicie o serviço: O daemon cbpolicyD deverá ser iniciado/reiniciado, em seguida verifique se ele está sendo executado:
> /etc/init.d/cbpolicyd restart
> ps ax | grep policyd
> netstat -pln | grep :10031
* O Web Panel do PolicyD não possui controle de acesso restrito nativo permitindo que qualquer pessoa acesse e modifique as regras, vamos criar uma senha de acesso por diretório e restringi-lo usando diretivas no NginX.
A Crie uma senha de acesso: Instalando o Apache2-Utils (*Substitua o usuário e senha abaixo por credenciais de sua escolha caso ache necessário)
> apt-get install apache2-utils
> mkdir -p /etc/nginx/conf.d/cluebringer
> htpasswd -bc /etc/nginx/conf.d/cluebringer/.htpasswd cbadmin X23b2Rm4pU
» Usuário: cbadmin
» Senha: X23b2Rm4pU
B Configure o bloco de diretivas NginX para o Cluebringer: Se você estiver seguindo nossos tutoriais com ISPConfig 3 acesse o website na lista de Sites no painel de controle e clique na aba “Opções“, adicionando as diretivas na caixa “NginX Directives“. Cole este bloco:
* Você poderá acessar o WebPanel pelos endereços http://seudominio.com/webui ou http://seudominio.com/cluebringer após configurado e o domínio propagado, adicione as diretivas abaixo em seu site
* Alternativamente pode-se acessá-lo pelo IP do servidor, siga este tutorial e veja como fazer
location /webui { root /usr/share/cluebringer/; index index.php index.html index.htm; #Para pedir senha no acesso auth_basic "Restrito"; auth_basic_user_file /etc/nginx/conf.d/cluebringer/.htpasswd; location ~ (.+\.php)$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } location /cluebringer { rewrite ^ /webui last; }
* Pode-se usar o PolicyD para limitar o recebimento de emails também, mas eu achei isso irrelevante para o tutorial
A Desabilite as Regras Test: Na instalação foram adicionadas algumas regras de exemplo (Test) que estão habilitadas, para desabilitá-las:
» Policies → Main: Selecione a regra Test e clique em Action<Change>
Altere o último parâmetro Disabled para <Yes>
» Quotas → Configure: Selecione as regras Test (uma de cada vez) e clique em Action<Change>
Altere o último parâmetro Disabled para <Yes>
B Adicione uma nova Regra: O PolicyD permite criar várias regras por domínio, usuário, IP, etc.. E o mais bacana é que pode-se adicionar quantas regras forem necessárias para impor limitações.
Por exemplo, digamos que na sua empresa você queira limitar em 100 a quantidade de emails enviados por hora a todos os funcionários, mas ao mesmo tempo liberar envio infinito ao administrador e ainda restringir em apenas 50 envios por dia aos “usuários problemáticos”. Tudo isso é possível com o PolicyD.
* Neste tutorial apresentarei um exemplo simples limitando em 100 envios por usuário/hora em um determinado domínio do servidor
» Policies → Main: Clique em Action<Add>
» Name : Regra Limite de Envios » Priority : 51 (até 100) » Description: Regra Limite de Envios » Clique em "Enviar" e em "Back to Policies" » Habilite a regra: Selecione-a e clique em Action<Change>: Altere o parâmetro Disabled para <No>
C Adicione Membros à Regra: Isso facilitará o controle dos domínios e usuários. Podemos adicionar domínios inteiros e/ou usuários à mesma Regra.
» Policies → Main: Selecione a Regra na lista e clique em Action<Members>
» Em seguida clique em Action<Add>
» Source : @fatorbinario.com (Source é de onde o email será enviado, note que podemos usar várias opções aqui como domínios inteiros, contas individuais, ou até mesmo de qualquer lugar "any") » Destination : any (Usaremos "any" neste exemplo para limitar os emails que os usuários enviarem do domínio acima para qualquer lugar) » Comment: Regra que limita o domínio Fator Binário » Clique em "Enviar" e em "Back to Members" » Habilite a configuração de Membro: Selecione-a e clique em Action<Change>: Altere o parâmetro Disabled para <No>
D Adicione Quotas: Cotas podem ser configuradas para limitar por quantidade de envios ou tamanho cumulativo de mensagens, neste tutorial o objetivo é limitar a quantidade de envios somente.
» Quotas → Configure: Clique em Action<Add>
» Name : Limite de envios por hora » Track : Sender:user@domain (Esta será a forma como limitaremos os envios. Usando user@domain o PolicyD controlará o contador de envios por usuário separando-os no banco de dados, não sendo necessário criar uma Regra geral para cada conta de email) » Period: 3600 (O tempo está em segundos aqui. Sendo que 3600 segundos equivalem a uma hora) » Link to Policy: Regra Limite de Envios (A Regra que criamos no passo 4B) » Verdict: Defer (delay) » Data: Voce excedeu o limite de cota de emails enviados por hora tente mais tarde (Apesar do nome deste campo parecer tosco ele é muito importante pois é aqui que definimos a mensagem que o usuário receberá caso exceda a cota) » Stop Processing Here: <Yes> (Isso é uma das novidades na última versão e foi um dos motivos de eu optar pela instalação manual do Cluebringer, pois permite que possamos interromper outros filtros se a Regra for quebrada) » Comment: Limite geral de cota por usuario » Clique em "Enviar" e em "Back to Quotas" » Habilite a Regra de Quota: Selecione-a e clique em Action<Change>: Altere o parâmetro Disabled para <No> * IMPORTANTE: Na versão que testei parece haver um pequeno bug: quando adicionei a regra de quota os campos gravaram com valores trocados. Após adicionar Quotas retorne na tela para alterá-la e reescreva todos os campos novamente, clique em salvar que irá corrigir.
E Adicione Limites à Quota: Essa é a última parte da configuração no web panel, vamos impor um limite de envios por hora.
» Quotas → Configure: Selecione a Quota na lista e clique em Action<Limits>
» Em seguida clique em Action<Add>
» Type : Message Count (A outra opção é para tamanho cumulativo de mensagens enviadas) » Counter Limit : 100 (Quantidade de emails permitidos por usuário por hora. Lembre-se que estamos configurando por usuário/hora mas nada impede de configurarmos 1.000 emails por dia por domínio, ou podemos ainda configurar ambos, basta acertar os campos nos passos anteriores) » Comment: O usuário poderá enviar somente essa quantidade por hora » Clique em "Enviar" e em "Back to Quota Limits" » Habilite a configuração de Limite: Selecione-a e clique em Action<Change>: Altere o parâmetro Disabled para <No>
A Altere o Roundcube Webmail: O maior problema que encontrei para escrever este tutorial foi de como “driblar” o Roundcube, pois ele usa por padrão a função interna Mail() do PHP para enviar as mensagens, e mesmo alterando o parâmetro $rcmail_config[‘smtp_server’] para localhost (que habilita o envio por smtp) os emails continuavam sendo enviados sem passar pelos filtros do PolicyD. Veja como alterá-lo de forma correta:
* Publiquei 2 tutoriais aqui no site sobre Roundcube, o primeiro é a instalação da versão disponível no repositório Main e o segundo é um upgrade para a versão do Debian Backports (clique nos links para ir aos tutoriais)
Edite o arquivo /etc/roundcube/main.inc.php:
Linha 72 (ou linha 78 após o upgrade para a versao 0.95)
$rcmail_config['default_host'] = 'localhost';
Bloco de parâmetros entre as linhas 122 a 156 (ou linhas 132 a 168 após o upgrade para a versao 0.95) // ---------------------------------- // SMTP // ---------------------------------- // SMTP server host (for sending mails). // To use SSL/TLS connection, enter hostname with prefix ssl:// or tls:// // If left blank, the PHP mail() function is used // Supported replacement variables: // %h - user's IMAP hostname // %n - http hostname ($_SERVER['SERVER_NAME']) // %d - domain (http hostname without the first part) // %z - IMAP domain (IMAP hostname without the first part) // For example %n = mail.domain.tld, %d = domain.tld $rcmail_config['smtp_server'] = 'tls://%n'; // SMTP port (default is 25; 465 for SSL) $rcmail_config['smtp_port'] = 587; // SMTP username (if required) if you use %u as the username Roundcube // will use the current username for login $rcmail_config['smtp_user'] = '%u'; // SMTP password (if required) if you use %p as the password Roundcube // will use the current user's password for login $rcmail_config['smtp_pass'] = '%p'; // SMTP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or empty to use // best server supported one) $rcmail_config['smtp_auth_type'] = ''; // Optional SMTP authentication identifier to be used as authorization proxy $rcmail_config['smtp_auth_cid'] = null; // Optional SMTP authentication password to be used for smtp_auth_cid $rcmail_config['smtp_auth_pw'] = null;
B Configure o Postfix: Com todas as configurações prontas agora é só acionar o filtro no Postfix, lembrando que se quiser desativar o PolicyD basta desativar os filtros.
Edite o arquivo /etc/postfix/main.cf:
* Se você seguiu o meu tutorial de segurança no Servidor de Emails o parâmetro smtpd_sender_restrictions é parecido com este abaixo, caso não tenha seguido encontre o parâmetro e adicione o filtro no final da linha smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_unknown_recipient_domain, check_recipient_access mysql:/etc/postfix/mysql-virtual_recipient.cf, check_policy_service inet:127.0.0.1:10031, permit
E no final do arquivo adicione esta linha:
smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10031
Por último, e como eu falei no início deste artigo, podemos ainda configurar o Postfix para não permitir o envio de emails por scripts PHP que não sejam através de contas devidamente autenticadas. Para isso adicione mais uma linha ao final do arquivo main.cf:
* Isso fará com que somente emails do sistema enviados pelo root sejam permitidos.
authorized_submit_users = root
* Lembe-se de deixar uma linha em branco no final do arquivo main.cf para evitar problemas.
C Reinicie os serviços e estará pronto :
> /etc/init.d/postfix restart
> /etc/init.d/cbpolicyd restart
Teste as limitações e acerte as configurações pelo WebUI para cada domínio/usuário. Não há necessidade de reiniciar os serviços quando fizer alterações no Web Panel pois os parâmetros são lidos do banco de dados a cada envio.
Somente adicione o parâmetro authorized_submit_users caso haja necessidade e desative-o caso não tenha certeza de sua utilidade.
A configuração acima foi testada em nosso servidor com o Amavis desativado. Para maiores informações siga este link: http://wiki.policyd.org/installing
Em meus testes consegui filtrar 100% dos emails enviados pelo servidor.