Cómo configurar Postfix en CentOS 5 para utilizar dominios virtuales con usuarios del sistema.
Correo electrónico: darkshram en gmail punto com Sitio de Red: http://www.alcancelibre.org/
Jabber ID: email@example.com
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 firstname.lastname@example.org 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:
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:
# email@example.com joel
# Ejemplo hace que todo correo para firstname.lastname@example.org 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 email@example.com
# Ejemplo hace que todo el correo de joel salga como firstname.lastname@example.org
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:
# email@example.com joel
# Ejemplo hace que todo correo para firstname.lastname@example.org 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 email@example.com joel firstname.lastname@example.org juan email@example.com pablo firstname.lastname@example.org pedro email@example.com hugo firstname.lastname@example.org luis email@example.com firstname.lastname@example.org email@example.com firstname.lastname@example.org email@example.com firstname.lastname@example.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 email@example.com juan firstname.lastname@example.org pablo email@example.com pedro firstname.lastname@example.org hugo email@example.com luis firstname.lastname@example.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 |