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
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)
Ou seja: a mensagem original era bloqueada, e o próprio relatório de erro também era impactado por conter o anexo original.
2) Causa raiz
O bloqueio não estava apenas nas ACLs. O problema principal estava no filtro global:
- 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
Conclusão: ajustar apenas ACL sem tratar o system filter não resolve de forma consistente.
3) Estratégia aplicada (segura e sustentável)
Implementei em duas camadas:
- Camada global (System Filter): remover apenas
.emldo filtro customizado para permitir exceção controlada. - Camada de política (ACL): permitir
.emlsomente para domínios aprovados por whitelist.
Com isso:
- segurança global de anexos perigosos permanece ativa
.emlpassa a ser exceção governada por regra explícita- evita manutenção manual repetitiva por conta individual
4) Passo a passo operacional
4.1 Criar filtro customizado persistente
Nunca edite diretamente o filtro base em ambiente com updates frequentes.
cp -p /etc/cpanel_exim_system_filter /etc/cpanel_exim_system_filter_custom
nano /etc/cpanel_exim_system_filter_custom
No arquivo customizado, localizar ocorrências de eml| e remover |eml das regras relevantes.
4.2 Ativar filtro custom no WHM
Caminho:
WHM -> Service Configuration -> Exim Configuration Manager -> Basic Editor -> Filters
Definir System Filter File para:
/etc/cpanel_exim_system_filter_custom
Salvar e validar que o caminho permaneceu ativo após apply.
4.3 ACL de recebimento externo (acl_smtp_mime)
No Advanced Editor, inserir lógica com whitelist por domínio de destino:
acl_smtp_mime:
accept sender = :
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
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 extensão não permitida.
accept
Ponto-chave: accept sender = : evita bloqueio de bounces legítimos.
4.4 ACL de envio local/webmail (acl_not_smtp_mime)
Aplicar lógica equivalente, mas com validação do domínio remetente local ($sender_address_domain) para manter controle de quem pode enviar .eml para fora.
Estratégia recomendada:
- domínio permitido envia
.eml - domínios fora da whitelist continuam bloqueados
- extensões realmente perigosas seguem bloqueadas para todos
4.5 Criar whitelist de domínios permitidos
cat > /etc/exim/allowed_ANEXOS_domains.txt << 'LIST'
dominio-cliente.com
parceiro.com.br
LIST
Formato:
- um domínio por linha
- sem espaços extras
- preferencialmente em minúsculas
4.6 Validar configuração antes de reload
exim -bV
exim -bP system_filter
exim -bP acl_smtp_mime
exim -bP acl_not_smtp_mime
Depois aplicar reload com janela controlada:
/scripts/restartsrv_exim
5) Testes de validação que executei
5.1 Recebimento externo -> domínio permitido
- enviar e-mail com
teste.emlpara domínio da whitelist - resultado esperado: entrega normal
5.2 Recebimento externo -> domínio não permitido
- enviar e-mail com
teste.emlpara domínio fora da whitelist - resultado esperado: deny com mensagem de política
5.3 Envio local (webmail) -> externo
- testar domínio permitido e não permitido
- validar aderência da ACL local
5.4 Fila e bounces
exim -bp
exim -Mvl <msgid>
tail -f /var/log/exim_mainlog
Resultado esperado:
- sem crescimento de mensagens
frozenpor esse motivo - bounces fluindo normalmente
6) Hardening e manutenção contínua
- manter ClamAV/antimalware e SpamAssassin ativos
- revisar o caminho do
System Filter Fileapós updates do cPanel - versionar snippets de ACL e whitelist em repositório interno
- registrar mudança como exceção formal de segurança (governança)
Conclusão técnica
A liberação de .eml em Exim/cPanel deve ser tratada como exceção controlada, não como abertura global.
A solução robusta foi:
- filtro customizado sem
|emlna camada global - ACL MIME com decisão por domínio permitido
- regra explícita para não quebrar bounces (
accept sender = :)
Com esse desenho, o ambiente manteve proteção ampla para anexos perigosos e passou a aceitar .eml apenas onde existe justificativa operacional.
Este post está licenciado sob CC BY-NC.
Comentários
Participe da discussão abaixo.
Comentários ainda não configurados. Adicione as opções do Cusdis em /assets/json/config/blog-comments-config.json.