Voltar para blog

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

17/04/2025 · 3 min · cPanel

Compartilhar

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:

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:

  1. Camada global (System Filter): remover apenas .eml do filtro customizado para permitir exceção controlada.
  2. Camada de política (ACL): permitir .eml somente para domínios aprovados por whitelist.

Com isso:

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:

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:

4.5 Criar whitelist de domínios permitidos

cat > /etc/exim/allowed_ANEXOS_domains.txt << 'LIST'
dominio-cliente.com
parceiro.com.br
LIST

Formato:

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

5.2 Recebimento externo -> domínio não permitido

5.3 Envio local (webmail) -> externo

5.4 Fila e bounces

exim -bp
exim -Mvl <msgid>
tail -f /var/log/exim_mainlog

Resultado esperado:

6) Hardening e manutenção contínua

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:

Com esse desenho, o ambiente manteve proteção ampla para anexos perigosos e passou a aceitar .eml apenas onde existe justificativa operacional.

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.