PolicyD: Limitando o envio de emails pelo Postfix

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.

Instalando e configurando a última versão do PolicyD para limitar o envio de emails

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

Baixe e instale o Cluebringer (PolicyD)

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
2 Configurando o PolicyD

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

3 Configurando o WebUI no NginX

* 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;
}
4 Criando regras para limitar o envio de emails

* 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:[email protected] (Esta será a forma como limitaremos os envios. Usando [email protected] 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>
5 Configure o Roundcube e o Postfix

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

NOTAS:

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.

Gerenciamento de Servidores Cloud com atendimento e consultoria em português. Planos mensais com os melhores preços do mercado.
Envie um email para [email protected] e saiba mais!

  • Gláucio Júnior Teixeira

    Olá Luis, tudo bem !
    Tenho seguido vários de seus tutoriais e não posso deixar de dizer o quanto são bons. Parabéns !
    Este tutorial aqui é o primeiro que sinto necessidade de pedir sua ajuda para entender, fazendo três perguntas:
    1 – A versão do meu Roundcube é 1.1.5 e não consegui encontrar o arquivo /etc/roundcube/main.inc.php indicado no passo 5A. Confirme se na minha versão do Roundcube o arquivo é o /etc/roundcube/config.inc.php.
    2 – Outra duvida é por que precisamos mudar a porta smtp de 25 para 587 ?
    3 – A ultima pergunta é considerando que devo mesmo alterar o arquivo /etc/roundcube/config.inc.php, alterando a porta 25 para 587, por que estou recebendo um aviso de que ha falha de autenticação do SMTP quando vou enviar um e-mail ?

  • Olá Gláucio,
    Sim, a partir da penúltima versão o arquivo de configuração do Roundcube mudou para config.inc.

    Nos meus tutoriais sigo recomendações internacionais e habilito envio TLS que responde na porta 587.

    Se seguir o tutorial a risca e ligando as linhas indicadas no main.cf o TLS fica habilitado e deveria funcionar corretamente, mas caso o erro persista pode deixar tudo na porta 25 mesmo, a 587 é mais segura, só isso..

  • Gláucio Júnior Teixeira

    Obrigado Luis pelo rápido retorno.
    Quando deixo na porta 25 e não altero o smtp_server, não ha mais exibição de mensagem de erro, mas as minhas mensagens estão caindo na caixa de spam. Fiz o teste no http://www.mail-tester.com/ e obtive pontuação 10/10 para o meu servidor de emails só que minhas mensagens não vão para a caixa de entrada dos principais dominios (@gmail, @hotmail).
    No outro tutorial que você escreveu chamado “TUTORIAL DEBIAN 8 X64 COM ISPCONFIG E NGINX: SERVIDOR DE EMAIL”, tem um comentário do Weslley Almeida relatando a mesma dificuldade com a entrega dos emails.
    Neste caso então não seria necessário mudar o parâmetro para [‘smtp_server’] = ‘tls://%n’ ?
    Ainda em tempo, quais são as linhas para serem alteradas no arquivo /etc/postfix/main.cf que habilitam o TLS ? Apenas inserir as linhas abaixo no main.cf:
    check_policy_service inet:127.0.0.1:10031,
    e
    smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10031

  • Use SMTP Relay, tenho vários tutoriais no site ensinando isso. Até mesmo a Digital Ocean usa SMTP Relay.

    Empresas como Google e Microsoft adotaram como padrão marcar emails enviados por IPs de servidores VPS como SPAM, use relay e fique tranquilo..

  • Gláucio Júnior Teixeira

    Muito obrigado Luis pela presteza e dedicação ! Valeu mesmo. Vou implementar o relay externo.