La configuración de Postfix se encuentra en el archivo de
configuración /etc/postfix/mail.cf
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.10)
# emerge unmerge ssmtp
# emerge --pretend mail-mta/postfix These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild N ] sys-libs/db-4.2.52_p4-r2 [ebuild N ] dev-libs/libpcre-6.6 [ebuild N ] mail-mta/postfix-2.2.10
Ahora si instalar postfix y con soporte para MySQL y SASL.
Antes de instalar Postfix, primero configuraremos las use flags para el software que compone nuestra solución. Esto lo hacemos porque al instalar Postfix este instalará todas sus dependencias, así que vale la pena que cuando se vayan a instalar todas las dependencias se instalen con todo el soporte que requerira nuestra solución.
USE Flags para Postfix, Estas USE flags agregarán el soporte de MySQL, PAM, SASL y SSL a el paquete de Postfix.
# echo "mail-mta/postfix mysql pam sasl ssl" >> /etc/portage/package.use
USE flags para las bibliotecas cyrus-sasl, agregaremos de una vez el soporte de authdaemond y mysql
# echo "dev-libs/cyrus-sasl authdaemond mysql" >> /etc/portage/package.use
USE flags para la biblioteca de autenticación courier-authlib y courier-imap:
# echo "net-mail/courier-imap fam" >> /etc/portage/package.use # echo "net-libs/courier-authlib mysql" >> /etc/portage/package.use
Y ahora instalaremos postfix que a su vez instalara la biblioteca cyrus-sasl con soporte authdaemond y mysql, Tambien instalaremos courier-authlib con soporte para mysql, e instalaremos courier-imap con soporte de fam:
# emerge mail-mta/postfix
Configurar parámetros básicos de Postfix, por ahora sin soporte para MySQL:
# vim /etc/postfix/main.cf # El nombre de host de nuestro sistema de correo, por default usa # FQDN de gethostname(), checar: # hostname -f myhostname = mail.tuxjm.net # 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 ***NO LISTAR DOMINIOS VIRTUALES*** mydestination = $myhostname, localhost.$mydomain, localhost # The time after which the sender receives the message headers # of mail that is still queued. delay_warning_time = 3h # tiempo máximo que puede estar un correo en una cola # 8 horas antes de que sea regresado como undeliverable maximal_queue_lifetime = 8h :wq
Debemos de decirle a postfix donde encontrar los datos sobre los dominios virtuales, los usuarios virtuales, los alias, para esto le indicaremos que tipo de base de datos leer, el nombre de la tabla y los campos donde se encuentran los datos, estas fuentes las especificaremos en unos archivos extras. Para ejemplos y detalles ver:
http://www.postfix.org/MYSQL_README.html
http://www.postfix.org/mysql_table.5.html
La primer definición de la fuente MySQL 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 propósito siempre utilizaremos el MDA maildrop por las razones que se especificaron anteriormente. Sin embargo también podría ser usado el transporte "virtual".
Definiendo el archivo de los transportes
/etc/postfix/mysql_virtual_transport_maps.cf
# cat mysql_virtual_transport_maps.cf user = postfix password = postfix hosts = localhost dbname = postfix query = SELECT transport FROM domain WHERE domain='%s'
En este caso el transporte se almacenara en el campo transport de la tabla domain.
NOTA: '%s' es la cadena que buscamos, en todos los archivos de consulta que usemos para postfix usaremos '%s'.
# cat mysql_virtual_alias_maps.cf user = postfix password = postfix hosts = localhost dbname = postfix query = SELECT goto FROM alias WHERE address='%s' AND active = 1
En este caso la dirección de destino para un alias se almacena en el campo goto de la tabla alias y revisaremos que este activo, esto se usa como una dirección de correo alternativa en la cual también una cuenta puede recibir correos. Tambien se puede usar 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 más pueda recibir el correo.
Le diremos a postfix en que dominios virtuales recibe correos.
Esto se define en el archivo /etc/postfix/mysql_virtual_domains_maps.cf
# cat mysql_virtual_domains_maps.cf user = postfix password = postfix hosts = localhost dbname = postfix query = SELECT domain FROM domain WHERE domain='%s' #optional query to use when relaying for backup MX #query = SELECT domain FROM domain WHERE domain='%s' # and backupmx = '0' and active = '1'
Comprobamos que haga bien la consulta:
# postmap -q tuxjm.net mysql:/etc/postfix/mysql_virtual_domains_maps.cf tuxjm.net
# cat mysql_virtual_mailbox_maps.cf user = postfix password = postfix hosts = localhost dbname = postfix query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
En este caso se usa el filtro para buscar el nombre de el correo (username), y que este activa en la tabla mailbox. El resultado que buscaremos es maildir, el cual es la ruta en el sistema de archivos de el buzón de correo. Esta es la fuente MySQL más 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 MySQL 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 MySQL definida en el archivo /etc/postfix/mysql_virtual_alias_maps.cf en la cual el campo que se busca es la dirección de el correo electrónico.
# cat mysql_virtual_alias_maps.cf user = postfix password = postfix hosts = localhost dbname = postfix query = SELECT goto FROM alias WHERE address='%s' AND active = 1
Antes de definir el uso de alguna fuente de datos, cabe señalar que en nuestra solucion usaremos proxymap(8). para no tener mensajes de error del tipo "too many connections" esto con el fin de consolidar el numero de tablas abiertas para buscar informacion y compartir esa tabla abierta entre multiples procesos.
Ahora que la fuente MySQL "transport" esta definida,
necesitamos hacer que postfix este al tanto de ella. Esto usando los
parámetros "transport_maps" en
/etc/postfix/main.cf.
transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transport_maps.cf
Ahora que la fuente MySQL para los aliases, y la de las
cuentas se han definido, necesitamos hacer que postfix sepa de
ellos. Esto se hace usando el parámetro "virtual_alias_maps" en
/etc/postfix/main.cf.
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
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 más 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/dominios virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_minimum_uid = 5000 virtual_mailbox_limit = 51200000
Los dos primeros parámetros se usan para decirle donde esta la base de el repositorio de los correos virtuales y los dominios virtuales. y la otra para decirle cual es la fuente MySQL donde buscaremos la ruta de el buzón de el correo, recordemos que en la en el archivo /etc/postfix/mysql_virtual_mailbox_maps.cf se obtiene como parámetro maildir. 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í:
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.
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 más 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 smtpd 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 que se suministran 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 la base de datos MySQL, para esto usaremos las bibliotecas SASL de cyrus-sasl y usaremos el demonio de autenticación saslauthd.
Las bibliotecas cyrus-sasl fueron instaladas en la sección: Instalando Postfix con soporte para MySQL, así que ahora solo hace falta configurar lo necesario.
Configurar el demonio saslauthd, los parámetros que usara al
iniciar el demonio son tomados de el archivo de configuración:
/etc/conf.d/saslauthd, lo editamos como se
muestra abajo:
# vim /etc/conf.d/saslauthd
SASLAUTHD_OPTS=""
SASLAUTHD_OPTS="${SASLAUTH_MECH} -a rimap -r"
SASLAUTHD_OPTS="${SASLAUTHD_OPTS} -O localhost"
:wq
Aquí usamos el método de autenticación rimap con la opción -a rimap lo cual le dice al demonio saslauthd que se conecte a un servidor IMAP remoto y que suministre la información de el usuario para hacer la autenticación, el servidor remoto se especifica con: -O localhost.
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
Configuración de Cyrus-SASL para soporte de SMTP autenticado para Postfix:
# vim /etc/sasl2/smtpd.conf pwcheck_method:saslauthd mech_list: plain login :wq
En esta configuración le decimos que las bibliotecas cyrus-sasl usen como método de autenticación al demonio saslauthd, y que use como mecanismos de autenticación plain y login.
Para activar el soporte SASL en el servidor SMTP de Postfix,
editaremos el archivo de configuración de postfix
/etc/postfix/main.cf
# vim /etc/postfix/main.cf # BEGIN SMTP-AUTH SASL CONFIG smtpd_sasl_auth_enable = yes smtpd_sasl_application_name = smtpd smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = # END SMTP-AUTH SASL CONFIG :wq
Explicación de los parámetros y valores usados:
smtpd_sasl_auth_enable = yes
Esta linea activa el soporte SASL para el servidor SMTP de Postfix ya que no esta activa de manera predeterminada.
smtpd_sasl_application_name = smtpd
El nombre de la aplicación SASL. Esto controla el nombre de el archivo de configuración para SASL, el valor predeterminado es smtpd, lo que corresponde al archivo de configuración smtpd.conf
smtpd_sasl_security_options = noanonymous
Especificamos que mecanismos de autenticación el servidor SMTP de Postfix ofrecerá a los clientes. Con esta configuración el servidor SMTP de Postfix acepta contraseñas en texto plano pero no acepta inicios de sesión anónimos.
smtpd_sasl_local_domain =
Especificamos el nombre de el REALM para la autenticación local SASL, lo dejamos vacío ya que hospedaremos varios dominios.
broken_sasl_auth_clients = yes
Activamos inter-operatibilidad para clientes SMTP que tienen una implementación obsoleta de el comando AUTH. (RFC 2553) como clientes Microsoft Outlook Express versión 4 y Microsoft Exchange versión 5.0. Estos clientes esperan que el servidor SMTP responda al comando EHLO con: "250 AUTH=stuff" en lugar de "250 AUTH stuff"
Para permitir que los clientes smtp correctamente autenticados puedan hacer relay por el servidor, agregamos una regla más a nuestras restricciones.
vim /etc/postfix/main.cf
# RECIPIENT RESTRICTIONS
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
Probando que la configuración de autenticación entre SASL y la información almacenada en MySQL funcione:
# testsaslauthd -u jmedina@tuxjm.net -p secret 0: OK "Success."
Si la prueba se hace satisfactoriamente entonces debes de recibir el mensaje: 0: OK "Success.", si no fue así entonces volver a revisar las configuraciones.
Probando la autenticación SMTP, ahora haremos una prueba de autenticación real mediante comandos SMTP:
| Tu | Servidor SMTP |
|---|---|
| $ telnet mail.tuxjm.net 25 | |
| 220 mail.tuxjm.net ESMTP Postfix (Gentoo GNU/Linux) | |
| ehlo test.tuxjm.net | |
| 250-mail.tuxjm.net 250-PIPELINING 250-SIZE 15000000 250-ETRN 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250 8BITMIME | |
| AUTH PLAIN am1lZGluYQBqbWVkaW5hADE5NjNwYXNz | |
| 235 Authentication successful | |
| quit | |
| Servidor SMTP | 221 Bye |
Aquí se muestra la conversación completa:
$ telnet mail.tuxjm.net 25 Trying 209.205.213.234... Connected to mail.tuxjm.net. Escape character is '^]'. 220 mail.tuxjm.net ESMTP Postfix (Gentoo GNU/Linux) ehlo test.tuxjm.net 250-mail.tuxjm.net 250-PIPELINING 250-SIZE 15000000 250-ETRN 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250 8BITMIME AUTH PLAIN am1lZGluYQBqbWVkaW5hADE5NjNwYXNz 235 Authentication successful quit 221 Bye Connection closed by foreign host.
En la conversación de arriba los comandos suministrados por el cliente están marcados en negro y lo demás es lo que responde el servidor SMTP.
Cuando hagas tus pruebas, en lugar de poner am1lZGluYQBqbWVkaW5hADE5NjNwYXNz ponla forma codificada en base64 de: username\0000username\0000password (el \000 es un byte nulo). El ejemplo de arriba es para el nombre de usuario 'jmedina' y la contraseña '1963pass'.
Para poder generar la información de autenticación codificada en base64 podemos usar cualquiera de los siguientes dos comandos:
$ printf 'jmedina\000jmedina\0001963pass' | mimencode am1lZGluYQBqbWVkaW5hADE5NjNwYXNz
$ perl -w -MMIME::Base64 -e 'print encode_base64("jmedina\000jmedina\0001963pass");'
am1lZGluYQBqbWVkaW5hADE5NjNwYXNz
El comando mimencode es parte de el software metamail. MIME::Base64 esta disponible desde http://www.cpan.org/.
Precaución: cuando publiquen logs de las negociaciones SASL en listas publicas o en chats, mantengan en mente que la información de el usuario y la contraseña es trivial de recuperar en la forma codificada base64.
por ejemplo:
$ perl -w -MMIME::Base64 -e 'print decode_base64("am1lZGluYQBqbWVkaW5hADE5NjNwYXNz");'
jmedinajmedina1963pass
Más documentación sobre Postfix/SASL se puede ver en el README http://www.postfix.org/SASL_README.html