Durante troubleshooting de entrega de e-mail em servidor cPanel/CloudLinux, identifiquei um cenário clássico: anexos .eml bloqueados globalmente pelo system filter, com efeito colateral de bounce congelado na fila.
O objetivo não era "liberar geral", e sim implementar liberação controlada por domínio, sem derrubar a proteção padrão para extensões perigosas.
1) Sintoma observado em produção e efeito cascata#
O reject ocorria com mensagem de filtro:
This message has been rejected because it has a potentially executable attachment "teste.eml"
Nos logs, o ponto crítico era o efeito cascata no bounce:
Process failed (1) when writing error message ... (frozen)
Esse efeito cascata ocorre porque, quando uma mensagem com anexo .eml é rejeitada, o Exim tenta gerar um relatório de não entrega (bounce). No entanto, esse relatório de erro contém cabeçalhos ou trechos da mensagem original rejeitada, incluindo a extensão .eml. Ao passar pelo system filter global, o próprio bounce é rejeitado por conter a extensão bloqueada. Como resultado, o Exim falha ao tentar escrever a mensagem de erro e congela o bounce na fila (frozen), causando desperdício de recursos, saturação de inodes e acúmulo de lixo na fila do servidor de e-mail.
2) Causa raiz e arquitetura de processamento do Exim#
O bloqueio não estava apenas nas ACLs (Access Control Lists). O problema principal estava no filtro global do sistema:
- arquivo:
/etc/cpanel_exim_system_filter - bloqueio de extensões antes do processamento das ACLs customizadas
- em muitos ambientes, essa lista aparece como "somente leitura" no WHM para edição direta
Na arquitetura do Exim, o system filter é uma camada de processamento global que é executada antes que os filtros de usuário ou as diretivas finais de entrega sejam processadas. Quando uma mensagem de entrada ou saída é submetida ao Exim, ela passa primeiro pelo system filter global. Se o arquivo /etc/cpanel_exim_system_filter contiver a extensão .eml dentro da regra que valida anexos potencialmente perigosos (tratados como potenciais executáveis devido a vulnerabilidades históricas de leitores como o Outlook), a mensagem é descartada ou rejeitada imediatamente. Ajustar apenas a ACL sem tratar o system filter não resolve o problema de forma consistente.
3) Estratégia de mitigação em duas camadas#
Implementei uma solução estruturada em duas camadas para resolver a demanda de negócios sem abrir mão da segurança cibernética geral do servidor:
- Camada global (System Filter): Remover apenas a extensão
.emlda lista de bloqueio global no arquivo de filtro customizado do Exim, permitindo que o processamento da mensagem prossiga para a próxima etapa. - Camada de política (ACL): Configurar o Exim para validar o anexo
.emldinamicamente contra uma whitelist de domínios em/etc/exim/allowed_ANEXOS_domains.txt.
Com isso, garantimos que:
- A segurança global para anexos realmente executáveis perigosos (como
.exe,.cmd,.bat) permanece totalmente ativa. - Arquivos
.emlpassam a ser tratados como uma exceção controlada, autorizada apenas para domínios que necessitam dessa funcionalidade por questões de conformidade legal ou operacional. - Evita-se a manutenção manual repetitiva ou a desativação completa do filtro do Exim.
4) Backups preventivos obrigatórios#
Antes de efetuar qualquer alteração em arquivos de configuração de correio ou de regras do Exim no cPanel, é imprescindível realizar a cópia de segurança de todos os arquivos envolvidos. Isso garante a restauração rápida do serviço de e-mail em caso de erros de sintaxe ou comportamentos imprevistos. Execute os seguintes comandos no terminal como usuário root:
# Backup do system filter do cPanel com timestamp
cp -p /etc/cpanel_exim_system_filter /root/cpanel_exim_system_filter.bak.$(date +%Y%m%d)
# Backup da configuração principal do Exim
cp /etc/exim.conf /root/exim.conf.bak.$(date +%Y%m%d)
# Backup do arquivo de whitelist de domínios (caso já exista)
cp /etc/exim/allowed_ANEXOS_domains.txt /root/allowed_ANEXOS_domains.txt.bak.$(date +%Y%m%d) 2>/dev/null || true
Após executar as cópias de segurança, certifique-se de que os arquivos foram salvos corretamente e possuem as permissões e tamanhos originais preservados utilizando ls -la.
5) Criando o filtro customizado persistente e a lista de extensões bloqueadas#
Nunca edite diretamente o arquivo /etc/cpanel_exim_system_filter. Qualquer alteração no arquivo padrão será sobrescrita silenciosamente durante as atualizações automáticas do cPanel (como execuções do upcp). Em vez disso, crie um filtro customizado persistente:
cp -p /etc/cpanel_exim_system_filter /etc/cpanel_exim_system_filter_custom
nano /etc/cpanel_exim_system_filter_custom
Abra o arquivo /etc/cpanel_exim_system_filter_custom e localize a regra de validação de extensões. Ela costuma se parecer com isto:
if $message_body_attachmentpart: is not "" and
$message_body_attachmentpart: matches "\\\.(ad[ep]|ba[st]|chm|cmd|com|cpl|crt|eml|exe|hlp|hta|in[fs]|isp|jse?|lnk|md[be]|ms[cipt]|pcd|pif|reg|scr|sct|shs|url|vb[se]|ws[fhc])$"
Remova a expressão eml| ou |eml da lista de extensões, deixando a regra da seguinte forma:
if $message_body_attachmentpart: is not "" and
$message_body_attachmentpart: matches "\\\.(ad[ep]|ba[st]|chm|cmd|com|cpl|crt|exe|hlp|hta|in[fs]|isp|jse?|lnk|md[be]|ms[cipt]|pcd|pif|reg|scr|sct|shs|url|vb[se]|ws[fhc])$"
Todas as outras extensões perigosas que permanecem bloqueadas no filtro global são:
- Scripts e Instaladores:
.bat,.cmd,.exe,.msi,.msp,.pif,.scr - Atalhos e Links:
.lnk,.url,.shs - Componentes do Sistema:
.cpl,.crt,.reg,.sys,.dll,.drv - Código Ativo e Macros:
.vbs,.vbe,.js,.jse,.wsf,.wsh,.hta,.chm
Valide quais termos ainda estão inseridos na regra utilizando o comando:
grep -E "exe|cmd|bat|eml" /etc/cpanel_exim_system_filter_custom
Para aplicar o filtro customizado no painel WHM, siga o caminho abaixo:
- Acesse o WHM -> Service Configuration -> Exim Configuration Manager.
- Na aba Basic Editor, clique na sub-aba Filters.
- Localize a diretiva System Filter File.
- Selecione a opção correspondente ao arquivo customizado e insira o caminho completo:
/etc/cpanel_exim_system_filter_custom. - Clique em Save na parte inferior da tela para compilar a alteração.
6) Configurando as ACLs MIME no Exim com whitelists#
Com o filtro do sistema liberando a passagem do tipo de arquivo, devemos implementar a restrição na camada de controle do Exim. Acesse o WHM -> Service Configuration -> Exim Configuration Manager e clique na aba Advanced Editor.
Localize a seção para adicionar ACLs customizadas e insira as seguintes regras:
6.1 ACL de recebimento externo (acl_smtp_mime)#
Abaixo da declaração de acl_smtp_mime:, adicione as diretivas de validação:
acl_smtp_mime:
# Permite bounces legítimos para não congelar mensagens na fila
accept sender = :
# Verifica se o domínio de destino do anexo está na whitelist
warn
set acl_m_allowed_recipient = ${lookup{${lc:${domain:$recipients}}}lsearch{/etc/exim/allowed_ANEXOS_domains.txt}{yes}{no}}
log_message = DEBUG SMTP: Recipient Domain Allowed -> $acl_m_allowed_recipient
# Deny para .eml se o domínio não estiver na whitelist
deny
log_message = DENY: disallowed "$mime_filename" - EML not allowed for recipient
condition = ${if or{ \
{and{ {!eq{$acl_m_allowed_recipient}{yes}} {match{$mime_filename}{\N\.eml$\N}} }} \
{match{$mime_filename}{\N\.(ad[ep]|ba[st]|chm|cmd|com|cpl|crt|exe|hlp|hta|in[fs]|isp|jse?|lnk|md[be]|ms[cipt]|pcd|pif|reg|scr|sct|shs|url|vb[se]|ws[fhc])$\N}} \
} {yes}{no}}
message = Anexo '$mime_filename' possui extensao nao permitida.
accept
Nota crítica sobre a diretiva accept sender = :: Esta regra aceita mensagens cujo remetente de envelope é vazio (sinalizado por <>). No ecossistema SMTP, mensagens com remetente vazio correspondem a e-mails de notificação automática de falha (bounces). Adicionar essa exceção no topo da ACL impede que relatórios de erros que portam os cabeçalhos de arquivos .eml originais sejam rejeitados, eliminando a ocorrência de bounces congelados na fila do servidor.
6.2 ACL de envio local/webmail (acl_not_smtp_mime)#
Esta ACL gerencia os e-mails enviados a partir de scripts internos do servidor ou por clientes logados em interfaces locais de webmail (como Roundcube). Localize acl_not_smtp_mime: e aplique a regra correspondente:
acl_not_smtp_mime:
# Verifica se o domínio do remetente local está na whitelist
warn
set acl_m_allowed_sender = ${lookup{${lc:$sender_address_domain}}lsearch{/etc/exim/allowed_ANEXOS_domains.txt}{yes}{no}}
log_message = DEBUG LOCAL: Sender Domain Allowed -> $acl_m_allowed_sender
# Deny para .eml se o remetente local não for autorizado
deny
log_message = DENY LOCAL: disallowed "$mime_filename" - EML not allowed for sender
condition = ${if or{ \
{and{ {!eq{$acl_m_allowed_sender}{yes}} {match{$mime_filename}{\N\.eml$\N}} }} \
{match{$mime_filename}{\N\.(ad[ep]|ba[st]|chm|cmd|com|cpl|crt|exe|hlp|hta|in[fs]|isp|jse?|lnk|md[be]|ms[cipt]|pcd|pif|reg|scr|sct|shs|url|vb[se]|ws[fhc])$\N}} \
} {yes}{no}}
message = Anexo '$mime_filename' possui extensao nao permitida para envio.
accept
Essa estrutura garante que domínios locais não autorizados não possam ser vetores de envio de anexos .eml para o ambiente externo, mitigando riscos de phishing.
7) Criando e gerenciando a whitelist de domínios permitidos#
Crie o arquivo de whitelist no local apontado pelas regras de busca do Exim:
cat > /etc/exim/allowed_ANEXOS_domains.txt << 'LIST'
empresa-permitida.com.br
dominio-parceiro.com
LIST
Para garantir o processamento correto das pesquisas no banco de dados em texto plano do Exim, observe as regras de formatação do arquivo:
- Insira exatamente um domínio por linha.
- Não deixe linhas em branco ao final ou no meio do arquivo.
- Não insira caracteres especiais, chaves de comentários (como
#) ou espaços em branco ao início ou término de cada domínio. - Utilize todas as letras em caixa baixa (minúsculas).
8) Auditoria de permissões de arquivos no filesystem#
Para que as alterações entrem em vigor de forma segura e o daemon do Exim consiga ler os parâmetros necessários sem gerar falhas de permissão de acesso nos logs, configure as permissões e o proprietário correto dos arquivos. No cPanel, o Exim geralmente opera sob o usuário do sistema mail. Execute os seguintes comandos:
# Definir proprietário e grupo do filtro customizado
chown root:root /etc/cpanel_exim_system_filter_custom
chmod 644 /etc/cpanel_exim_system_filter_custom
# Definir proprietário e grupo da whitelist de domínios
chown root:root /etc/exim/allowed_ANEXOS_domains.txt
chmod 644 /etc/exim/allowed_ANEXOS_domains.txt
Verifique as permissões de acesso rodando uma leitura de teste simulando o usuário de execução do serviço de e-mail do sistema:
sudo -u mail cat /etc/cpanel_exim_system_filter_custom > /dev/null
sudo -u mail cat /etc/exim/allowed_ANEXOS_domains.txt > /dev/null
Se ambos os comandos terminarem com status de saída 0 (sem mensagens de "Permission denied"), as permissões do filesystem estão adequadas e seguras.
9) Verificação de SSL/TLS no Exim#
Mensagens contendo anexos .eml trafegam frequentemente dados corporativos críticos e transacionais. Garantir que a encriptação de transporte (SSL/TLS) esteja ativa e válida evita o vazamento de credenciais e a leitura não autorizada de anexos na rede. Verifique as configurações de criptografia do Exim com os passos abaixo:
- Consulte o certificado e a chave privada ativos nas configurações do Exim:
exim -bP tls_certificate
exim -bP tls_privatekey
- Teste a conexão segura executando um handshake SSL/TLS diretamente na porta SMTP segura (465):
openssl s_client -connect localhost:465 </dev/null 2>/dev/null | grep -i "ssl"
- Valide o período de expiração e o emissor do certificado SSL associado:
openssl x509 -in /etc/ssl/certs/exim.crt -noout -dates
(Substitua /etc/ssl/certs/exim.crt pelo caminho do certificado retornado pela consulta ao tls_certificate na etapa 1).
10) Validação de registros SPF, DKIM e DMARC#
A liberação de arquivos .eml abre margem para ataques de falsificação de identidade (spoofing) se os controles de autenticação de e-mail de borda não estiverem ativos e operacionais. Certifique-se de que os mecanismos de autenticação DNS estejam funcionando:
- Verifique se o Exim está ativamente assinando e conferindo assinaturas DKIM no arquivo de configuração principal:
grep -i "dkim" /etc/exim.conf
- Execute consultas de teste DNS para atestar os registros TXT das chaves de segurança:
# Validar registro SPF
dig TXT seu-dominio.com +short | grep -i "v=spf1"
# Validar registro DMARC
dig TXT _dmarc.seu-dominio.com +short
# Validar a chave pública do seletor DKIM
dig TXT default._domainkey.seu-dominio.com +short
11) Validação pós-configuração, logs e fila do Exim#
Com as configurações concluídas, execute os seguintes testes e monitoramentos para garantir a integridade do ambiente de produção:
11.1 testar a sintaxe dos arquivos do Exim#
Antes de recarregar o daemon, valide a sintaxe do arquivo compilado do Exim para assegurar que não há falhas estruturais ou blocos corrompidos:
exim -bV
11.2 verificar os parâmetros de variáveis carregados em memória#
Confirme se o Exim está apontando para o arquivo de filtro customizado e carregou as ACLs correspondentes:
exim -bP system_filter
exim -bP acl_smtp_mime
exim -bP acl_not_smtp_mime
Após confirmar a consistência das variáveis, recarregue o Exim usando a ferramenta nativa do cPanel:
/scripts/restartsrv_exim
11.3 monitorar logs do Exim em tempo real#
Utilize os comandos de triagem no arquivo /var/log/exim_mainlog para inspecionar falhas e comportamentos de entrega:
# Acompanhar logs de erros, negações e falhas
tail -100 /var/log/exim_mainlog | grep -E -i "error|reject|deny"
# Filtrar mensagens bloqueadas pelo filtro ou ACL
grep -i "blocked" /var/log/exim_mainlog | tail -20
# Verificar entregas bem-sucedidas (sinalizadas pelo operador =>)
grep -i "=>" /var/log/exim_mainlog | tail -20
# Buscar por bounces congelados
grep -i "frozen" /var/log/exim_mainlog | tail -20
11.4 verificar a fila de e-mail e bounces congelados#
Audite a fila de e-mail para validar se o fluxo de mensagens está normalizado:
# Mostrar número de mensagens na fila
exim -bpc
# Listar todas as mensagens na fila
exim -bp
# Contar quantas mensagens estão marcadas como congeladas (frozen)
exim -bp | grep -c "frozen"
# Inspecionar os logs de entrega de uma mensagem específica na fila
exim -Mvl <msgid>
11.5 validar o funcionamento dos daemons de antivírus e antispam#
Para que o bypass de arquivos .eml não comprometa a segurança do servidor contra malwares, ateste o status dos mecanismos de proteção ativa (ClamAV e SpamAssassin):
# Verificar status do daemon do ClamAV
systemctl status clamav-daemon 2>/dev/null || systemctl status clamd 2>/dev/null
# Verificar versão das assinaturas de vírus
freshclam --version
# Verificar status do SpamAssassin (spamd)
systemctl status spamassassin 2>/dev/null || pstree -p | grep spamd
# Verificar nos logs se o tráfego de correio está passando pela validação de segurança
tail -50 /var/log/exim_mainlog | grep -i "clamav\|spamassassin\|spamd"
12) Procedimento de rollback e contingência#
Caso ocorra qualquer comportamento inesperado no recebimento ou no envio de e-mails do servidor após a aplicação do filtro customizado, siga o plano de rollback abaixo para restaurar imediatamente o ecossistema Exim para o seu baseline inicial seguro:
- Reverter o caminho do system filter para o arquivo padrão do cPanel no WHM ou restaurar o arquivo de backup via linha de comando:
cp -p /root/cpanel_exim_system_filter.bak.* /etc/cpanel_exim_system_filter
- Restaurar a configuração compilada do Exim a partir da cópia de segurança salva:
cp /root/exim.conf.bak.* /etc/exim.conf
- Excluir o arquivo de whitelist de domínios:
rm -f /etc/exim/allowed_ANEXOS_domains.txt
- Reiniciar o serviço Exim para aplicar a configuração padrão estável:
/scripts/restartsrv_exim
- Confirmar que o Exim retornou ao baseline verificando a sintaxe da configuração e acompanhando os logs de erros em busca de anomalias:
exim -bV
tail -50 /var/log/exim_mainlog
13) Checklist de hardening e matriz de riscos#
13.1 checklist operacional de habilitação do anexo .eml#
Abaixo estão listadas as tarefas essenciais de validação para a conformidade da liberação de anexos .eml:
- [ ] Realizados backups preventivos com timestamp dos arquivos
/etc/cpanel_exim_system_filtere/etc/exim.conf. - [ ] Criado o arquivo de filtro customizado
/etc/cpanel_exim_system_filter_customremovendo a extensão|eml. - [ ] Ativado o caminho do filtro customizado no painel administrativo do WHM.
- [ ] Configurada a regra de validação
acl_smtp_mimecom a diretiva de proteção de bounceaccept sender = :. - [ ] Configurada a regra de validação local
acl_not_smtp_mimepara monitoramento de envio. - [ ] Criado o arquivo de whitelist
/etc/exim/allowed_ANEXOS_domains.txtcontendo um domínio por linha. - [ ] Aplicadas as permissões recomendadas
644e propriedaderoot:rootnos arquivos criados. - [ ] Validado o acesso de leitura do usuário
maildo Exim aos arquivos do filesystem. - [ ] Ativados e em execução estável os daemons do ClamAV e SpamAssassin.
- [ ] Executada a validação de sintaxe final com
exim -bVe recarregado o serviço.
13.2 matriz de riscos e impacto técnico#
A tabela a seguir consolida as ameaças, a severidade operacional e as ações de mitigação aplicadas:
| Risco / Ameaça | Severidade | Descrição | Ação de Mitigação Implementada |
|---|---|---|---|
| Bounces Congelados | Alta | Falhas na entrega de e-mails com .eml causam relatórios de não-entrega que são bloqueados, saturando a fila. | Implementação da diretiva accept sender = : no início da ACL MIME para liberar bounces. |
| Execução Acidental | Alta | Liberação global de anexos executáveis nocivos mascarados como .eml ou outros tipos. | Preservação integral das regras contra executáveis perigosos (como .exe, .bat) no system filter. |
| Spam / Spoofing | Média | Vetores de phishing utilizando emails .eml anexados sem checagem de propriedade de domínio. | Criação de whitelist estrita e validação obrigatória dos registros SPF, DKIM e DMARC no DNS do remetente. |
| Sobrescrita de Configurações | Média | Atualizações automáticas do cPanel (upcp) sobrescrevem alterações manuais feitas no filtro padrão. | Uso de arquivo de filtro customizado /etc/cpanel_exim_system_filter_custom persistente. |
| Permissão Incorreta | Baixa | Exim falha em ler os arquivos de whitelist ou regras do filtro, gerando "Permission Denied" e falha geral. | Configuração rigorosa de ownership (root:root) e permissões 644 no filesystem. |
Considerações práticas#
A liberação de anexos .eml em ambientes Exim/cPanel deve ser implementada de forma cirúrgica. A combinação de um filtro de sistema customizado e persistente com ACLs MIME granulares por domínio assegura a flexibilidade operacional que a empresa necessita, mantendo o controle sobre as diretivas de segurança e impedindo o acúmulo de e-mails congelados na fila do servidor.
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários