domingo, 13 de abril de 2008

Configuración de un Sistema de Correo con Postfix+MySQL+Sasl+Squirrelmail

Este manual es una guía práctica, no tiene en cuenta los conceptos teóricos. No es la única forma de montar este sistema pero fue por la que me fui y esta funcionando, me gustó por que es bastante personalizable.
Primero que todo vamos a comenzar por instalar los paquetes fundamentales.

aptitude install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authmysql courier-pop courier-imap postfix-tls libsasl2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin

Lo próximo es crear un usuario para que sean quien usen los servicios para conectarse a nuestra base de datos.

$ mysql -u root -p
Password: ***************
mysql> CREATE USER 'mail_admin'@'my.db.server' IDENTIFIED BY 'm41l_4dm\n';

mysql> GRANT USAGE ON * . * TO 'mail_admin'@ 'my.db.server' IDENTIFIED BY 'm41l_4dm\n' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

mysql> CREATE DATABASE 'mailserver';

mysql> GRANT ALL PRIVILEGES ON `mailserver` . * TO 'mail_admin'@ 'my.mail.server';

mysql> use mailserver;

mysql> CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;

mysql> CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

mysql> CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;

mysql> CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
mysql> quit

estas tablas tienen las funciones de:
domains -> almacenar los dominios que va a manejar nuestro postfix.
forwardings -> almacena los alias que se vayan a manejar por nuestro MTA.
users -> esta tiene la pulpa, lleva la información para la autenticación del usuario y la cuota q se le aplica. Aquí es donde pienso agregar los campos para el tipo de mensajería que tendrá el usuario y si esta activo o no!
transport -> aquí esta la tabla de transportes para nuestro MTA.
Configuración de postfix.
Antes que nada vamos a crear el usuario y el grupo que nos brindara si directorio de inicio y sus permisos para manejar todos los buzones de nuestros usuarios virtuales. Luego veremos donde se pone en practica la función de este usuario.

~# groupadd -g 5000 vmail
~# useradd -g vmail -u 5000 vmail -d /home/vmail -m

Las conexiones que va a hacer nuestro MTA (postfix) serán siempre locales, por lo tanto no necesitamos que MySQL escuche por la interface física que tenemos, para asegurarnos de esto modificamos el archivo de configuración del MySQL y nos aseguramos de que el parámetro bind-address tenga como valor a 127.0.0.1
Lo próximo que vamos a hacer es decirle al postfix donde encontrar la información de la base de datos y las consultas que le va a hacer a las tablas relacionadas con nuestro servicio. Para esto vamos a crear 6 archivos de texto que contendrán esta información.
voy a tratar la variable $config_directory para que sea independiente del directorio en el que se encuentra la configuración del servidor, ya que en no en todas las variantes de Unix se encuentra en el mismo lugar.

$config_directory/mysql-virtual_domains.cf
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT domain FROM domains WHERE domain='%s'

$config_directory/mysql-virtual_forwardings.cf
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT destination FROM forwardings WHERE source='%s'

$config_directory/mysql-virtual_mailboxes.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'

$config_directory/mysql-virtual_email2email.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT email FROM users WHERE email='%s'

$config_directory/mysql-virtual_transports.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT transport FROM transport WHERE domain='%s'

$config_directory/mysql-virtual_mailbox_limit_maps.cf:
user = mail_admin
password = m41l_4dm\n
hosts = my.db.server
dbname = mailserver
query = SELECT quota FROM users WHERE email='%s'

ahora vamos a hacer la configuración del archivo principal del postfix, main.cf,

myhostname = correo.midominio.org
mydestination = correo.midominio.org, localhost, localhost.localdomain
mynetworks = 127.0.0.0/8

virtual_alias_domains =
virtual_alias_maps =
proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql- virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000 # UID del usuario que creamos para que guarde los buzones
virtual_gid_maps = static:5000 # GID del usuario que creamos para que guarde los buzones
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps =
proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf

virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "El usuario esta Sobrepasado de su Cuota."
virtual_overquota_bounce = yes

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

# smtpd_use_tls = yes
# smtpd_tls_cert_file = /etc/postfix/smtpd.cert
# smtpd_tls_key_file = /etc/postfix/smtpd.key

transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps

Configuración del Courier-Imap.
en el directorio de confirugacion del courier vamos a editar el archivo authdaemonrc.
authmodulelist="authmysql"
y luego el archivo authmysqlrc

MYSQL_SERVER my.db.server
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD m41l_4dm\n
MYSQL_PORT 3306
MYSQL_DATABASE mailserver
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD
MYSQL_QUOTA_FIELD quota

Después reiniciar todos los procesos del courier

:~# /etc/init.d/courier-authdaemon restart
:~# /etc/init.d/courier-imap restart
:~# /etc/init.d/courier-imap-ssl restart
:~# /etc/init.d/courier-pop restart
:~# /etc/init.d/courier-pop-ssl restart

para FreeBSD seria

:~# /usr/local/etc/rc.d/courier-authdaemon restart
:~# /usr/local/etc/rc.d/courier-imap restart
:~# /usr/local/etc/rc.d/courier-imap-ssl restart
:~# /usr/local/etc/rc.d/courier-pop restart
:~# /usr/local/etc/rc.d/courier-pop-ssl restart

verificamos que estén funcionando los servicios.

:~# telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Hello there.
:~# telnet localhost imap
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Hello there.

Configuración del Saslauth para la autenticación del SMTP.
Editar el archivo /etc/default/saslauthd, eliminar el comentario de la linea START = yes y agregar una linea en que se le pasaran los parámetros necesarios al demonio.

START=yes
MECHANISMS="pam"
PARAMS="-m /var/spool/postfix/var/run/saslauthd -r"

Luego vamos a crear el archivo que usara el PAM para la autenticación SMTP, en /etc/pam.d/smtp

auth required pam_mysql.so user=mail_admin passwd=m41l_4dm\n host=my.db.server db=mailserver table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd= m41l_4dm\n host=my.db.server db=mailserver table=users usercolumn=email passwdcolumn=password crypt=1

Luego se crea un archivo dentro del directorio $config_directory/sasl/ con el nombre smtpd.conf
con las siguientes lineas.

pwcheck_method: saslauthd
log_level: 7
mech_list: login plain
mysql_verbose: yes

Después reiniciamos el postfix.

:~# /etc/init.d/postfix restart
:~# /etc/init.d/saslauthd restart

para FreeBSD seria

:~# /usr/local/etc/rc.d/postfix restart
:~# /usr/local/etc/rc.d/saslauthd restart

lo otro que queda es crear un par de registros en nuestra base de datos y ya esta todo funcionando!

mysql -u mail_admin -p
Password:

USE mailserver;
Se Debe crear al menos una entrada para el dominio que se va a manejar.
INSERT INTO `domains` (`domain`) VALUES ('midominio.org');
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('user@midominio.org', ENCRYPT('Mykl4v3'), 10485760);
(Asegúrense de usar la función ENCRYPT para almacenar la clave de acceso encriptada!)
Si quiere agregar entradas en las otras tablas, debe quedar como esto:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('pepe@midiminio.org', 'user@midominio.org');
INSERT INTO `transport` (`domain`, `transport`) VALUES ('midominio.org', 'smtp:mx.midominio.org');

Configuracion del Squirrelmail
en el config.php se deben editar las siguientes lineas.

$imap_server_type = 'courier';
$imap_auth_mech = 'login';

No hay comentarios: