User Tools

Site Tools


howto_postfix

Descripcion

Este pretende ser un mega-HOWTO de postfix:

Postfix + Courier IMAP + MySQL + PostfixAdmin + SpamAssassin + SASL + TLS + roundcube + Postgrey

Software

El nombre de los paquetes dependerán de la distribución usada, por supuesto. A modo general:

Instalación Mí­nima

Con los siguientes paquetes tendremos un servidor de correo básico pero con soporte para dominios:

aptitude install mysql-client mysql-server \
	     postfix postfix-mysql \
	     courier-base courier-authdaemon courier-authlib-mysql courier-imap courier-imap-ssl courier-ssl \

Instalación Completa con antivirus, ssl y antispam

Principalmente con la instalación y configuración de esta parte conseguimos un servidor eficiente.

aptitude install libsasl2-modules-sql libgsasl7 libauthen-sasl-cyrus-perl \
	     spamassassin spamc postgrey 

Instalación Basica

Como primer paso habrá que cerrar el firewall a todos los nuevos servicios para que nadie marranee antes de terminar la configuración.

Postfix

Editamos nuestro servidor de correo:

vi /etc/mailname

Sustituyendo el nombre por nuestro smpt.dominio.com.

main.cf

Opciones principales del fichero main.cf de postfix (/etc/postfix/main.cf):

Variable Descripcion
smtpd_banner = $myhostname ESMTP $mail_name
Mensaje de bienvenida. Conviene no mostrar información acerca de distribución o versión de paquetes
#myhostname= mail.example.com
Comentar la variable con nuestro nombre, ya que será variable.
myorigin = /etc/mailname
Puede ser el nombre del dominio, el fichero mailname o el nombre del smtp
relayhost =
Esta variable contiene nuestro relay (smarthost) si lo usamos o nada si emitimos los mails directamente desde nuestro servidor.
inet_interfaces = all
mynetworks_style = host
Recibimos emails desde cualquier interfaz pero solo confiamos en nuestro host.
# how long if undelivered before sending warning update to sender
delay_warning_time = 4h
# will it be a permanent error or temporary
unknown_local_recipient_reject_code = 450
# how long to keep message on queue before return as failed.
# some have 3 days, I have 16 days as I am backup server for some people
# whom go on holiday with their server switched off.
maximal_queue_lifetime = 7d
# max and min time in seconds between retries if connection failed
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
# how long to wait when servers connect before receiving rest of data
smtp_helo_timeout = 60s
# how many address can be used in one message.
# effective stopper to mass spammers, accidental copy in whole address list
# but may restrict intentional mail shots.
smtpd_recipient_limit = 16
# how many error before back off.
smtpd_soft_error_limit = 3
# how many max errors before blocking it.
smtpd_hard_error_limit = 12
Varias variables referentes a la cola/descarte de mensajes
# require proper helo at connections
smtpd_helo_required = yes
# waste spammers time before rejecting them
smtpd_delay_reject = yes
disable_vrfy_command = yes
Algunas restricciones referentes a la “entrada” al smtp
transport_maps = mysql:/etc/postfix/mysql_virtual_transport.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/mail/mailboxes
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_transport = virtual
virtual_uid_maps = static:5000
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has no space available in their inbox.
virtual_overquota_bounce = yes
Configuración referente a mysql principalmente, sobre todo atención a la variable virtual_mailbox_base que ha de ser un directorio existente y con permisos para que postfix escriba en el mismo, lo realizamos en el siguiente paso.

Operaciones adicionales

Generamos los alias necesarios para el correo interno, sobre todo hay que vigilar que el alias para root corresponde con un usuario real:

cp /etc/aliases /etc/postfix/aliases
postalias /etc/postfix/aliases

Creación del directorio para las cuentas de correo:

mkdir -p /home/mail/mailboxes
groupadd virtual -g 5000
useradd virtual -u 5000 -g 5000
chown -R virtual:virtual /home/mail/mailboxes

Configuración postfix-mysql

La configuración para mysql la baso en lo necesario para postfixadmin

Como se puede apreciar en las opciones de más abajo, todos los ficheros cuentan con el mismo patrón: * hosts, dbname, user y password : Datos de conexion a Mysql * table : Tabla de donde se obtienen los datos * select_field y where_field : datos para ejecutar la query del tipo:

SELECT select_field FROM table WHERE where_field ;

Postfix completa la query con algunos campos adicionales, por supuesto, se pueden apreciar en el “mail.log”, esto deberá ser el sistema de debugar qué está haciendo postfix si vemos que las cosas no funcionan.

Fichero Contenido Descripcion
vi mysql_relay_domains_maps.cf
hosts = 127.0.0.1
dbname = postfix
user = postfix
password = password
table = domain
select_field = domain
where_field = domain
Lista de relays para cada dominio
vi mysql_virtual_alias_maps.cf
hosts = 127.0.0.1
dbname = postfix
user = postfix
password = password
table = alias
select_field = goto
where_field = address
Listado de alias
vi mysql_virtual_domains_maps.cf
hosts = 127.0.0.1
dbname = postfix
user = postfix
password = password
table = domain
select_field = domain
where_field = domain
Listado de dominios
vi mysql_virtual_mailbox_limit_maps.cf
hosts = 127.0.0.1
dbname = postfix
user = postfix
password = password
table = mailbox
select_field = quota
where_field = username
Cuota de cada usuario
vi mysql_virtual_mailbox_maps.cf
hosts = 127.0.0.1
dbname = postfix
user = postfix
password = password
table = mailbox
select_field = maildir
where_field = username
Directorio en linux del usuario de correo
vi mysql_virtual_transport.cf
hosts = 127.0.0.1
dbname = postfix
user = postfix
password = password
table = domain
select_field = transport
where_field = domain
Tipologá del dominio (virutal)

Courier

Configuración inicial para courier bastante simplificada:

vi /etc/courier/authdaemonrc
#authmodulelist="authpam"
authmodulelist="authmysql"
DEBUG_LOGIN=2

Es decir, le indicamos que vamos a usar mysql para autenticaión en vez de PAM y habilitamos el debug a syslog para posibles troubleshoots.

Creamos el fichero de configuración de mysql;

vi /etc/courier/authmysqlrc
MYSQL_SERVER            localhost
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          password
MYSQL_PORT              0
MYSQL_OPT               0
MYSQL_DATABASE          postfix
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password
MYSQL_LOGIN_FIELD       username
MYSQL_NAME_FIELD        name
MYSQL_UID_FIELD         '5000'
MYSQL_GID_FIELD         '5000'
MYSQL_HOME_FIELD        '/home/mail/mailboxes'
MYSQL_MAILDIR_FIELD     maildir

Como se puede apreciar únicamente le proporcionamos los datos de conexion al servidor y datos básicos del sistema.

MySQL

Para mysql únicamente crearemos el usuario y la bbdd ya que del resto se encargará el postfixadmin.

msyql -p
create database postfix ;
GRANT ALL PRIVILEGES ON `postfix`.* TO 'postfix'@'localhost'  IDENTIFIED BY 'password' ;

Logicamente es conveniente probar la conexion para cerciorarnos que el usuario está ok.

PostfixAdmin

Hay que descargar el PostfixAdmin: http://sourceforge.net/projects/postfixadmin/ La instalación es como la de cualquier aplicación php, no entraré en detalles por esa parte, me centro únicamente en la configuración del mismo. Una vez lo tengamos descomprimido, cambiamos las opciones básicas para lanzar el wizard mediante web:

vi config.inc.php
Variable Descripcion
$CONF[['configured']] = true;
Hay que indicar que no somos un bot
$CONF[['setup_password']] = //;
El propio postfixadmin nos proporciona el hash que hay que poner aquí­ la primera vez que lo ejecutemos.
$CONF[['default_language']] = 'en';
Si queremos cambiar el Idioma por defecto
$CONF[['database_type']] = 'mysql';
$CONF[['database_host']] = 'localhost';
$CONF[['database_user']] = 'postfix';
$CONF[['database_password']] = 'password';
$CONF[['database_name']] = 'postfix';
$CONF[['database_prefix']] = //;
Todas las opciones para conexion a la bbdd, son las mismas que usamos para el postfix en sí­.

Ahora ya podemos apuntar a la dirección web que contiene el setup, pej:

En este momento se crearán automáticamente todas las tablas necesarias para el funcionamiento tanto de postfix (usando la configuración anterior) como del postfixadmin en sí­. Aparte, se nos da la posibilidad de crear el hash para el “setup_password” comentado anteriormente y la creación de usuarios administrativos. Logicamente hay que crear uno que será super user, que no será un mailbox, unicamente es un login para el postfixadmin.


Con esto y la creación de una nueva cuenta de correo, estará finalizada la configuración básica del servidor, deberámos poder conectarnos y enviar emails. Cosa conveniente antes de pasar a la siguiente parte de la configuración.


Instalación Segura

Esta parte de la instalación trataré parámetros básicos de autenticación y SSL. Para mí­ es básico realizar estas operaciones como mí­nimo (sin contar la parte de antispam)

SASL

Usaremos la Simple Authentication and Security Layer para tener el servicio smtpd con autenticación por usuario.

Software

aptitude install sasl2-bin libpam-mysql

Configuración

mkdir -p /var/spool/postfix/var/run/saslauthd

Hacemos un backup y editamos el fichero de configuración:

mv /etc/default/saslauthd /etc/default/saslauthd.old
vi /etc/default/saslauthd

Y añadimos nuestros parametros:

START=yes
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=3
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Cuidado con el número de threads, 3, puede ser muy poco.

Creamos la configuración de sistema (pam) para el smtpd:

vi /etc/pam.d/smtp
auth    required   pam_mysql.so user=postfix passwd=password host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=postfix passwd=password host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1

Revisar las variables acostumbradas: * user * passwd * host * db * table * usercolum * passwdcolumn

Ahora creamos la configuración de postfix/smptd:

vi /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: password
sql_database: postfix
sql_select: select password from mailbox where username='%u@%r' and active = 1

Añadimos el usuario postfix al grupo del sasl2

adduser postfix sasl

Bastará con reiniciar el servicio y comprobar la autenticación; como troubleshoot usarámos el mail.log y el auth.log.

SSL/TLS

Configuración ara SSL/TLS tanto en imap como smtp.

IMAP

La configuración de imap-ssl ya la suele realizar por defecto debian cuando instalamos el paquete de courier-ssl. Hay que editar el fichero de configuración:

vi /etc/courier/imapd-ssl

Y confirmar/verificar las siguientes opciones:

SSLPORT=993
SSLADDRESS=0
SSLPIDFILE=/var/run/courier/imapd-ssl.pid
SSLLOGGEROPTS="-name=imapd-ssl"
IMAPDSSLSTART=YES
IMAPDSTARTTLS=YES
IMAP_TLS_REQUIRED=1
COURIERTLS=/usr/bin/couriertls
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CERTFILE=/etc/postfix/ssl/www.ciberterminal.net.pem
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/var/lib/courier/couriersslcache
TLS_CACHESIZE=524288
MAILDIRPATH=Maildir

Las principales opciones a tener en cuenta son las siguentes:

Variable Descripcion
SSLPORT=993
El puerto por donde se va a escuchar
IMAP_TLS_REQUIRED=1
Con esta variable se fuerza el SSL, eliminando la opción de transferencias sin encriptar
TLS_CERTFILE=/etc/postfix/ssl/www.ciberterminal.net.pem
En mi caso uso el mismo certificado para smtp e imap, el pem es el key+crt

SMPT

Para smyp es “conveniente” habilitar tanto ssl como plain, principalmente por que roundcube suele dar problemas con TLS habilitado en smptd. Con capar el puerto 25 deberá valer, aunque no hay nada 100% seguro.

Editamos el fichero de configuración principal:

vi /etc/postfix/main.cf

Y añadimos/modificamos los paŕametros:

# TLS parameters
smtpd_use_tls=yes
smtpd_tls_cert_file=/etc/postfix/ssl/www.ciberterminal.net.crt
smtpd_tls_key_file=/etc/postfix/ssl/www.ciberterminal.net.key
smtpd_tls_CAfile = /etc/postfix/ssl/ca.crt
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache

Después habilitamos el puerto para smtps:

vi /etc/postfix/master.cf

Y lo habilitamos:

smtps     inet  n       -       -       -       -       smtpd

Instalación Complementaria

En esta última parte, trato temas adicionales como un gestor webmail, Roundcube muchí­simo más avanzado que el famoso squirrelmail; antivirus, antispam y demás …

Roundcube

Descargamos la versión que queramos, stable o unstable, a gusto de cada uno: * http://roundcube.net/downloads La configuración ha de hacerse igual que con cualquier aplicación web, intentando aseguralo todo lo máximo posible.

Una vez estando descomprimido, basta seguir las instrucciones del INSTALL: * Crear bbdd * Crear usuario * Hacer la importación inicial de datos. En mi caso he decidido editar los ficheros de configuración, tal como dice el propio install.

db.inc.php

Lo único que hay que cambiar en este caso es la cadena de conexión:

$rcmail_config[['db_dsnw']] = 'mysql://roundcube:password@localhost/roundcubemail';

La cadena de conexión es la habitual:

mysql:<nowiki>//</nowiki>usuario:password@IP-SERVIDOR-MYSQL/NOMBRE_BBDD

main.inc.php

Aquí­ está la chicha de la configuración, en mi caso he realizado cambios en las siguientes variables:

Variable Descripcion
$rcmail_config[['enable_caching']] = FALSE; 
Estando todo en el mismo host es innecesario cachear
$rcmail_config[['force_https']] = TRUE; 
Forzamos https para ni siquiera dar la opción de plain http
$rcmail_config[['default_host']] = 'ssl://localhost';
$rcmail_config[['default_port']] = 993; 
Host y puerto del servidor IMAP, incluyendo protocolo
$rcmail_config[['imap_auth_type']] = plain; 
Metodo de autenticación para el IMAP
$rcmail_config[['smtp_server']] = 'localhost';
$rcmail_config[['smtp_user']] = '%u';  
$rcmail_config[['smtp_pass']] = '%p'; 
$rcmail_config[['smtp_auth_type']] = 'LOGIN'; 
Host, user, pass y metodo de autenticacion para smtp
$rcmail_config[['smtp_debug']] = true; 
En mi caso activé el modo debug de smtp para detectar ciertos problemas causados por ssl
$rcmail_config[['useragent']] = 'Ciberterminal Webmail'; 
$rcmail_config[['product_name']] = 'Ciberterminal Webmail'; 
Cadenas de texto que aparecerán en la web

Configuracion de otro cliente

border|400px|01 Descripcion
border|400px|02 Descripcion
border|400px|03 Descripcion

Spamassassin

Una vez instalado, es recomendable crear un usuario con home para que vaya guardando sus datos, por ejemplo:

useradd -u 111 -m -s /bin/false spamassassin

Ahor hay que habilitar el demonio:

vi /etc/default/spamassassin

Y cambiar la siguiente opción a 1:

# /etc/default/spamassassin

# Change to one to enable spamd
ENABLED=1

# Options
# See man spamd for possible options. The -d option is automatically added.

# SpamAssassin uses a preforking model, so be careful! You need to
# make sure --max-children is not set to anything higher than 5,
# unless you know what you're doing.

OPTIONS="--create-prefs --max-children 5 --helper-home-dir --username spamassassin"

# Pid file
# Where should spamd write its PID to file? If you use the -u or
# --username option above, this needs to be writable by that user.
# Otherwise, the init script will not be able to shut spamd down.
PIDFILE="/var/run/spamd.pid"

# Set nice level of spamd
NICE="--nicelevel 15"

El fichero cuenta con otras opciones como el nice del proceso de spamassassin, número de threads y similar. Ahora hay que editar el fichero de configuración principal de spamassassin. Recomiendo usar la siguiente herramienta para generar la configuración Y sustituir el /etc/spamassassin/local.cf por defecto por el que generemos, por ejemplo en mi caso:

required_score           7.5
report_safe             1
use_bayes               1
bayes_auto_learn              0
skip_rbl_checks         0
use_razor2              1
use_dcc                 1
use_pyzor               1
ok_languages            all
ok_locales              en es

En el caso de haber añadido algún plugin, hay que habilitarlo en el fichero: * v310.pre

Solo falta configurar postfix:

vi /etc/postfix/master.cf

Y cambiar la linea de configuración del smtpd a:

smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamassassin

Y añadir al final del fichero:

spamassassin          unix  -       n       n       -       -       pipe
user=spamassassin argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

spampd

spampd es un proxy de alto rendimiento para el préanalisis de mails. Es decir, se sitúa “por delante” de postfix, analiza el email y si no es spam, lo redirige de manera normal a postfix. Esto elimina el análisis en disco del mismo una vez aceptado por postfix incrementando mucho el rendimiento (al menos según los desarrolladores). Algún dia trataré sobre el tema, mientras está la página oficial

Debugging

La mejor manera de debugar es leer los logs de postfix, será vuestro mejor amigo y peor pesadilla. Desde que no os autentique cualquier cliente de correo hasta que spamassassin no funcione por permisos de sistema. Siempre hay que tener abierto un:

tail -f /var/log/mail.log

Troubleshooting

Roundcube

En determinadas ocasiones, roundcube no consigue inicializar el protocolo ssl con imap, dando el siguiente error:

Jun 27 20:04:41 ks358028 imapd-ssl: couriertls: connect: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

Para solucionarlo basta con cambiar la configuración del courier/imap-ssl a:

Fichero Valor
/etc/courier/imapd-ssl
TLS_PROTOCOL=SSL23

Links

howto_postfix.txt · Last modified: 2012/03/20 10:16 by dodger