Sistema de Correo Electrónico integrado con un Directorio Activo de Microsoft o Samba 4 de Sernet (Parte III-A)

Saludos nuevamente (y de cabeza al asunto).

Como dije al final del post anterior, hice una modificación a la infraestructura de la empresa KARAS-Project para que se tenga una idea completa del entorno en que se trabajará. Los datos son los siguientes:

Direccionamiento IP del Nodo Principal

  • Subred de Internetworking: 10.0.1.0/28
  • Subred de Gestión de Hipervisores Proxmox: 10.0.1.16/28
  • Subred de los Administradores de Red de KARAS: 10.0.1.32/28
  • Subred de Servidores de Red Internos de KARAS: 10.0.1.64/27
  • Subred de Servidores de Red Externos (DMZ) de KARAS: 10.0.1.96/29
  • Subred de la Red Local de KARAS: 10.0.1.128/25
  • Subred de las Sucursales de KARAS: 10.0.2.0/24

Direccionamiento IP de las Sucursales

  • Sucursal ubicada en Pinar del Río: WAN:10.0.2.0/30, LAN: 10.0.2.128/29
  • Sucursal ubicada en La Habana: WAN:10.0.2.4/30, LAN: 10.0.2.136/29
  • Sucursal ubicada en Varadero: WAN:10.0.2.8/30, LAN: 10.0.2.144/29
  • Sucursal ubicada en Cienfuegos: WAN:10.0.2.12/30, LAN: 10.0.2.152/29
  • Sucursal ubicada en Camagüey: WAN:10.0.2.16/30, LAN: 10.0.2.160/29
  • Sucursal ubicada en Holguín: WAN:10.0.2.20/30, LAN: 10.0.2.168/29

 

Dominios de KARAS

  • karas.co.cu
  • pri.karas.co.cu
  • hab.karas.co.cu
  • var.karas.co.cu
  • cfg.karas.co.cu
  • cmg.karas.co.cu
  • hlg.karas.co.cu

 

Direcciones IP de los Servidores de Correo Internos de KARAS

  • Servidor de Correo Interno Principal: 10.0.1.66
  • Servidor de Correo Interno para los buzones de las Sucursales (MultiPOP): 10.0.1.67
  • Servidor de Correo de la Sucursal ubicada en Pinar del Río: 10.0.2.130
  • Servidor de Correo de la Sucursal ubicada en La Habana: 10.0.2.138
  • Servidor de Correo de la Sucursal ubicada en Varadero: 10.0.2.146
  • Servidor de Correo de la Sucursal ubicada en Cienfuegos: 10.0.2.154
  • Servidor de Correo de la Sucursal ubicada en Camagüey: 10.0.2.162
  • Servidor de Correo de la Sucursal ubicada en Holguín: 10.0.2.170

 

Direcciones IP de los Servidores de Correo Externos (los que están ubicados en la DMZ) de KARAS

  • Servidor de Correo para entrada de correos (MX): 10.0.1.98
  • Servidor de Correo para salida de correos (SMTP): 10.0.1.99

 

Entonces, en las figuras siguientes se muestran dos infraestructuras:

  • Una compleja donde están contenidos todos los elementos antes descritos.
  • Una simple donde, tanto para las estaciones de la Red LAN de KARAS como para sus sucursales, existe un único servidor de correo; o sea, en las dos subredes mencionadas solamente hay estaciones de trabajo, de lo que se deduce que solamente hay un dominio local y no existen subdominios.

 

NOTA: No soy muy bueno con los diagramas, así que pido disculpas si no se entiende muy bien.

 

Infraestructura Compleja de Ejemplo KARAS - Correo Electronico

Figura 1.- Infraestructura Compleja de Ejemplo KARAS – Correo Electronico

 

Infraestructura Simple de Ejemplo KARAS - Correo Electronico

Figura 2.- Infraestructura Simple de Ejemplo KARAS – Correo Electronico

De esta segunda infraestructura hablaremos más adelante en el proceso de configuración del MTA.

3.4.- MTA o Servicio de Correo que atiende el protocolo SMTP / SMTPS / Submission: Exim4

Y ahora pasamos al plato fuerte: el  tan mencionado servicio de correo.

En nuestro caso se utilizará Exim y no Postfix. Aclaro, no es que se desdeñe la potencialidad de Postfix, sino que Exim permite hacer muchas más “cositas cómicas”. En otras palabras, la sección de las ACLs de Exim es una de las partes más interesantes [y desafiantes] que vale la pena explorar, además del uso de otros servicios adicionales como bases de datos de usuarios y contraseñas (donde en este caso se utilizará el servicio LDAP/GC de un Directorio Activo), así como datos de otras configuraciones.

Como acotación adicional, esta configuración que se describirá a continuación es aplicable para cualquier servidor de correo institucional, organizacional o empresarial. De ella se pueden derivar múltiples variantes. En el Anexo 1, se describirá con un mayor nivel de detalles una infraestructura de correo que puede ser aplicada a un Nodo de Comunicaciones o Proveedor de Servicios.

Y bueno, para pasar ya al asunto, lo primero que hay que hacer es instalar Exim 4 y las herramientas cliente de LDAP:

# aptitude install exim4-daemon-heavy ldap-utils

Para las pruebas de correos también es súper importante instalar el paquete swaks, el cual es una herramienta cómoda para testear un servidor de correo (muchísimo mejor que teclear los comandos SMTP a través de una sesión Telnet al puerto 25):

# aptitude install swaks

A modo de ejemplo, para probar el envío de un mensaje el comando sería así:

# swaks –server <NombreFQDN o Dirección IP del Servidor de Correo> –from <Dirección de correo del emisor> –to <Dirección de correo del destinatario>

Esto envía un mensaje de prueba al destinatario que se especifica en el argumento –to, pero si lo que queremos es testear el comportamiento del MTA sin que el usuario final se percate de ello, hay que añadir el parámetro –quit-after RCPT. De modo que el comando quedaría así:

# swaks –server <NombreFQDN o Dirección IP del Servidor de Correo> –from <Dirección de correo del emisor> –to <Dirección de correo del destinatario> –quit-after RCPT

El Swaks tiene una serie de argumentos bastante extensa para testear varias características de servidores de correo. La investigación del mismo se verá en otro manual más adelante, no obstante, los más curiosos pueden consultar las páginas de manual que viene con el paquete, las cuales están bastante interesantes y dan una buena explicación de los argumentos y sus posibles valores de entrada.

Ahora bien, vamos a hacer las cosas a la inversa. Mostraremos la configuración completa de Exim, y se explicarán las partes más interesantes, las cuales están resaltadas en cursiva.

NOTA IMPORTANTE: No realizar el típico copiar-pegar hasta que se hayan visto [y asimilado] las explicaciones posteriores, en caso contrario el MTA no funcionará correctamente.

Este es el contenido del archivo /etc/exim4/exim4.conf:

CONFDIR=/etc/exim4

FILTERSDIR=CONFDIR/filters

TRANSPORTSDIR=CONFDIR/transport

BLACKLISTEDDIR=FILTERSDIR/blacklisted

WHITELISTEDDIR=FILTERSDIR/whitelisted

 

MAILDOMAIN = karas.co.cu

MAILNAME = smtp.MAILDOMAIN

 

SMARTHOST_ROUTELIST = * smtp-out.MAILDOMAIN

 

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 Project,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 = <Contraseña>

 

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

 

domainlist relay_to_domains =       \

             pri.karas.co.cu :  \

             hab.karas.co.cu :  \

             var.karas.co.cu :  \

             cfg.karas.co.cu :  \

             cmg.karas.co.cu : \

             hlg.karas.co.cu

 

hostlist relay_from_hosts =   \
             127.0.0.1

 

hostlist auth_from_hosts =    \

           10.0.1.32/28 :           \

           10.0.1.128/25

 

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_mailservers = \

           10.0.1.98 :            \

           10.0.1.99 :            \

           10.0.2.130 :          \

           10.0.2.138 :          \

           10.0.2.146 :          \

           10.0.2.154 :          \

           10.0.2.162 :          \

           10.0.2.170

 

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_hosts

smtp_load_reserve = 40

smtp_accept_max_nonmail = 7

 

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_hosts : ! +relay_from_internal_networks : ! +relay_from_mailservers

          message        = Solamente los servidores de correo internos, equipos \n\

                           y/o subredes autorizados pueden hacer relay a este servidor

          log_message    = Relay access denied. It’s not an internal mail server, network or authorized host

 

  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}}

 

  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

          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

          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          = +auth_from_hosts

 

accept  hosts          = +relay_from_hosts : +auth_from_hosts

          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 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{${lc:$mime_filename}} \

                            {\N(\.ade|\.adpx|\.app|\.bas|\.bat|\.chm|\.cmd|\.com|\.cpl|\

                                \.crt|\.exe|\.fxp|\.hlp|\.hta|\.inf|\.ins|\.isp|\

                                \.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}{1}{0}}

 

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}}

 

accept

 

acl_check_content:

 

deny    message        = Prohibido el envio de mensajes donde la extension de \n\

                           archivo adjunto no esta permitida

          demime         = ade : adpx : app : bas : bat : chm : cmd : com : cpl: crt : exe : fxp : \

                           hlp : hta : inf : ins : isp : 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

          log_message    = bl_ext ext=”$found_extension” rcpts=”$recipients” subject=”$h_Subject:”

 

deny    message        = Este mensaje contiene malware ($malware_name)

          demime         = *

          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_hosts : ! 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

 

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

 

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

 

plain_server:

    driver = plaintext

    public_name = PLAIN

    server_prompts = :

    server_condition = \

        ${lookup ldap{user=”${lookup ldapdn{LDAP_AD_USER_DN}}” \

                      pass=$2 \

                      ldap:///}\

          {yes}fail}

    server_set_id = $1

 

login_server:

    driver = plaintext

    public_name = LOGIN

    server_prompts = “Username:: : Password::”

    server_condition = \

        ${if ldapauth{user=”${lookup ldapdn{LDAP_AD_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_USER_DN}}” \

                      pass=${quote:$2} \

                      ldap:///}\

          {yes}{no}}

    server_set_id = $1

 

# CONFIGURATION FOR local_scan()

# begin local_scan

Y las explicaciones correspondientes de los parámetros resaltados vienen a continuación:

Una de las potencialidades de Exim radica en el uso de macros para establecer valores de parámetros, además de ajustar el comportamiento del servicio según su declaración [y su no declaración].

  • Declaración de los directorios de configuración de Exim

 

CONFDIR=/etc/exim4

FILTERSDIR=CONFDIR/filters

TRANSPORTSDIR=CONFDIR/transport

BLACKLISTEDDIR=FILTERSDIR/blacklisted

WHITELISTEDDIR=FILTERSDIR/whitelisted

Creo que en este punto no hay mucho que explicar, dado que por el nombre de las macros se deduce qué información se guardará en los archivos que están dentro de estas carpetas

  • Definición del nombre del servidor y dominio principal de correo

 

MAILDOMAIN = karas.co.cu

MAILNAME = smtp.MAILDOMAIN

Sin comentarios. Las macros hablan por sí solas.

  • Definición del Smarthost o Servidor de Correo Padre al cual se entregarán los correos que se envían a dominios externos

 

SMARTHOST_ROUTELIST = * smtp-out.MAILDOMAIN

  • Definición del certificado y su llave privada para el uso de conexiones seguras a través de los puertos 465 (SMTPS) y 587 (Submission)

 

CERTFILE = /etc/exim4/ssl/certs/MAILDOMAIN.pem

En este archivo .pem están almacenados tanto el código del certificado como el de la llave privada. En otros ejemplos de configuraciones estos datos están en archivos separados, pero esto complejizaría un poco el uso de macros porque habría que chequear la existencia de dos macros en vez de una.

  • Definición de la carpeta o subdirectorio por defecto donde se ubicarán los buzones de los usuarios

 

      VIRTUAL_MAILBOX_BASEPATH=/srv/services/vmail

  • Definición de la cuota por defecto para todos los buzones de los usuarios

 

DEFAULT_MAX_QUOTA = 100M

  • Definición de las macros referentes a la sección de las consultas a la base de datos de usuarios y contraseñas, que en nuestro caso está contenida en el servicio Samba 4 de Sernet (que también puede estar en un Directorio Activo de Microsoft)

En esta sección lo primero que hay que establecer es/son el/los servidor(es) LDAP que se utilizará(n) en las consultas mediante el parámetro ldap_default_servers. Esta parte es opcional, la diferencia está en que si se define este parámetro, se puede omitir en la URI de las consultas al LDAP la parte servidor:puerto. En otras palabras, el encabezamiento de la URI sería ldap:/// y no ldap://<Nombre FQDN o dirección IP del servidor LDAP>[:<Puerto>]/.

LDAP_SERVER1_NAME = pdc-master-1.MAILDOMAIN

LDAP_SERVER1_PORT = 3268

ldap_default_servers = LDAP_SERVER1_NAME::LDAP_SERVER1_PORT

Como se ve en la configuración, puede establecerse la cantidad de servidores LDAP que se desee.

Es válido aclarar que, para el caso de un Directorio Activo, se puede utilizar o el servicio LDAP a través del puerto 389, o el servicio Catálogo Global (Global Catalog – GC) a través del puerto 3268. La diferencia radica en que el Catálogo Global almacena la información completa del directorio (incluyendo esquemas, tipos de datos, etc.).

Seguidamente se establecen las macros referentes a la estructura del Árbol de Información de Directorio (DIT) que tendrá el servidor LDAP:

* Raíz del DIT donde se albergan los datos de usuario

LDAP_AD_BASE_DN = DC=karas,DC=co,DC=cu

* Carpeta o contenedor base del Directorio Activo donde están creados los nombres de usuarios y grupos del sistema

LDAP_AD_USERS_BASE_DN=CN=Users,LDAP_AD_BASE_DN

* Unidad Organizativa base donde se guardará la información referente a la estructura de la organización, sus usuarios, grupos, unidades organizativas subordinadas, así como las políticas de grupo que se quieran definir:

LDAP_AD_ENTERPRISE_USERS_BASE_DN=OU=KARAS Project,LDAP_AD_BASE_DN

* Grupo de usuarios que tienen autorizado el acceso al servicio de correo electrónico:

LDAP_AD_MAIL_SERVICE_ALLOWED_USERS_GROUP_CN=CN=Mail Service Allowed Users,LDAP_AD_USERS_BASE_DN

* Grupo de usuarios que tienen denegado el acceso al servicio de correo electrónico:

LDAP_AD_MAIL_SERVICE_DENIED_USERS_GROUP_CN = CN=Mail Service Denied Users,LDAP_AD_USERS_BASE_DN

NOTA: El usuario que se ubique en este grupo no tendrá acceso al servicio, dado que en todos los filtros de búsqueda en el directorio LDAP del Directorio Activo, como se verá más adelante, se tiene en en cuenta esta característica.

* Grupo de usuarios de correo electrónico que solamente pueden enviar/recibir correos hacia/desde dominios locales y nacionales:

LDAP_AD_NATIONAL_MAIL_SCOPE_GROUP_CN=CN=Mail Server – National Scope Users Group,LDAP_AD_USERS_BASE_DN

* Grupo de usuarios de correo electrónico que solamente pueden enviar/recibir correos hacia/desde cualquier dominio, ya sean locales, nacionales o internacionales:

LDAP_AD_INTERNATIONAL_MAIL_SCOPE_GROUP_CN=CN=Mail Server – International Scope Users Group,LDAP_AD_USERS_BASE_DN

* Credenciales que se utilizarán para las consultas de los datos (binding) del directorio. Dicha cuenta debe tener privilegios de lectura y estará ubicada en la carpeta de usuarios y grupos del sistema:

LDAP_AD_BIND_DN = CN=vmail,LDAP_AD_USERS_BASE_DN

LDAP_AD_BIND_PASS = <Contraseña del usuario>

* Filtro de búsqueda de las direcciones de correo electrónico de los destinatarios locales dentro del directorio

En este filtro se utilizan las variables de Exim: $sender_address, ${local_part} y ${domain}, donde la primera contiene la dirección de correo del emisor del mensaje, la segunda y tercera son el nombre de usuario y dominio respectivamente del destinatario local (recipient) del mensaje entrante.

NOTA: Además de esto, todas las consultas al directorio se realizarán tomado en cuenta tres elementos: la Clase de Objeto (en nuestro caso son person y user), el Tipo de Cuenta de usuario (que para cada cuenta de usuario dentro del directorio se establece el valor 805306368), y el Nombre Principal del usuario (el que coincide con la dirección de correo, que es el elemento principal en la condición del filtro). En algunos casos como el chequeo del emisor, destinatario y alcance de los correo de estos, se tiene en cuenta el criterio de que el usuario SIEMPRE tenga permitido el acceso al servicio, o sea, que esté en el grupo Mail Service Allowed Users y que no esté en el grupo Mail Service Denied Users.

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))

* Filtros de búsqueda para las cuentas de usuarios que tienen permitido el uso del servicio de correo electrónico

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}))

* Filtros de búsqueda para determinar el alcance de los correos electrónicos de determinadas cuentas de usuarios

Dicho alcance puede ser nacional o internacional, tanto para la entrada, como para la salida de correos. No obstante, si se quiere restringir el alcance de los correos solamente al Sistema MICONS, basta con añadir las ACLs correspondientes. Pero bueno, eso por si existiese algún jefe extremista.J

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}))

* Atributos que se devolverán en las consultas al directorio

Según el tipo de consulta que se realice, se puede obtener el valor del atributo (o los atributos) que se deseen. Por ejemplo, en este caso:

LDAP_AD_USER_DN_ATTR = distinguishedName

Lo que se devuelve es el atributo Nombre Distinguido de un usuario, el mismo será utilizado posteriormente como valor de nombre de usuario para las operaciones de autenticación SMTP. Eso se verá más adelante. Mientras que en este caso:

LDAP_AD_MAIL_RCPT_MAIN_ATTRS = sAMAccountName,userPrincipalName

Lo que se devuelve es un par de atributos, uno con el nombre de usuario solamente (dígase el elemento que está delante de la @), y el otro con la dirección de correo completa, los cuales será utilizados para operaciones posteriores.

* Consultas al directorio

Ya aquí está el plato fuerte de esta parte: las consultas. Solamente hay que estructurar la URI de LDAP adecuada para obtener el resultado deseado. Por ejemplo:

Extraer el nombre distinguido de una entrada de cuenta de usuario:

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

Extraer el nombre de usuario y dirección de correo de una cuenta de usuario, el cual es el destinatario del mensaje:

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

Extraer el nombre de usuario y dirección de correo de una cuenta de usuario, el cual es el emisor del mensaje:

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

Extraer el nombre de usuario y dirección de correo de una cuenta de usuario que tenga permitido o denegado el uso del servicio de correo electrónico, independientemente de si es emisor o destinatario del mensaje:

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

Extraer el nombre de usuario y dirección de correo de una cuenta de usuario que tenga cualquier tipo de alcance e independientemente de si es emisor o destinatario del mensaje:

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

  • Definición de la macro referente a la cantidad máxima de destinatarios por cada correo electrónico que se envía

MAX_RCPT = 5

  • Definición de la macro referente a la cantidad máxima de destinatarios fallidos por cada correo electrónico que se envía

MAX_FAILED_RCPT = 4

  • Zona horaria donde está ubicado el servidor, en nuestro caso en Cuba, no importa donde dentro del país

timezone = America/Havana

  • Definición del nombre de equipo y dominio local de correo electrónico

Aquí es válido aclarar que los valores de estos parámetros están estrechamente ligados a los valores de las macros MAILNAME y MAILDOMAIN definidas anteriormente. No obstante, de no definirse dichas macros, se utilizarán valores por defecto.

.ifdef MAILNAME

primary_hostname = MAILNAME

qualify_domain = MAILDOMAIN

.else

MAILNAME=@

MAILDOMAIN=@

.endif

  • Definición de las interfaces de red que se pondrán a la escucha del servicio

 

local_interfaces = 10.0.2.11 : 127.0.0.1

  • Definición de las conexiones seguras al servidor de correo a través de SSL/TLS

 

NOTA IMPORTANTE: La esencia de esta parte de la configuración de Exim está en que si se define la macro con la ruta hacia el archivo donde están guardados el certificado y la llave privada, entonces se habilitarán los puertos 465 y 587 (SMTPS y Submission respectivamente) para el establecimiento de conexiones seguras; si en caso contrario, no se define dicha macro, pues, el servidor escuchará solamente por el puerto 25 (SMTP plano), lo cual tiene el inconveniente de que si hay alguien escuchando en el canal, tomará todo lo que viaje plano por la red.

.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

  • Definición de la lista de dominios virtuales que serán asumidos por este servidor como dominios de la organización

 

domainlist virtual_domains =         \

   MAILDOMAIN :            \

   MAILNAME

  • Definición de la lista de dominios válidos registrados a los que se les puede enviar correos desde este servidor de correo o desde donde se pueden recibir correos, todo ello referente a los dominios internos de KARAS Project

 

domainlist relay_to_domains =       \

   pri.karas.co.cu :  \

   hab.karas.co.cu :  \

   var.karas.co.cu :  \

   cfg.karas.co.cu :  \

   cmg.karas.co.cu : \

   hlg.karas.co.cu

  • Definición de la lista de hosts, equipos o subredes desde donde se permitirá el envío o recibo de mensajes, o lo que es lo mismo, subredes desde donde se permitirá hacer relay local al servidor de correo

 

hostlist relay_from_hosts =   \

           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

NOTA: En la lista de hosts anterior se ubican solamente subredes con estaciones de trabajo, algún que otro servidor que envíe notificaciones por correo electrónico, así como servidores de listas de distribución. Las subredes que tienen servidores de correo no se incluyen en esta listas porque tendrán otro tratamiento.

hostlist relay_from_mailservers = \

           10.0.1.98 :            \

           10.0.1.99 :            \

           10.0.2.130 :            \

           10.0.2.138 :            \

           10.0.2.146 :            \

           10.0.2.154 :            \

           10.0.2.162 :            \

           10.0.2.170

Y aquí era donde quería llegar. ¿Se acuerdan de la figura 2? Bien. El detalle está en que para ese caso, como no existen servidores en las sucursales y solamente hay estaciones de trabajo, en esta lista de hosts solamente se añaden las direcciones IP de los servidores de correos externos, o sea, los que están ubicados en la DMZ.

  • Definición de los conjuntos de ACLs que se utilizarán en el análisis del tráfico de correo

 

Para el caso que nos ocupa, solamente utilizaremos tres conjuntos: uno para chequear los emisores y/o destinatarios de los mensajes, otro para chequear las cabeceras MIME de los mismos, y otro para chequear su contenido.

acl_smtp_rcpt = acl_check_rcpt

acl_smtp_mime = acl_check_mime

acl_smtp_data = acl_check_content

  • Definición de la activación del análisis por parte del antivirus y el filtro anti spam de todos los mensajes entrantes y salientes

 

Inicialmente se recomienda comentar estas dos líneas porque la activación de esta característica en el servidor lleva consigo una serie de pasos adicionales, los cuales se explicarán más adelante, por lo pronto se puede dejar comentadas estas líneas para luego retomarlas.

#av_scanner = clamd:/var/run/clamav/clamd.ctl

#spamd_address = 127.0.0.1 783

  • Tamaño máximo de los menaje entrantes y salientes

 

En este caso se establece en 2 MB el tamaño máximo de cada mensaje.

message_size_limit = 2M

  • Cantidad máxima de comandos SMTP incorrectos en la sesión

 

Se estableció en 1 la cantidad máxima de comandos SMTP incorrectos en una sesión en curso. O sea, que sólo se tiene una oportunidad de equivocación en los comandos SMTP; un segundo error cerrará la sesión completamente

smtp_max_unknown_commands = 1

  • Definición de los elementos que se guardarán en el registro de eventos (log) del servicio de correo

 

En este caso se trata de guardar la mayor cantidad de información posible

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

 

Continuará…

🙂

Acerca de Hector Suarez Planas

Es Licenciado en Ciencia de la Computación (3 de julio de 2002). Ha sido Administrador de Red en varias organizaciones, Programador y Analista de Sistemas. Actualmente se desempeña como Administrador de Red del Telecentro Tele Turquino de Santiago de Cuba. Tiene experiencia con sistemas Windows y GNU/Linux, Infraestructura de Redes (Cisco, AlliedTelesis, Netgear y HP ProCurve, Vyatta/VyOS), Servidores tanto físicos como virtuales (plataformas VMWare, Proxmox VE y Xen), Sistemas de Seguridad Informática (Snort/Suricata IDS, appliances AlienVault OSSIM), programador (Delphi, C++ Builder, Perl [poco], Python [algo]), entre otras cosas. Actualmente estoy incursionando en todo lo que tiene relación con Cloud Computing (OpenStack) y Centros de Datos. :-)
Esta entrada fue publicada en Antivirus, Clamav, Correo Electrónico, Debian, Directorio Activo, Exim, Filtro Antispam, Linux, MTA, Spamassassin. Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *