Cómo configurar Postfix en CentOS 5 para utilizar dominios virtuales con usuarios del sistema.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2012 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

Este documento permitirá configurar Postfix para utilizar múltiples dominios virtuales, utilizando los usuarios locales del sistema. Se requiere haber configurado previamente Postfix de la forma en que se describe en el documento titulado «Cómo instalar y configurar Postfix en CentOS con soporte para TLS y autenticación Se recomienda leer, estudiar y aplicar también los procedimientos descritos en el documento titulado «Cómo instalar y configurar Amavisd-new con Postfix en CentOS

Procedimientos.

Ajustes en el servicio saslauthd.

Si los usuarios se van a dar de alta siguiendo el formato usuario@dominio.tld en lugar de sólo usuario, una práctica común en los servidores con múltiples dominios virtuales, es necesario añadir al servicio saslauthd la opción -r, la cual permite combinar el nombre de usuario y dominio antes de pasar por el mecanismo de autenticación. Si éste es el caso, se debe editar el archivo /etc/sysconfig/saslauthd:

vim /etc/sysconfig/saslauthd

Y añadir la opción -r a los argumentos de FLAGS:

# Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/var/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam

# Options sent to the saslauthd. If the MECH is other than "pam" uncomment
# the next line.
# DAEMONOPTS=--user saslauth

# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS=-r

Y reiniciar el servicio saslauthd.

service saslauthd restart

Configuración de SELinux.

Por lo general, la mayoría de los documentos disponibles en Internet recomiendan desactivar SELinux, sin mayores argumento o explicaciones. Sin embargo, hacer ésto implica renunciar a una magnífica protección que brinda al sistema esta importante implementación de seguridad. Tengo un lema personal que me gusta citar para explicar mi opinión respecto de SELinux:

Más vale tenerlo y jamás necesitarlo, que necesitarlo y carecer de éste.

Si es posible utilizar SELinux junto con dominios virtuales. Cuando se quiere implementar un servicio de hospedaje con dominios virtuales y se utiliza /home para crear los directorios de inicio de los dominios virtuales, se requieren pocos o ningún ajuste en SELinux. Sin embargo, hay escenarios donde se utiliza /var/www para crear los directorios de inicio de los dominios virtuales. Sí se hace de este modo y sí se quiere mantener SELinux activo, es necesario generar una política que permita a los servicios de Postfix o Sendmail, Dovecot, Pyzor y Spamassassin poder realizar lectura, escritura y otros atributos sobre directorios y archivos con contexto httpd_sys_content_t. El siguiente procedimiento sirve para crear la política necesaria.

Procedimiento para crear política.

Crear el directorio /usr/share/selinux/packages/virtualmail:

mkdir /usr/share/selinux/packages/virtualmail

Cambiarse al directorio /usr/share/selinux/packages/virtualmail:

cd /usr/share/selinux/packages/virtualmail

Descargar desde Alcance Libre el archivo http://www.alcancelibre.org/linux/secrets/virtualmail.te:

wget http://www.alcancelibre.org/linux/secrets/virtualmail.te

Editar el archivo virtualmail.te:

vim virtualmail.te

Verificar que el archivo virtualmail.te tenga el siguiente contenido:



module virtualmail 1.0;

require {
        type pyzor_t;
        type sendmail_t;
        type postfix_local_t;
        type postfix_postdrop_t;
        type postfix_master_t;
        type procmail_t;
        type spamc_t;
        type dovecot_t;
        type tmp_t;
        type httpd_log_t;
        type httpd_sys_content_t;
        type httpd_config_t;
        type spamd_t;
        type system_mail_t;
        class fifo_file write;
        class file { read lock rename create write getattr link unlink append };
        class dir { search read write getattr remove_name add_name };
}

#============= dovecot_t ==============
allow dovecot_t httpd_sys_content_t:dir { write search read remove_name getattr add_name };
allow dovecot_t httpd_sys_content_t:file { write getattr link rename read lock create unlink };

#============= postfix_local_t ==============
allow postfix_local_t httpd_sys_content_t:dir search;

#============= postfix_postdrop_t ==============
allow postfix_postdrop_t tmp_t:file { getattr append };
allow postfix_postdrop_t httpd_log_t:file getattr;

#============= postfix_master_t ==============
allow postfix_master_t httpd_config_t:dir search;

#============= procmail_t ==============
allow procmail_t httpd_sys_content_t:dir search;

#============= pyzor_t ==============
allow pyzor_t httpd_sys_content_t:dir { write search };

#============= spamc_t ==============
allow spamc_t sendmail_t:fifo_file write;

#============= spamd_t ==============
allow spamd_t httpd_sys_content_t:dir { write search getattr };
allow spamd_t httpd_sys_content_t:file { read getattr };

#============= system_mail_t ==============
allow system_mail_t httpd_sys_content_t:file append;

Crear el archivo de módulo virtualmail.mod a partir del archivo virtualmail.te:

checkmodule -M -m -o virtualmail.mod virtualmail.te

Crear el archivo de política virtualmail.pp a partir del archivo virtualmail.mod

semodule_package -o virtualmail.pp -m virtualmail.mod

Incluir la politica al sistema:

semodule -i /usr/share/selinux/packages/virtualmail/virtualmail.pp

Configuración de Postfix.

Archivo /etc/postfix/main.cf.

Editar el archivo /etc/postfix/main.cf:

vim /etc/postfix/main.cf

Definir los siguientes parámetros:


# Establecer el valor de myhostname como localhost.localdomain
# También se puede definir cualquier otro dominio, siempre y cuando sea distinto
# a cualquiera de los definidos en los valores de virtual_alias_domains o en
# virtual_alias_maps.
myhostname = localhost.localdomain

# Definir el valor predeterminado para mydomain
mydomain = localhost.localdomain

# Definir los valores predeterminados para mydestination y relay_domains
mydestination = $myhostname, localhost.$mydomain, localhost
relay_domains = $mydestination

# Recomendado.
# Junto con virtual_alias_maps, reemplaza a virtual_maps
# Se utiliza para declarar los dominios virtuales.
# Se puede prescindir de éste si se añaden dominios en /etc/postfix/virtual.
virtual_alias_domains = $virtual_alias_maps

# Obligatorio.
# Junto con virtual_alias_domains, reemplaza a virtual_maps
# Se utiliza para declarar la reescritura de direcciones. Ejemplo:
# jbarrios@dominio.com	joel
# Ejemplo hace que todo correo para joel@dominio.com se entregue a joel
# Si se quiere precindir de utilizar virtual_alias_domains, añadir también los
# dominios en este formato:
# dominio.com		dominio.com
# otrodominio.net	otrodominio.net
# otrodominio.org	otrodominio.org
# Si se hace lo anterior, comentar virtual_alias_domains.
virtual_alias_maps = hash:/etc/postfix/virtual

# Recomendado.
# Es la contraparte de alias_database = /etc/aliases
# Se utiliza para reescritura de direcciones de salida. Ejemplo:
# joel		joel.barrios
# Ejemplo hace que todo el correo de joel salga como joel.barrios
canonical_maps = hash:/etc/postfix/canonical

# Recomendado.
# Se utiliza solo para reescribir la dirección de salida de una cuenta.
# Ejemplo:
# joel		jbarrios@dominio.com
# Ejemplo hace que todo el correo de joel salga como jbarrios@dominio.com
sender_canonical_maps = hash:/etc/postfix/sender_canonical

# Opcional.
# Poco utilizado. Utilizar virtual_alias_maps en su lugar.
# Considerar que se procesa antes que canonical_maps.
# Se utiliza solo para reescribir solo la dirección de entrada de una cuenta.
# Ejemplo:
# jbarrios@dominio.com		joel
# Ejemplo hace que todo correo para jbarrios@dominio.com se entregue a joel
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical

Todo lo anterior se puede realizar también ejecutando el mandato postconf para cada parámetro:

postconf -e 'myhostname = localhost.localdomain'
postconf -e 'mydomain = localhost.localdomain'
postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost'
postconf -e 'relay_domains = $mydestination'
postconf -e 'virtual_alias_domains = $virtual_alias_maps'
postconf -e 'virtual_alias_maps = hash:/etc/postfix/virtual'
postconf -e 'canonical_maps = hash:/etc/postfix/canonical'
postconf -e 'sender_canonical_maps = hash:/etc/postfix/sender_canonical'
postconf -e 'recipient_canonical_maps = hash:/etc/postfix/recipient_canonical'

Al terminar, genere los archivos /etc/postfix/sender_canonical y /etc/postfix/recipient_canonical:

touch /etc/postfix/sender_canonical
touch /etc/postfix/recipient_canonical

Archivos /etc/postfix/virtual y /etc/postfix/sender_canonical.

Editar el archivo /etc/postfix/virtual:

vim /etc/postfix/virtual

Crear la tabla de cuentas de correo electrónico virtuales de entrada, especificando a que cuenta de usuario local se entrega cada dirección.

dominio.com			dominio.com
otrodominio.net			otrodominio.net
otrodominio.org			otrodominio.org
joel@dominio.com		joel
juan@dominio.com		juan
pablo@dominio.com		pablo
pedro@dominio.com		pedro
hugo@otrodominio.net		hugo
luis@otrodominio.org		luis
webmaster@dominio.com		joel@dominio.com
webmaster@otrodominio.net	hugo@otrodominio.net
webmaster@otrodominio.org	luis@otrodominio.org

Editar el archivo /etc/postfix/sender_canonical:

vim /etc/postfix/sender_canonical

Crear la tabla de cuentas de correo electrónico virtuales de salida, especificando las direcciones de salida que utilizará cada usuario. Es decir, casi lo contrario a lo establecido en /etc/postfix/virtual, pero especificando un único usuario para cada cuenta de correo electrónico. Jamás se especifique más de un usuario por cuenta de correo electrónico, ni más de una cuenta de correo electrónico por usuario.

joel		joel@dominio.com
juan		juan@dominio.com
pablo		pablo@dominio.com
pedro		pedro@dominio.com
hugo		hugo@otrodominio.net
luis		luis@otrodominio.org

Utilizar el mandato postmap con los archivos /etc/postfix/canonical, /etc/postfix/recipient_canonical, /etc/postfix/sender_canonical y /etc/postfix/virtual a fin de generar los archivos .db correspondientes y que surtan efecto los cambios luego de reiniciar el servicio postfix:

postmap /etc/postfix/canonical
postmap /etc/postfix/recipient_canonical
postmap /etc/postfix/sender_canonical
postmap /etc/postfix/virtual

Reiniciar el servicio postfix.

A fin de que surtan efecto todos los cambios, se debe reiniciar el servicio postfix:

service postfix restart



http://www.alcancelibre.org/staticpages/index.php/como-postfix-centos5-vmail-usuarios-sist