Saludos, nuevamente.
Disculpas por la tardanza, mucho trabajo.
En este nuevo post vengo con cambios en la configuración de Exim 4 que expuse en los posts anteriores, para ser más específico, en este post. En esencia, se trata de la inclusión de la posibilidad de tener una copia de los mensajes entrantes y salientes, así como la configuración de la autenticación SMTP vista desde otra perspectiva.
Entonces, para ir entrando en materia, primeramente, mostraré la configuración completa. En ella me he eliminado algunas cosas que considero no son necesarias y me he centrado en lo que les quiero explicar:
CONFDIR=/etc/exim4
FILTERSDIR=CONFDIR/filters
TRANSPORTSDIR=CONFDIR/transport
BLACKLISTEDDIR=FILTERSDIR/blacklisted
WHITELISTEDDIR=FILTERSDIR/whitelisted
MAILDOMAIN = karas.co.cu
MAILNAME = mailserver-1.red.MAILDOMAIN
SMARTHOST_SERVER_NAME = smtp-out.MAILDOMAIN
SMARTHOST_SERVER_PORT = 26
SMARTHOST_ROUTELIST = * SMARTHOST_SERVER_NAME::SMARTHOST_SERVER_PORT
PILERHOST_SERVER_NAME = piler.MAILDOMAIN
PILERHOST_SERVER_PORT = 25
PILERHOST_ROUTELIST = * PILERHOST_SERVER_NAME::PILERHOST_SERVER_PORT
CERTFILE = /etc/exim4/ssl/certs/MAILDOMAIN.pem
VIRTUAL_MAILBOX_BASEPATH=/srv/services/vmail
DEFAULT_MAX_QUOTA = 100M
LDAP_SERVER1_NAME = pdc-karas.MAILDOMAIN
LDAP_SERVER1_PORT = 3268
ldap_default_servers = LDAP_SERVER1_NAME::LDAP_SERVER1_PORT
LDAP_AD_BASE_DN = DC=karas,DC=co,DC=cu
LDAP_AD_USERS_BASE_DN = CN=Users,LDAP_AD_BASE_DN
LDAP_AD_ENTERPRISE_USERS_BASE_DN = OU=KARAS,LDAP_AD_BASE_DN
LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN = CN=Mail Service Allowed Users,LDAP_AD_USERS_BASE_DN
LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN = CN=Mail Service Denied Users,LDAP_AD_USERS_BASE_DN
LDAP_AD_NATIONAL_MAIL_SCOPE_GROUP_CN = CN=Mail Server – National Scope Users Group,LDAP_AD_USERS_BASE_DN
LDAP_AD_INTERNATIONAL_MAIL_SCOPE_GROUP_CN = CN=Mail Server – International Scope Users Group,LDAP_AD_USERS_BASE_DN
LDAP_AD_BIND_DN = CN=vmail,LDAP_AD_USERS_BASE_DN
LDAP_AD_BIND_PASS = MiProgramacion123*
LDAP_AD_MAIL_RCPT_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(userPrincipalName=${local_part}@${domain}))
LDAP_AD_MAIL_SENDER_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(userPrincipalName=$sender_address))
LDAP_AD_MAIL_SERVICE_ALLOWED_SENDER_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(userPrincipalName=$sender_address))
LDAP_AD_MAIL_SERVICE_ALLOWED_RECIPIENT_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(userPrincipalName=${local_part}@${domain}))
LDAP_AD_MAIL_SERVICE_DENIED_SENDER_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)(userPrincipalName=$sender_address))
LDAP_AD_MAIL_SERVICE_DENIED_RECIPIENT_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)(userPrincipalName=${local_part}@${domain}))
LDAP_AD_SENDER_NATIONAL_MAIL_SCOPE_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(memberOf=LDAP_AD_NATIONAL_MAIL_SCOPE_GROUP_CN)(userPrincipalName=$sender_address))
LDAP_AD_SENDER_INTERNATIONAL_MAIL_SCOPE_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(memberOf=LDAP_AD_INTERNATIONAL_MAIL_SCOPE_GROUP_CN)(userPrincipalName=$sender_address))
LDAP_AD_RECIPIENT_NATIONAL_MAIL_SCOPE_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(memberOf=LDAP_AD_NATIONAL_MAIL_SCOPE_GROUP_CN)(userPrincipalName=${local_part}@${domain}))
LDAP_AD_RECIPIENT_INTERNATIONAL_MAIL_SCOPE_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(memberOf=LDAP_AD_INTERNATIONAL_MAIL_SCOPE_GROUP_CN)(userPrincipalName=${local_part}@${domain}))
LDAP_AD_USER_DN_ATTR = distinguishedName
LDAP_AD_MAIL_RCPT_MAIN_ATTRS = sAMAccountName,userPrincipalName
LDAP_AD_USER_DN = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_USER_DN_ATTR?sub?\
LDAP_AD_MAIL_RCPT_FILTER
LDAP_AD_MAIL_RCPT = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_MAIL_RCPT_FILTER
LDAP_AD_MAIL_SENDER = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_MAIL_SENDER_FILTER
LDAP_AD_MAIL_SERVICE_ALLOWED_SENDER = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_MAIL_SERVICE_ALLOWED_SENDER_FILTER
LDAP_AD_MAIL_SERVICE_DENIED_SENDER = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_MAIL_SERVICE_DENIED_SENDER_FILTER
LDAP_AD_MAIL_SERVICE_ALLOWED_RECIPIENT = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_MAIL_SERVICE_ALLOWED_RECIPIENT_FILTER
LDAP_AD_MAIL_SERVICE_DENIED_RECIPIENT = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_MAIL_SERVICE_DENIED_RECIPIENT_FILTER
LDAP_AD_SENDER_NATIONAL_MAIL_SCOPE = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_SENDER_NATIONAL_MAIL_SCOPE_FILTER
LDAP_AD_SENDER_INTERNATIONAL_MAIL_SCOPE = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_SENDER_INTERNATIONAL_MAIL_SCOPE_FILTER
LDAP_AD_RECIPIENT_NATIONAL_MAIL_SCOPE = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_RECIPIENT_NATIONAL_MAIL_SCOPE_FILTER
LDAP_AD_RECIPIENT_INTERNATIONAL_MAIL_SCOPE = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_MAIL_RCPT_MAIN_ATTRS?sub?\
LDAP_AD_RECIPIENT_INTERNATIONAL_MAIL_SCOPE_FILTER
MAX_RCPT = 5
MAX_FAILED_RCPT = 4
timezone = America/Havana
system_filter = FILTERSDIR/system-filters
system_filter_directory_transport = local_copy_outgoing
.ifdef MAILNAME
primary_hostname = MAILNAME
qualify_domain = MAILDOMAIN
.else
MAILNAME=@
MAILDOMAIN=@
.endif
local_interfaces = 10.0.1.66 : 127.0.0.1
.ifdef CERTFILE
daemon_smtp_ports = 25 : 465 : 587
auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}
tls_advertise_hosts = ${if exists{CERTFILE}{*}{127.0.0.1}}
tls_certificate = CERTFILE
tls_privatekey = CERTFILE
tls_on_connect_ports = 465
.else
daemon_smtp_ports = 25
.endif
domainlist local_domains = @
domainlist virtual_domains = \
ns1.MAILDOMAIN : \
MAILDOMAIN : \
MAILNAME
hostlist relay_from_localhost = \
127.0.0.1
hostlist relay_from_internal_networks = \
10.0.1.16/28 : \
10.0.1.32/28 : \
10.0.1.64/27 : \
10.0.1.128/25
hostlist relay_from_mx_servers = \
10.0.1.98
hostlist relay_from_smtp_servers = \
10.0.1.99
hostlist relay_from_non_smtpauth_servers = \
10.0.1.69 : \
10.0.1.70 : \
10.0.1.71 : \
10.0.1.72
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_mime = acl_check_mime
acl_smtp_data = acl_check_content
never_users = root:daemon:bin:sync
disable_ipv6 = true
rfc1413_hosts = *
rfc1413_query_timeout = 5s
ignore_bounce_errors_after = 2d
timeout_frozen_after = 1d
split_spool_directory = true
smtp_accept_queue_per_connection = 24
smtp_accept_max_per_host = 8
smtp_accept_max_per_connection = 100
smtp_accept_max = 640
smtp_banner = «Sistema de Correo Electronico de KARAS Project»
av_scanner = clamd:/var/run/clamav/clamd.ctl
spamd_address = 127.0.0.1 783
exim_user = Debian-exim
exim_group = mail
message_logs = true
write_rejectlog = true
auto_thaw = 2d
message_size_limit = 2M
bounce_return_size_limit = 5K
smtp_max_unknown_commands = 1
queue_only_load = 96
queue_run_max = 30
deliver_queue_load_max = 128
allow_domain_literals = false
trusted_users = mail
trusted_groups = mail
freeze_tell = postmaster
message_body_visible = 5000
remote_max_parallel = 15
smtp_reserve_hosts = +relay_from_localhost
smtp_load_reserve = 40
smtp_accept_max_nonmail = 7
keep_environment =
log_selector = \
+address_rewrite \
+all_parents \
+arguments \
+connection_reject \
+delay_delivery \
+deliver_time \
+delivery_size \
+dnslist_defer \
+incoming_interface \
+incoming_port \
+lost_incoming_connection \
+queue_run \
+received_sender \
+received_recipients \
+retry_defer \
+sender_on_delivery \
+size_reject \
+skip_delivery \
+smtp_confirmation \
+smtp_connection \
+smtp_protocol_error \
+smtp_syntax_error \
+smtp_incomplete_transaction \
+subject \
+tls_cipher \
+tls_peerdn
########################################################
# ACL CONFIGURATION
########################################################
begin acl
acl_check_rcpt:
deny hosts = ! +relay_from_localhost : ! +relay_from_internal_networks : ! +relay_from_mx_servers : ! +relay_from_smtp_servers
message = Solamente los servidores de correo internos/externos, equipos \n\
y/o subredes autorizados pueden hacer relay a este servidor
log_message = Relay access denied. It’s not an internal/external mail server, network or authorized hosts
deny message = Caracteres no permitidos en la direccion
log_message = Restricted characters in address
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
deny condition = ${lookup{$sender_address_domain}wildlsearch{BLACKLISTEDDIR/blacklisted-domains}{yes}}
message = El dominio $sender_address_domain se encuentra en lista \n\
negra en nuestros servidores. Contacte con el \n\
administrador si cree que esto es incorrecto
log_message = Blacklisted domain $sender_address_domain
deny condition = ${lookup{$domain}wildlsearch{BLACKLISTEDDIR/blacklisted-domains}{yes}}
message = El dominio $domain se encuentra en lista negra en \n\
nuestros servidores. Contacte con el administrador \n\
si cree que esto es incorrecto
log_message = Blacklisted domain $domain
deny condition = ${if or {\
{eq {yes}{${lookup{$sender_address_domain}wildlsearch{BLACKLISTEDDIR/blacklisted-hosts}{yes}}}}\
{eq {yes}{${lookup{$sender_host_address}wildlsearch{BLACKLISTEDDIR/blacklisted-hosts}{yes}}}}\
}\
}
message = En nombre del host o la direccion IP del emisor se \n\
encuentra en lista negra en nuestros servidores \n\
Contacte con el administrador si cree que esto es \n\
incorrecto
log_message = Blacklisted host $sender_address_domain
deny condition = ${lookup{$domain}wildlsearch{BLACKLISTEDDIR/blacklisted-hosts}{yes}}
message = En nombre del host destinatario se encuentra en lista \n\
negra en nuestros servidores Contacte con el \n\
administrador si cree que esto es incorrecto
log_message = Blacklisted host $domain
# Regla para la restriccion de remitentes que estan en lista negra
# Variante Funcional No. 1
#
deny condition = ${lookup{$sender_address}wildlsearch{BLACKLISTEDDIR/blacklisted-senders}{yes}}
message = El remitente $sender_address se encuentra en lista \n\
negra en nuestros servidores. Contacte con el \n\
administrador si cree que esto es incorrecto
log_message = Blacklisted sender $sender_address
# Regla para la restriccion de remitentes que estan en lista negra
# Variante Funcional No. 2
#
# deny message = Remitente $sender_address en lista negra
# log_message = Blacklisted sender $sender_address
# senders = lsearch;BLACKLISTEDDIR/blacklisted-senders
deny condition = ${lookup{$sender_address}wildlsearch{WHITELISTEDDIR/whitelisted-senders}{no}}
message = El remitente $sender_address se encuentra en lista \n\
negra en nuestros servidores. Contacte con el \n\
administrador si cree que esto es incorrecto
log_message = Blacklisted sender $sender_address
deny condition = ${lookup{${local_part}@${domain}}wildlsearch{BLACKLISTEDDIR/blacklisted-recipients}{yes}}
message = El destinatario ${local_part}@${domain} se encuentra \n\
en lista negra en nuestros servidores. Contacte con \n\
el administrador si cree que esto es incorrecto
log_message = Blacklisted recipient ${local_part}@${domain}
deny message = Acceso denegado. No es un remitente @MAILDOMAIN. \n\
Open Relay denegado en este servidor.
log_message = Access denied. Not @MAILDOMAIN sender. Open Relay denied in thin server.
senders = ! : !MAILDOMAIN : !*.MAILDOMAIN
recipients = ! : !MAILDOMAIN : !*.MAILDOMAIN
deny message = El usuario con el cual pretende enviar correos no \n\
existe en nuestro dominio. Es acaso esto un intento \n\
de enviar spam a traves de nuestro servidor de \n\
correo? De ser este su objetivo, no se le permitira \n\
completar su operacion
log_message = Email sender does not exist
senders = MAILDOMAIN
condition = ${lookup ldap{LDAP_AD_MAIL_SENDER} {no}{yes}}
deny message = El usuario al cual le esta tratando de alcanzar no \n\
existe en nuestro dominio. Por favor, revise la \n\
direccion del destinatario por si la ha tecleado mal \n\
o ha dejado espacios innecesarios.
log_message = Email recipient does not exist
domains = MAILDOMAIN
condition = ${lookup ldap{LDAP_AD_MAIL_RCPT} {no}{yes}}
condition = ${lookup{$local_part}lsearch{/etc/aliases}{no}}
deny condition = ${lookup ldap{LDAP_AD_MAIL_SERVICE_DENIED_SENDER} {yes}{no}}
senders = MAILDOMAIN
message = La cuenta $sender_address tiene denegado el acceso al \n\
servicio de correo electronico.
log_message = Mail Service access for this account $sender_address is denied
deny condition = ${lookup ldap{LDAP_AD_MAIL_SERVICE_DENIED_RECIPIENT} {yes}{no}}
message = El destinatario al cual le esta tratando de enviar \n\
correos tiene denegado el acceso al servicio correo \n\
electronico en su dominio.
domains = MAILDOMAIN
log_message = Mail Service access for the recipient address is denied on his domain
deny condition = ${lookup ldap{LDAP_AD_MAIL_SERVICE_ALLOWED_SENDER} {no}{yes}}
senders = MAILDOMAIN
message = La cuenta $sender_address no tiene aun habilitado el acceso \n\
al servicio correo electronico
log_message = Mail Service access for this account $sender_address not enabled yet
deny condition = ${lookup ldap{LDAP_AD_MAIL_SERVICE_ALLOWED_RECIPIENT} {no}{yes}}
message = El destinatario al cual le esta tratando de enviar correos \n\
no tiene aun habilitado el acceso al servicio correo \n\
electronico en su dominio
domains = MAILDOMAIN
condition = ${lookup{$local_part}lsearch{/etc/aliases}{no}}
log_message = Mail Service access for the recipient address not enabled yet on his domain
deny condition = ${lookup ldap{LDAP_AD_SENDER_NATIONAL_MAIL_SCOPE} {no}{yes}}
condition = ${lookup ldap{LDAP_AD_SENDER_INTERNATIONAL_MAIL_SCOPE} {no}{yes}}
senders = MAILDOMAIN
message = La cuenta $sender_address tiene acceso servicio correo \n\
electronico, pero aun no tiene establecido alcance alguno. \n\
Contacte con su administrador si cree que esto es incorrecto
log_message = This user account $sender_address have granted access to Mail Service, but it’s have no any scope established yet
deny condition = ${lookup ldap{LDAP_AD_RECIPIENT_NATIONAL_MAIL_SCOPE} {no}{yes}}
condition = ${lookup ldap{LDAP_AD_RECIPIENT_INTERNATIONAL_MAIL_SCOPE} {no}{yes}}
domains = MAILDOMAIN
condition = ${lookup{$local_part}lsearch{/etc/aliases}{no}}
message = El destinatario al cual le esta tratando de enviar correo \n\
tiene acceso al servicio correo electronico, pero aun no \n\
tiene establecido alcance alguno. Contacte con su \n\
administrador si cree que esto es incorrecto
log_message = Mail Service access for the recipient address is enabled, but it’s have no any scope established yet
# Regla para la restriccion de salida de correos para determinadas cuentas
# Variante Funcional No. 1
#
deny condition = ${lookup{$sender_address}wildlsearch{FILTERSDIR/national-senders-only}{yes}}
domains = ! *.cu
message = La cuenta de correo $sender_address no tiene permitida \n\
salida de correos con alcance internacional
log_message = The outbound international mail is not allowed for the mail account $sender_address
# Regla para la restriccion de salida de correos para determinadas cuentas
# Variante Funcional No. 2
#
# deny message = La cuenta de correo $sender_address no tiene permitida \n\
# salida de correos con alcance internacional
# log_message = The outbound international mail is not allowed for the mail account $sender_address
# senders =
# domains = ! *.cu
deny condition = ${lookup ldap{LDAP_AD_SENDER_NATIONAL_MAIL_SCOPE}{yes}{no}}
domains = ! *.cu
message = La cuenta de correo $sender_address no tiene permitida \n\
salida de correos con alcance internacional
log_message = The outbound international mail is not allowed for the mail account $sender_address
deny message = Esta cuenta de correo electronico no tiene permitida \n\
entrada de correos internacionales
log_message = The inbound international mails is not allowed for this mail account
senders = ! *.cu
domains = MAILDOMAIN
condition = ${if >{${strlen:$sender_address}}{0}}
condition = ${lookup ldap{LDAP_AD_RECIPIENT_NATIONAL_MAIL_SCOPE}{yes}{no}}
deny message = Esta cuenta de correo electronico no tiene permitida \n\
entrada de correos internacionales
log_message = The inbound international mails is not allowed for this mail account
senders = ! *.cu
domains = MAILDOMAIN
condition = ${if >{${strlen:$sender_address}}{0}}
recipients = lsearch;FILTERSDIR/national-senders-only
deny message = Acceso denegado. No es un remitente @MAILDOMAIN o no \n\
tiene definido alcance de correo electronico
log_message = Access denied. Not @MAILDOMAIN sender or the mail scope is not established yet
senders = ! : !MAILDOMAIN : !*.MAILDOMAIN
condition = ${lookup{${local_part}@${domain}}wildlsearch{FILTERSDIR/international-recipients-allowed}{no}{yes}}
condition = ${lookup ldap{LDAP_AD_RECIPIENT_INTERNATIONAL_MAIL_SCOPE}{no}{yes}}
condition = ${lookup ldap{LDAP_AD_RECIPIENT_NATIONAL_MAIL_SCOPE}{no}{yes}}
accept local_parts = postmaster
domains = +local_domain : +virtual_domains
deny message = No se permiten mas de MAX_RCPT destinatarios.
log_message = Too many recipients. Only MAX_RCPT recipients allowed
condition = ${if >{$rcpt_count}{MAX_RCPT}}
deny message = Por parte de remitentes vacios, solo se acepta un \n\
destinatario
log_message = Only one recipient accepted for NULL sender
senders = :
condition = ${if >{$rcpt_count}{1}{1}}
deny message = No esta autenticado en el servidor o no pude hacer relay
!authenticated = *
hosts = ! +relay_from_localhost : ! +relay_from_mx_servers : ! +relay_from_smtp_servers : ! +relay_from_non_smtpauth_servers
accept hosts = +relay_from_localhost
domains = ! +local_domains : ! +virtual_domains
control = submission/sender_retain
require message = Destinatario no valido
log_message = Invalid recipient
verify = recipient
accept
acl_check_mime:
warn decode = default
deny message = Prohibido el envio de binarios como adjuntos. \n\
El archivo adjunto $mime_filename, que contiene \n\
su mensaje no se puede enviar. Revise su mensaje.
log_message = Binary file detected on email attachment ($mime_filename)
condition = ${if eq{$mime_content_type} \
{application/x-msdos-program} \
{yes}{no}}
deny message = Prohibido el envio de mensajes con este tipo de \n\
archivo adjunto. El archivo adjunto $mime_filename, \n\
que contiene su mensaje no se puede enviar. Revise \n\
su mensaje.
log_message = Blacklisted file extension detected on email attachment ($mime_filename)
condition = ${if match{$mime_filename} \
{\N.+\.(ade|adpx|app|bas|bat|btm|cmd|com|cpl|crt|dat|dll|doc|\
docm|exe|fxp|hlp|hta|inf|ins|isp|jar|js|jse|lnk|mda|mdb|\
mde|mdt|mdw|mdz|msc|msi|msp|mst|ops|pcd|pif|prf|prg|reg|\
scf|scr|sct|shb|shs|url|vb|vbe|vbs|wsc|wsf|wsh|xsl)$\N}\
{yes}{no}}
deny message = Lo sentimos, nadie habla idioma chino aca.
log_message = Sorry, no one speaks Chinese here
condition = ${if eq{$mime_charset}{gb2312}{1}{0}}
defer message = El contenido de este mensaje parece Spam, no se puede enviar. \n\
Por favor, revise su mensaje.
log_message = Charset like to be Spam
condition = ${if match{$mime_charset}{\N.+\N}{yes}{no}}
condition = ${if !match{${lc:$mime_charset}}\
{\N(ascii|iso|utf|windows)\N}\
{yes}{no}}
accept
acl_check_content:
deny message = Este mensaje contiene malware ($malware_name)
malware = *
log_message = malware name=»$malware_name» rcpts=»$recipients» subject=»$h_Subject:»
deny message = Potencial spam. Puede contactar a postmaster@MAILDOMAIN \n\
si cree que esto es incorrecto.
log_message = spam score=»$spam_score» rcpts=»$recipients» subject=»$h_Subject:»
hosts = ! +relay_from_localhost : ! WHITELISTEDDIR/whitelisted-sa-hosts
condition = ${if <{$message_size}{256k}{1}{0}}
spam = nobody/defer_ok
warn message = X-Spam-Score: $spam_score ($spam_bar)
spam = nobody:true/defer_ok
warn message = X-Spam-Report: $spam_report
spam = nobody/defer_ok
accept
#########################################################
# ROUTERS CONFIGURATION
#########################################################
begin routers
.ifdef PILERHOST_ROUTELIST
mailarchive:
debug_print = «R: mailarchive for $local_part@$domain»
driver = manualroute
domains = *
route_list = PILERHOST_ROUTELIST
transport = remote_smtp
self = send
unseen
.endif
transports:
driver = manualroute
domains = ! +local_domains : ! +virtual_domains : wildlsearch;TRANSPORTSDIR/transports
route_data = ${lookup{$domain}wildlsearch{TRANSPORTSDIR/transports}}
same_domain_copy_routing = yes
transport = remote_smtp
no_more
.ifdef SMARTHOST_ROUTELIST
smarthost:
driver = manualroute
domains = ! +local_domains : ! +virtual_domains
route_list = SMARTHOST_ROUTELIST
transport = remote_smtp
.endif
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{$local_part}lsearch{/etc/aliases}}
user = Debian-exim
group = Debian-exim
file_transport = address_file
pipe_transport = address_pipe
virtual_user:
driver = accept
domains = +virtual_domains
retry_use_local_part
cannot_route_message = User unknown
transport = virtual_delivery
condition = ${lookup ldap {LDAP_AD_MAIL_RCPT}{yes}{no}}
local_user:
driver = accept
check_local_user
transport = local_delivery
cannot_route_message = User unknown
############################################################################
# TRANSPORTS CONFIGURATION
############################################################################
begin transports
remote_smtp:
debug_print = «T: remote_smtp for $local_part@$domain»
driver = smtp
dns_qualify_single = false
procmail:
debug_print = «T: procmail for $local_part@$domain»
driver = pipe
path = «/bin:/usr/bin:/usr/local/bin»
command = «/usr/bin/procmail -d ${local_part}»
return_path_add
delivery_date_add
envelope_to_add
user = $local_part
group = mail
initgroups
return_output
deliverquota:
debug_print = «T: deliverquota for $local_part@$domain»
driver = pipe
delivery_date_add
envelope_to_add
return_path_add
log_output
command = «/usr/local/bin/deliverquota -c $home/${local_part}/Maildir»
user = $local_part
group = vmail
umask = 026
return_fail_output
virtual_delivery:
debug_print = «T: virtual delivery for $local_part@$domain»
driver = appendfile
envelope_to_add = true
return_path_add = true
delivery_date_add = true
user = vmail
group = vmail
mode = 0640
directory_mode = 0750
create_directory = true
maildir_format = true
maildir_use_size_file = true
maildir_tag = ,S=$message_size
quota_size_regex = ,S=(\d+)
quota_is_inclusive = false
directory = VIRTUAL_MAILBOX_BASEPATH/${domain}/${local_part}/Maildir
quota = DEFAULT_MAX_QUOTA
quota_warn_threshold = 75%
local_delivery:
debug_print = «T: local_delivery for $local_part@$domain»
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
maildir_format
create_directory
directory = $home/${local_part}/Maildir
user = $local_part
group = mail
directory_mode = 0750
mode = 0640
mode_fail_narrower = false
maildir_tag = ,S=$message_size
address_pipe:
debug_print = «T: address_pipe for $local_part@$domain»
driver = pipe
log_defer_output
log_fail_output
path = «/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin»
return_output
user = mail
group = mail
address_file:
debug_print = «T: address_file for $local_part@$domain»
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
user = mail
group = mail
address_reply:
debug_print = «T: autoreply for $local_part@$domain»
driver = autoreply
local_copy_outgoing:
debug_print = «T: outgoing messages copy for $local_part@$domain»
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
group = mail
user = mail
mode = 0660
maildir_format = true
create_directory = true
#################################################################
# RETRY CONFIGURATION
#################################################################
begin retry
# Address or Domain Error Retries
# —————– —– ——-
*@MAILDOMAIN quota
* * F,1h,4s; G,16h,2m,1.5; F,4d,1h
##################################################################
# REWRITE CONFIGURATION
##################################################################
#begin rewrite
##################################################################
# AUTHENTICATION CONFIGURATION
# SMTP AUTHENTICACION
##################################################################
begin authenticators
LDAP_AD_AUTH1_MAIL_RCPT_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(userPrincipalName=$1))
LDAP_AD_AUTH2_MAIL_RCPT_FILTER = (&(|(objectClass=person)(objectClass=user))(sAMAccountType=805306368)(&(memberOf=LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN)(!(memberOf=LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN)))(userPrincipalName=$2))
LDAP_AD_AUTH1_USER_DN = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_USER_DN_ATTR?sub?\
LDAP_AD_AUTH1_MAIL_RCPT_FILTER
LDAP_AD_AUTH2_USER_DN = \
user=LDAP_AD_BIND_DN \
pass=LDAP_AD_BIND_PASS \
ldap:///LDAP_AD_ENTERPRISE_USERS_BASE_DN?\
LDAP_AD_USER_DN_ATTR?sub?\
LDAP_AD_AUTH2_MAIL_RCPT_FILTER
plain_server:
driver = plaintext
public_name = PLAIN
server_prompts = :
server_condition = \
${lookup ldap{user=»${lookup ldapdn{LDAP_AD_AUTH2_USER_DN}}» \
pass=$3 \
ldap:///}\
{yes}fail}
server_set_id = $2
login_server:
driver = plaintext
public_name = LOGIN
server_prompts = «Username:: : Password::»
server_condition = \
${if ldapauth{user=»${lookup ldapdn{LDAP_AD_AUTH1_USER_DN}}» \
pass=${quote:$2} \
ldap:///}\
{yes}{no}}
server_set_id = $1
cram_md5_server:
driver = plaintext
public_name = CRAM-MD5
server_prompts = «Username:: : Password::»
server_condition = \
${if ldapauth{user=»${lookup ldapdn{LDAP_AD_AUTH2_USER_DN}}» \
pass=${quote:$3} \
ldap:///}\
{yes}{no}}
server_set_id = $2
# CONFIGURATION FOR local_scan()
# begin local_scan
En ella se han añadido elementos nuevos y modificado otros, así que comenzaré por el principio.
- Modificación de los valores del Smarthost adonde se enviarán los mensajes salientes
SMARTHOST_SERVER_NAME = smtp-out.MAILDOMAIN
SMARTHOST_SERVER_PORT = 26
SMARTHOST_ROUTELIST = * SMARTHOST_SERVER_NAME::SMARTHOST_SERVER_PORT
En estos días varios miembros del canal Sysadminscuba en Telegram estuvimos analizando y probando la nueva versión del Proxmox Mail Gateway, la 5.0. Las versiones anteriores eran de subscripción solamente y nos teníamos que conformar con la documentación, pero afortunadamente esta versión tiene una variante “community” o “no subscription”, la cual permite hacer un uso bastante aceptable de esta plataforma, algo similar al uso que le damos al Proxmox VE.
Para el caso que nos ocupa, Proxmox Mail Gateway, en lo adelante PMG, separa los dos tipos de tráfico, o sea, el entrante y el saliente. El tráfico entrante desde Internet lo recibe por el puerto 25/tcp, y el tráfico proveniente de los mailers internos, que va dirigido a redes externas, lo recibe por el puerto 26/tcp.
Por tanto, a la hora de establecer el smarthost o servidor de correo padre en el MTA o Mailer interno, se debe especificar también el puerto por el cual dicho smarthost acepta el tráfico saliente.
- Inclusión de un servidor de almacenamiento de correos electrónico (Mail Piler)
PILERHOST_SERVER_NAME = piler.MAILDOMAIN
PILERHOST_SERVER_PORT = 25
PILERHOST_ROUTELIST = * PILERHOST_SERVER_NAME::PILERHOST_SERVER_PORT
Otro de los servicios que hemos estado analizando y probando en el canal antes mencionado es el Mailpiler, el cual es una variante muchísimo más elegante a la tradicional de tener un buzón con una copia de los mensajes entrantes y salientes durante un año, regulación del Mincom de obligatorio cumplimiento.
Ahora bien, ¿qué es MailPiler? Pues, basado en el artículo de Alexander en el sitio de los Administradores de Sistemas de Cuba, es una solución open-source avanzada para el archivado de correo electrónico, muy útil para cualquier organización. Los beneficios de tener este servicio en nuestra red son los siguientes:
- Repositorio central de correos electrónicos
- Proporciona información necesaria en el proceso de análisis o informática forense
- No requiere que los servidores de correos de los cuales guarda una copia de todos los mensajes estén en línea, por lo que es independiente
- Almacenamiento de correos electrónicos a largo plazo.
- Compresión y deduplicación inteligente que permite un ahorro de espacio
- Facilidad en la auditoría proporcionando información relevante
- Descarga de mensajes a la carga, lo cual miniza los costos de almacenamiento
Entonces, la configuración del router de Exim 4 es la siguiente:
.ifdef PILERHOST_ROUTELIST
mailarchive:
debug_print = «R: mailarchive for $local_part@$domain»
driver = manualroute
domains = *
route_list = PILERHOST_ROUTELIST
transport = remote_smtp
self = send
unseen
.endif
La cual es similar al asociado al smarthost con algunos cambios.
- Modificación de los grupos de hosts que serán usados en las ACLs
hostlist relay_from_localhost = \
127.0.0.1
hostlist relay_from_mx_servers = \
10.0.1.98
hostlist relay_from_smtp_servers = \
10.0.1.99
hostlist relay_from_non_smtpauth_servers = \
10.0.1.69 : \
10.0.1.70 : \
10.0.1.71 : \
10.0.1.72
Este cambio en los grupos de hosts es consecuencia del análisis y pruebas hechas, así como la separación de roles de los servidores de correo. Antes todo estaba en un mismo grupo, lo cual no aportaba elegancia alguna al código.
Como se ve, se separaron en varios grupos, los mismos son:
- El propio servidor o MTA (localhost)
- Servidores de Correo de Tráfico Entrante (MX)
- Servidores de Correo de Tráfico Saliente (SMTP)
- Servidores o Equipos que tienen aplicaciones o servicios que envían notificaciones a través del correo electrónico y no dan opciones de configurar SMTP autenticado
- Regla que chequea que solamente los equipos que interesan puedan conectarse a este servidor para realizar transferencia de mensajes, en otras palabras, que pueden hacer relay al mismo
deny hosts = ! +relay_from_localhost : ! +relay_from_internal_networks : ! +relay_from_mx_servers : ! +relay_from_smtp_servers
message = Solamente los servidores de correo internos/externos, equipos \n\
y/o subredes autorizados pueden hacer relay a este servidor
log_message = Relay access denied. It’s not an internal/external mail server, network or authorized hosts
NOTA: Esta regla actuará como complemento al cortafuegos del servidor. En otras palabras, en caso de que el cortafuegos deje de funcionar por la razón que sea, esta ACL garantizará que solamente los equipos autorizados puedan hacer relay a este servidor.
- Esta regla garantiza que todas las sesiones SMTP que se realicen en el servidor sean autenticadas. En otras palabras, nada de sesiones a través de Telnet/SWAKS para spamear o hacer cosas raritas
deny message = No esta autenticado en el servidor o no pude hacer relay
!authenticated = *
hosts = ! +relay_from_localhost : ! +relay_from_mx_servers : ! +relay_from_smtp_servers : ! +relay_from_non_smtpauth_servers
NOTA: En la versión anterior puse lo siguiente:
deny message = No esta autenticado en el servidor o no pude hacer relay
!authenticated = *
hosts = +auth_from_hosts
Donde el hostslist auth_from_hosts contenía:
hostlist auth_from_hosts = \
10.0.1.32/28 : \
10.0.1.128/25
Como puede verse, hay una gran diferencia entre estas versiones. En la anterior solamente restringía el acceso a dos subredes, excluyendo las demás; en otras palabras, estaba haciendo algo similar a una política permisiva por defecto (ACCEPT) en un cortafuegos, donde desde cualquier subred que no fuesen esas dos se podía hacer cualquier cosa maliciosa con el correo. En esta nueva versión, lo que hago es restringir a todo el mundo, excepto a las subredes y equipos que deben entregar correo directamente (MX, notificaciones de servicios, equipos de gestión para pruebas del servicio de correo, etc.)
- Regla para forzar el uso de Submission para el envío de correos electrónicos
accept hosts = ! +relay_from_localhost : ! +relay_from_mx_servers : ! +relay_from_smtp_servers : ! +relay_from_non_smtpauth_servers
domains = ! +local_domains : ! +virtual_domains
control = submission/sender_retain
NOTA: Aquí aplica la nota del punto anterior.
- Regla para denegar mensajes que contengan adjuntos con extensiones problemáticas como EXE, PIF, BAT, CMD, etc.
deny message = Prohibido el envio de binarios como adjuntos. \n\
El archivo adjunto $mime_filename, que contiene \n\
su mensaje no se puede enviar. Revise su mensaje.
log_message = Binary file detected on email attachment ($mime_filename)
condition = ${if eq{$mime_content_type} \
{application/x-msdos-program} \
{yes}{no}}
deny message = Prohibido el envio de mensajes con este tipo de \n\
archivo adjunto. El archivo adjunto $mime_filename, \n\
que contiene su mensaje no se puede enviar. Revise \n\
su mensaje.
log_message = Blacklisted file extension detected on email attachment ($mime_filename)
condition = ${if match{$mime_filename} \
{\N.+\.(ade|adpx|app|bas|bat|btm|cmd|com|cpl|crt|dat|dll|doc|\
docm|exe|fxp|hlp|hta|inf|ins|isp|jar|js|jse|lnk|mda|mdb|\
mde|mdt|mdw|mdz|msc|msi|msp|mst|ops|pcd|pif|prf|prg|reg|\
scf|scr|sct|shb|shs|url|vb|vbe|vbs|wsc|wsf|wsh|xsl)$\N}\
{yes}{no}}
NOTA: A partir de la versión 4.88 de Exim, cambia la manera en la que se especifica esta ACL para el análisis, tanto de la cabecera MIME, como del contenido de los mensajes. En la configuración anterior se empleaban más líneas.
- Regla para rechazar los mensajes que no contengan un conjunto de caracteres adecuado, en otras palabras, que sean mensajes entendibles por nosotros, los que no usamos idiomas simbólicos como los asiáticos.
defer message = El contenido de este mensaje parece Spam, no se puede enviar. \n\
Por favor, revise su mensaje.
log_message = Charset like to be Spam
condition = ${if match{$mime_charset}{\N.+\N}{yes}{no}}
condition = ${if !match{${lc:$mime_charset}}\
{\N(ascii|iso|utf|windows)\N}\
{yes}{no}}
Y hasta aquí los cambios. Espero que les sean de utilidad. Cualquier crítica o sugerencia será bienvenida. 🙂





puedes activar los rss en tu blog ?
Saludos, José Betancourt.
No soy el que maneja el hosting de CubaVa.
🙂
Saludos Hector soy fiel seguidor de tu blog he aprendido mucho por la parte de proxmox para cluster AD…. recientemente he tenido varios problemitas en otros temas que necesito urgentemente solucionar con solo poco de tu tiempo me ayudarias grandemente..por favor escribeme al mi correo para intercambiar, saludos y gracias de antemano..