4. Postfix

La configuracion de Postfix se encuentra en el archivo de configuacion /etc/postfix/mail.cf

4.1. instalando Postfix con soporte para LDAP

Si esta instalado ssmtp este bloqueara a Postfix, entonces hay que desinstalarlo:

# emerge --pretend postfix

[blocks B     ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.5)
# emerge unmerge ssmtp
# emerge --pretend postfix

These are the packages that I would merge, in order:

Calculating dependencies ...done!
[ebuild  N    ] sys-libs/db-4.2.52_p2-r1
[ebuild  N    ] dev-libs/libpcre-6.3
[ebuild  N    ] mail-mta/postfix-2.2.5

Ahora si instalar postfix y solo agregar soporte para SASL.

# USE="sasl -postgres -mysql -ipv6" emerge postfix 

4.2. Configurando Postfix

Configurar parámetros básicos de Postfix, por ahora sin soporte para LDAP:

# vim /etc/postfix/main.cf

# Configurar el hostname
myhostname = mail.calcom.com.mx

# Configurar el nombre del dominio principal:
mydomain = mail.calcom.com.mx

# Configurar el nombre de el dominio con el que salen los correos
myorigin = $mydomain

# Configurar las interfaces de red en la que escuchara peticiones
inet_interfaces = all

# Desactivar el uso de el comando SMTP Vrfy
disable_vrfy_command = yes

# Dominios en los cuales recibe correo:
mydestination = localhost, $myhostname, localhost.$mydomain, $mydomain

# donde están almacenados los nombres de los usuarios:
local_recipient_maps = unix:passwd.byname $alias_maps

# A que redes se les permite hacer relay por este servidor:
mynetworks = 10.0.0.0/24, 127.0.0.0/8

# A que dominios se les permite hacer relay
relay_domains = $mydestination < DUDA!!!!!!!!!

# lugar donde están almacenados los alias de los correos
alias_maps = hash:/etc/postfix/aliases
#
alias_database = hash:/etc/postfix/aliases

# Opcional poner un banner para las conexiones SMTP
smtpd_banner = $myhostname ESMTP $mail_name (Gentoo GNU/Linux)

# Localización de los buzones
home_mailbox = Maildir/

# Comentario ???
delay_warning_time = 3h

# limite en tamaño de un mensaje aprox 15MB
message_size_limit = 15000000

# tiempo máximo que puede estar un correo en una cola 8 horas.
maximal_queue_lifetime = 8h
$ Tiempo limite en el que este un correo y mandar un rebote.
bounce_queue_lifetime = 4h
:wq

4.2.1. Maildrop

Instalaremos y configuraremos Courier maildrop, este sera usado como MDA (Mail Delivery Agent) el cual es el encargado de llevar el correo a su localización final, puede hacer filtrado antes de entregar el correo y además maneja quotas de los buzones de correo (Maildir).

# emerge =mail-filter/maildrop-1.8.0-r3
# vim /etc/maildrop/maildropldap.cf
hostname                localhost
basedn                  o=hosting,dc=calcom,dc=com,dc=mx
filter                  (&(&(objectclass=VirtualMailAccount)(mail=%s))(accountActive=TRUE)(delete=FALSE))
binddn                  cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx
bindpw                  PASSWORD_PHAMM
timeout                 5
search_method           mail
default_uidnumber       5000
default_gidnumber       5000
mail_attr               mail
maildir_attr            mailbox
homedirectory_attr      vdHome
quota_attr              quota
:wq

Editar mensaje de alerta de sobre quota.

# vim /etc/quotawarnmsg
X-Comment: Rename/Copy this file to quotawarnmsg, and make appropriate changes
X-Comment: See deliverquota man page for more information
From: Mail Delivery System <Mailer-Daemon@calcom.com.mx>
Reply-To: postmaster@calcom.com.mx
To: Valued Customer:;
Subject: Mail quota warning
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit

Your mailbox on the server is now more than 90% full. So that you can continue
to receive mail you need to remove some messages from your mailbox.
:wq

Configurar el uso de maildrop en postfix, primero en el archivo

/etc/postfix/master.cf

master es el proceso principal (maestro) de postfix.

# vim /etc/postfix/master.cf

maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -w 90 -d ${recipient}
:wq

Configurar parámetros en /etc/postfix/main.cf

maildrop_destination_concurrency_limit = 1
maildrop_destination_recipient_limit = 1
virtual_destination_concurrency_limit = 1
unknown_maildrop_mailbox_reject_code = 450

4.2.2. Configurando las fuentes LDAP

Se pueden definir fácilmente múltiples fuentes LDAP. Los parámetros de las fuentes LDAP están documentados en el archivo README_FILES/LDAP_README[15]. Los nombres de los parámetros siguen el patrón de "ldapsource_parameter". El nombre de la fuente LDAP es definido la primer vez que es usado. En el archivo /etc/postfix/main.cf, necesitaras una definición de una fuente LDAP para cada búsqueda.

4.2.2.1. Globales

En nuestro directorio se creo el usuario phamm el cual se usara para hacer los búsquedas (lookups) en el directorio LDAP y no usar la cuenta manager, la cual tiene privilegios mas elevados.

ldap_bind_dn = cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx
ldap_bind_pw = PASSWORD_PHAMM
ldap_search_base = o=hosting,dc=calcom,dc=com,dc=mx
ldap_domain = dc=calcom,dc=com,dc=mx
ldap_server_host = localhost
ldap_server_port = 389

Los parámetros que usamos son: ldap_bind_dn: El usuario que hace el la búsqueda de la información en el directorio LDAP. ldap_bind_pw: La contraseña de el usuario phamm. ldap_search_base: Esta es la rama en la cual iniciaremos la búsqueda en el directorio LDAP, esto es usado para agilizar la búsqueda y no iniciar desde la raíz, ldap_domain: el sufijo de el dominio en el que buscaremos. ldap_server_host: La dirección IP o nombre DNS de el servidor al cual consultaremos. ldap_server_port: El puerto en el que recibe peticiones el servidor LDAP.

4.2.2.2. Transportes

La primer definición de la fuente LDAP que usaremos es la de transport, la cual define el transporte para los dominios. Postfix usa el transporte para determinar que sigue hacer con los correos una vez recibidos. Para nuestro proposito siempre utilizaremos el MDA maildrop por las razones que se especificaron anteriormente. Sin embargo también podría ser usado el transporte "virtual".

# Transports
transport_server_host = $ldap_server_host
transport_search_base = $ldap_search_base
transport_query_filter = (&(&(vd=%s)(objectClass=VirtualDomain))(accountActive=TRUE)(delete=FALSE))
transport_result_attribute = postfixTransport
transport_cache = no
transport_bind = yes
transport_scope = one
transport_bind_dn = $ldap_bind_dn
transport_bind_pw = $ldap_bind_pw

En este caso se usa el filtro para buscar el nombre de el dominio, ver que este activo y que no tenga el valor de delete a FALSE. El resultado que buscaremos es postfixTransport, que sera configurado para que siempre tenga el valor de maildrop.

4.2.2.3. Aliases
# Aliases
aliases_server_host = $ldap_server_host
aliases_search_base = $ldap_search_base
aliases_query_filter = (&(&(objectClass=VirtualMailAlias)(mail=%s))(accountActive=TRUE))
aliases_result_attribute = maildrop
aliases_bind = yes
aliases_cache = no
aliases_bind_dn = $ldap_bind_dn
aliases_bind_pw = $ldap_bind_pw

En este caso se usa el filtro para buscar el nombre de el correo, ver que este activo, el resultado que buscaremos es maildrop, el cual se usa como un directorio alternativo en el cual también una cuenta puede recibir correos.

4.2.2.4. Forwards
# VirtualForward
virtualforward_server_host = $ldap_server_host
virtualforward_search_base = $ldap_search_base
virtualforward_query_filter = (&(&(objectClass=VirtualMailAccount)(mail=%s))(forwardActive=TRUE)(accountActive=TRUE)(delete=FALSE))
virtualforward_result_attribute = maildrop
virtualforward_bind = yes
virtualforward_cache = no
virtualforward_bind_dn = $ldap_bind_dn
virtualforward_bind_pw = $ldap_bind_pw

En este caso se usa el filtro para buscar el nombre de el correo, que tenga el valor de el atributo forwardAvtive a TRUE y que delete sea FALSE. El resultado que buscaremos es maildrop, el cual se usa para re dirección el correo que llegue a una cuenta por ejemplo a el correo en otro dominio o usar el de otra persona, útil cuando si el usuario sale de vacaciones, así se desea que alguien mas pueda recibir el correo.

4.2.2.5. Cuentas de correo
# The mail_spool_directory parameter specifies the directory whereccounts
accounts_server_host = $ldap_server_host
accounts_search_base = $ldap_search_base
accounts_query_filter = (&(&(objectClass=VirtualMailAccount)(mail=%s))(forwardActive=FALSE)(accountActive=TRUE)(delete=FALSE))
accounts_result_attribute = mailbox
accounts_cache = no
accounts_bind = yes
accounts_bind_dn = $ldap_bind_dn
accounts_bind_pw = $ldap_bind_pw

En este caso se usa el filtro para buscar el nombre de el correo, que tenga el valor de el atributo forwardActive a FALSE y que delete sea FALSE. El resultado que buscaremos es mailbox, el cual es la ruta en el sistema de archivos de el buzón de correo. Estas este es la fuente LDAP mas usada porque es aquí donde residen las cuentas de correo.

Uno de los "side effects" de la naturaleza modular de Postfix es que una segunda fuente LDAP para las cuentas es necesitada para ayudar a Postfix a determinar si una dirección de correo es valida antes de que Postfix intente recibir el correo. Entonces se usa la fuente LDAP accountsmap la cual el atributo que se busca es la dirección de el correo electrónico.

accountsmap_server_host = $ldap_server_host
accountsmap_search_base = $ldap_search_base
accountsmap_query_filter = (&(&(objectClass=VirtualMailAccount)(mail=%s))(forwardActive=FALSE)(accountActive=TRUE)(delete=FALSE))
accountsmap_result_attribute = mail
accountsmap_cache = no
accountsmap_bind = yes
accountsmap_bind_dn = $ldap_bind_dn
accountsmap_bind_pw = $ldap_bind_pw

4.2.3. El mapa de transportes

Ahora que la fuente LDAP "transport" esta definida, necesitamos hacer que postfix este al tanto de ella. Esto usando los parámetros "transport_maps" y "mydestination" en /etc/postfix/main.cf. En la configuración previa ya se había configurado "mydestination" así que solo hay que modificarla para que use la fuente LDAP "transport".

mydestination = $transport_maps, localhost, $myhostname, localhost.$mydomain, $mydomain
transport_maps = ldap:transport

4.2.4. Los alias virtuales (virtual_alia_maps)

Ahora que la fuente LDAP "aliases, "virtualforward" y "accountsmap" se han definido, necesitamos hacer que postfix sepa de ellos. Esto se hace usando el parámetro "virtual_maps" en /etc/postfix/main.cf.

virtual_maps = ldap:virtualforward, ldap:aliases, ldap:accountsmap

4.2.5. Las cuentas virtuales

Decirle a Postfix acerca de las cuentas virtuales se hace de una manera diferente a como se hizo con los alias y los transportes. Para esto se definirán un poco mas de parámetros, unos específicos para el almacenamiento de el correo virtual. Para este ejemplo asumimos que se creo el usuario y grupo Unix vmail con el UID de 5000 y GID de 5000, y su directorio HOME es /home/vmail. Usaremos el directorio home de el usuario vmail como el lugar donde almacenaremos nuestro repositorio de correo virtual.

virtual_mailbox_base = /home/vmail/domains
virtual_mailbox_maps = ldap:accounts

virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
virtual_mailbox_limit = 0

Los dos primeros parámetros se usan para decirle donde esta la base de el repositorio de los correos virtuales. y la otra para decirle cual es la fuente LDAP donde buscaremos la ruta de el buzón de el correo, recordemos que en la fuente LDAP "accounts" se obtiene como parámetro "mailbox". Las siguientes configuraciones se usan para definir el UID y GID de el usuario vmail, y el parámetro "virtual_minimum_uid" significa que uid mínimos a el 5000 serán rechazados y el mensaje sera "deferred". Todos estos parámetros están completamente documentados en los archivos README_FILES/VIRTUAL_README[16] que vienen con las fuentes de Postfix.

También necesitamos editar el parámetro "local_recipient_maps" para que también busque en "virtual_mailbox_maps" de manera que Postfix sepa quien es un usuario en el servidor de correo y quien no. La razón por la que hacemos esto es para que Postfix rechace correo para usuarios desconocidos. Anteriormente se configuro así:

local_recipient_maps = unix:passwd.byname $alias_maps

ahora se cambiara a:

local_recipient_maps = proxy:unix:passwd.byname, $alias_maps, $virtual_mailbox_maps

También usaremos el parámetro:

show_user_unknown_table_name = no

Con esto hacemos que postfix no muestre en el mensaje de rechazo en que tabla no encontró la cuenta de correo. Por ultimo hay que iniciar el servicio Postfix así:

# /etc/init.d/postfix start

Para que el servicio de postfix sea iniciado al arranque del sistema ejecutar el siguiente comando:

# rc-update add postfix default
 * postfix added to runlevel default
 * rc-update complete.

4.2.6. SMTP Autenticado (SMTP-AUTH)

Si requieres que los usuarios puedan enviar correo (RELAY) desde fuera de tu red local, por ejemplo de alguna sucursal, o agentes de ventas que están constantemente viajando, y no sabes que dirección IP están usando o cambia constantemente y además quieres tener mas control sobre quien envía correo por tu servidor, entonces la solución es usar SMTP Autenticado (SMTP-AUTH). Con SMTP-AUTH se configura el MTA (Postfix) para que cuando se establezca una conexión con el servidor el usuario primero se autentique con su usuario (email) y contraseña antes de que pueda enviar correos, si el usuario se autentica satisfactoriamente, es decir, el usuario y la contraseña se son validas entonces el usuario podrá enviar correo por medio de el servidor. Básicamente esa es la función de SMTP-AUTH.

Para configurar SMTP-AUTH en Postfix se usara la autenticación buscando la información de el login (usuario/contraseña) en el directorio LDAP, para esto usaremos las librerías SASL de cyrus-sasl y usaremos el demonio de autenticación saslauthd.

Instalar y configurar cyrus-sasl con soporte de authdaemond (se instalar al mismo tiempo courier-imap-authlib y courier-imapd:

# USE="-postgress authdaemond" emerge cyrus-sasl

Configurar saslauthd:

# vim /etc/conf.d/saslauthd

SASLAUTHD_OPTS=""
SASLAUTHD_OPTS="${SASLAUTH_MECH} -a ldap -O /etc/saslauthd.conf -n 5"
:wq

Con esto le decimos que use como mecanismo de autentificaron a LDAP y usando el archivo de configuración /etc/saslauthd.conf y que solo pueda ejecutar 5 threads. Configurar /etc/saslauthd.conf

# vim /etc/saslauthd.conf
ldap-servers:           ldap://localhost/
ldap_auth_method:       bind
ldap_bind_dn:           cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx
ldap_bind_pw:           PASSWORD_PHAMM
ldap_filter:            (&(mail=%U@%d)(smtpAuth=TRUE))
ldap_search_base:       o=hosting,dc=calcom,dc=com,dc=mx
:wq

Esta configuración define lo siguiente:

Conectarse con el servidor LDAP en el localhost.

Usar como base de búsqueda la organización o=hosting,dc=calcom,dc=com,dc=mx

Usar el filtro para usuario que se traduciría a: usuario@dominio.tld y que tengan smtpAuth = TRUE

Usar el métodos de autenticación bind. Iniciar el servicio saslauthd así:

Iniciar el servicio saslauthd así:

# /etc/init.d/saslauthd start

Para que el servicio de saslauthd sea iniciado al arranque del sistema ejecutar el siguiente comando:

# rc-update add saslauthd default

Configurar soporte de SMTP autenticado para postfix:

# vim /etc/sasl2/smtpd.conf
pwcheck_method:saslauthd
mech_list: plain login
:wq

Aquí se usara a saslauthd el cual ya fue configurado para usar la información de el directorio LDAP. Configurar postfix:

# vim /etc/postfix/main.cf

# SMTP-AUTH
smtpd_sasl_auth_enable = yes
smtpd_sasl_application_name = smtpd
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
:wq

Re iniciar postfix para que tome los cambios y soporte SMTP-AUTH:

# /etc/init.d/postfix restart