Como liberar anexos .eml no Exim + cPanel/CloudLinux sem perder o controle por domínio
Voltar para blog

Como liberar anexos .eml no Exim + cPanel/CloudLinux sem perder o controle por domínio

07/06/2026 · 10 min · Infraestrutura

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:

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:

  1. Camada global (System Filter): Remover apenas a extensão .eml da lista de bloqueio global no arquivo de filtro customizado do Exim, permitindo que o processamento da mensagem prossiga para a próxima etapa.
  2. Camada de política (ACL): Configurar o Exim para validar o anexo .eml dinamicamente contra uma whitelist de domínios em /etc/exim/allowed_ANEXOS_domains.txt.

Com isso, garantimos que:


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:

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:

  1. Acesse o WHM -> Service Configuration -> Exim Configuration Manager.
  2. Na aba Basic Editor, clique na sub-aba Filters.
  3. Localize a diretiva System Filter File.
  4. Selecione a opção correspondente ao arquivo customizado e insira o caminho completo: /etc/cpanel_exim_system_filter_custom.
  5. 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:


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:

  1. Consulte o certificado e a chave privada ativos nas configurações do Exim:
exim -bP tls_certificate
exim -bP tls_privatekey
  1. 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"
  1. 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:

  1. Verifique se o Exim está ativamente assinando e conferindo assinaturas DKIM no arquivo de configuração principal:
grep -i "dkim" /etc/exim.conf
  1. 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:

  1. 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
  1. Restaurar a configuração compilada do Exim a partir da cópia de segurança salva:
cp /root/exim.conf.bak.* /etc/exim.conf
  1. Excluir o arquivo de whitelist de domínios:
rm -f /etc/exim/allowed_ANEXOS_domains.txt
  1. Reiniciar o serviço Exim para aplicar a configuração padrão estável:
/scripts/restartsrv_exim
  1. 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:

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çaSeveridadeDescriçãoAção de Mitigação Implementada
Bounces CongeladosAltaFalhas 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 AcidentalAltaLiberaçã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 / SpoofingMédiaVetores 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çõesMédiaAtualizaçõ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 IncorretaBaixaExim 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:

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.

0 comentários