jueves, 11 de septiembre de 2008

Servidor de correo en Gentoo ( Postfix + Dovecot + postfixadmin + mysql)

Ya va siendo hora de ir escribiendo el primer post sobre informática. En este caso se trata de cómo montar un servidor de correo en Gentoo, aunque es facilmente aplicable a cualquier distribución de Linux.
En este caso partía con ventaja, ya que anteriormente había montado un servidor de correo de similares características pero bajo una Debian. Bajo mi humilde experiencia ambas son igual de fáciles o igual de difíciles, cuestión de gusto XD.
No quería empezar este post sin antes mencionar la gran fuente de conocimiento que me ha proporcionado gentoo-wiki.com en particular el siguiente link.

http://gentoo-wiki.com/HOWTO_Secure_Mail_Server_using_Dovecot

Instalación

Antes de instalar cualquier ebuild se debe configurar los flags que deben utilizar algunos ebuilds que son necesarios. Para ello se deben poner las siguientes líneas en el fichero /etc/portage/package.use.

Fichero: /etc/portage/package.use
net-mail/dovecot pop3d mysql
mail-mta/postfix ssl mysql mbox nis pam
mail-filter/dspam virtual-users mysql daemon
dev-lang/php apache2 concurrentmodphp hash imap mhash mysql mysqli posix postgres sqlite threads xml xmlreader xmlwriter xpm zip


Después de esto, se debe elimiar ssmtp que puede dar problemas de compatibilidad con postfix.

emerge -Ca ssmtp.

Ahora es cuando ya se pueden instalar los paquetes necesarios para montar el servidor de correo.

emerge -uD dovecot postfix clamav dspam dspam-web squirrelmail

Y por último para terminar la sección de instalación hay que ejecutar el script de configuración de dovecot.

emerge --config dovecot.

Configuración
Para la configuración del servidor no es necesario seguir el mismo orden que se ha establecido, sin embargo es el más aconsejable.

postfixadmin

Lo primero que hay que a hacer es configurar el servidor smtp postfix. No obstante, antes de empezar con la configuración pura de postfix, se instala postfixadmin, paquete muy aconsejable para la gestión de cuentas de correo.

emerge -a postfixadmin.

Con postfixadmin se consigue una fácil administración de las cuentas de correo y de los dóminios que controla el servidor de correo. Además permite otras gestiones como es la gestión de alias dentro del dominio.

Para concluir con la instalación de postfixadmin hay que aplicar el siguiente script de base de datos.

/usr/share/doc/postfixadmin-2.1.0/DATABASE_MYSQL.TXT.gz

postfix

Una vez configurado postfixadmin, es hora de configurar postfix (servidor smtp). Esta instalación está basada en la creación de direcciones virtuales y dominio virtuales, es por este motivo que se creará un nuevo directorio en el árbol de postfix. Para hacer ésto, hay que ejecutar los siguientes comandos:


  • mkdir /var/spool/postfix/virtual

  • chown postfix:postfix /var/spool/postfix/virtual

  • chmod a+rwx /var/spool/postfix/virtual



Lo siguiente que se necesita para seguir con la instalación de postfix es, conocer el uid del usuario postfix y el gid del grupo postfix. Para ésto es necesario mirar en los ficheros /etc/passwd y /etc/group.

Fichero: /etc/postfix/main.cf

smtpd_banner = $myhostname ESTMP $mail_name (Gentoo)
biff = no

append_dot_mydomain = no

alias_database = hash:/etc/postfix/aliases
alias_maps = $alias_database
myhostname = <hostname>
mydomain = <domain>
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain
mail_spool_directory = /var/spool/mail
home_mailbox = Mailbox
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb = $daemon_directory/$process_name $process_id & sleep 5
disable_vrfy_command = yes
show_user_unknown_table_name = no

virtual_transport = virtual
virtual_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_minimum_uid = <postfix_uid>
virtual_uid_maps = static:<postfix_uid>
virtual_gid_maps = static:<postfix_gid>
virtual_mailbox_base = /var/spool/postfix/virtual
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit = 51200000

# Additional for quota support
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 = Espacio de usuario sobrepasado. Inténtelo más tarde
virtual_overquota_bounce = yes



Fichero: /etc/postfix/mysql_virtual_alias_maps.cf

user = <db_user_postfix>
password = <db_pass_postfix>
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address


Fichero: /etc/postfix/mysql_virtual_domains_maps.cf

user = <db_user_postfix>
password = <db_pass_postfix>
hosts = localhost
dbname = postfix
table = domain
select_field = description
where_field = domain
#additional_conditions = and backupmx = '0' and active = '1'


Fichero: /etc/postfix/mysql_virtual_mailbox_maps.cf

user = <db_user_postfix>
password = <db_pass_postfix>
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
#additional_conditions = and active = '1'


Fichero: /etc/postfix/mysql_relay_domains_maps.cf
user = <db_user_postfix>
password = <db_pass_postfix>
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '1'


Fichero: /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = <db_user_postfix>
password = <db_pass_postfix>
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = quota
#additional_conditions = and active = '1'


Una vez que los ficheros han sido configurados, unicamente queda reiniciar postfix mediante /etc/init.d/postfix restart.

Dovecot

Configurado ya postfix (servidor SMTP), es hora de configurar el servidor IMAP / POP3. Dovecot es el encargado de gestionar las conexiones IMAP y POP3.

La configuración que se utiliza a continuación es válida para un servidor IMAP y POP3, de forma que el cliente es el encargado de decidir el método de conexión con el servidor de correo.


Fichero: /etc/dovecot/dovecot-mysql.conf
driver = mysql
connect = dbname=postfix user=<db_user_postfix> host=localhost password=<db_pass_postfix>
default_pass_scheme = PLAIN-MD5
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, <postfix_uid> AS uid, <postfix_gid> AS gid FROM mailbox WHERE username = '%u'

Fichero: /etc/dovecot/dovecot.conf
auth_verbose = yes
mail_debug = yes
mail_access_groups = mail

base_dir = /var/run/dovecot/
protocols = imap imaps pop3 pop3s
listen = *
disable_plaintext_auth = no
shutdown_clients = yes
log_path = /var/log/mail.log
info_log_path = /var/log/mail.log
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
disable_plaintext_auth = no
ssl_disable = no
ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
login_chroot = yes
login_user = postmaster
login_process_per_connection = yes
login_processes_count = 2
login_max_processes_count = 128
login_max_connections = 256
login_greeting = <Mensaje de bienvenida>
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
mail_location = maildir:/var/spool/postfix/virtual/%d/%n
first_valid_uid = <postfix_uid>
pop3_uidl_format = %08Xu%08Xv
auth default {
mechanisms = PLAIN
userdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
user = root
count = 2
}


Para generar los certificados, simplemente hay que ejecutar:

  1. openssl genrsa -out key.pem 1024
  2. openssl req -new -key key.pem -out request.pem
  3. openssl req -x509 -key key.pem -in request.pem -out certificate.pem
  4. openssl x509 -inform der -in certificate.crt -out certificate.pem


Posteriormente se copia key.pem a /etc/ssl/private/dovecot.key y certificate.pem a /etc/ssl/certs/dovecot.pem

Postfixadmin

Al instalar postfixadmin, éste queda almacenado en el directorio /usr/share/webapp/postfixadmin dentro del que se encuentra el directorio htdoc que contiene el software de gestión. Por lo tanto se copia el contenido del directorio a la siguiente ruta:

/var/www/localhost/htdocs/postfixadmin

Cuando se haya terminado de copiar el directorio, hay que asignarle permisos especiales en apache debido a que no es aconsejable que cualquier máquina pueda acceder a esta URL. Por lo tanto hay que añadir las siguientes líneas a apache.

Fichero: /etc/apache2/vhosts.d/default_vhost.include

<Directory "/var/www/localhost/htdocs/postfixadmin">
AllowOverride All
Order deny,allow
Deny from all
Allow from 192.168.19.176/28 127.0.0.1
DirectoryIndex index.php
</Directory>


A continuación se configura el fichero config.inc.php quedando como el siguiente:

Fichero: /var/www/localhost/htdocs/postfixadmin/config.inc.php

<?php
if (ereg ("config.inc.php", $_SERVER['PHP_SELF']))
{
header ("Location: login.php");
exit;
}
$CONF['configured'] = true;
$CONF['postfix_admin_url'] = '';
$CONF['postfix_admin_path'] = dirname(__FILE__);

$CONF['default_language'] = 'es';

$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = '<db_user_postfix>';
$CONF['database_password'] = '<db_pass_postfix>';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';

$CONF['database_tables'] = array (
'admin' => 'admin',
'alias' => 'alias',
'config' => 'config',
'domain' => 'domain',
'domain_admins' => 'domain_admins',
'log' => 'log',
'mailbox' => 'mailbox',
'vacation' => 'vacation',
'vacation_notification' => 'vacation_notification',
);
$CONF['admin_email'] = 'admin@<your-domain>';

$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';

$CONF['encrypt'] = 'md5';
$CONF['min_password_length'] = 5;
$CONF['generate_password'] = 'NO';
$CONF['show_password'] = 'NO'
$CONF['page_size'] = '10';

$CONF['default_aliases'] = array (
'abuse' => 'abuse@<your-domain>',
'hostmaster' => 'hostmaster@<your-domain>',
'postmaster' => 'postmaster@<your-domain>',
'webmaster' => 'webmaster@<your-domain>'
);

$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

$CONF['aliases'] = '10';
$CONF['mailboxes'] = '10';
$CONF['maxquota'] = '10';

$CONF['quota'] = 'NO';
$CONF['quota_multiplier'] = '1024000';
$CONF['transport'] = 'NO';

$CONF['transport_options'] = array (
'virtual', // for virtual accounts
'local', // for system accounts
'relay' // for backup mx
);

$CONF['transport_default'] = 'virtual';

$CONF['vacation'] = 'NO';
$CONF['vacation_domain'] = 'autoreply.<your-domain>';
$CONF['vacation_control'] ='YES';
$CONF['vacation_control_admin'] = 'YES';

$CONF['alias_control'] = 'NO';
$CONF['alias_control_admin'] = 'NO';
$CONF['special_alias_control'] = 'NO';
$CONF['alias_goto_limit'] = '0';

$CONF['backup'] = 'YES';
$CONF['sendmail'] = 'YES';
$CONF['logging'] = 'YES';
$CONF['fetchmail'] = 'YES';
$CONF['fetchmail_extra_options'] = 'NO';

$CONF['show_header_text'] = 'NO';
$CONF['header_text'] = ':: Postfix Admin ::';

$CONF['user_footer_link'] = "http://<your-domain>/main";

$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Return to <your-domain>';
$CONF['footer_link'] = 'http://<your-domain>';

$CONF['welcome_text'] = <<<EOM
Hi,

Welcome to your new account.
EOM;

$CONF['emailcheck_resolve_domain']='YES';
$CONF['show_status']='NO';
$CONF['show_status_key']='NO';
$CONF['show_status_text']='&nbsp;&nbsp;';

$CONF['show_undeliverable']='NO';
$CONF['show_undeliverable_color']='tomato';
$CONF['show_undeliverable_exceptions']=array("unixmail.domain.ext","exchangeserver.domain.ext","gmail.com");
$CONF['show_popimap']='NO';
$CONF['show_popimap_color']='darkgrey';

$CONF['show_custom_count']=2;
$CONF['show_custom_domains']=array("subdomain.domain.ext","domain2.ext");
$CONF['show_custom_colors']=array("lightgreen","lightblue");

$CONF['theme_logo'] = 'images/logo-default.png';
$CONF['theme_css'] = 'css/default.css';

if (file_exists(dirname(__FILE__) . '/config.local.php')) { # for /
include(dirname(__FILE__) . '/config.local.php');
}


Sin embargo, antes de dejar el fichero de config.inc.php así, se debe crear una cuenta de administrador o superadministrador. Para esto lo único que se hace es poner $CONF['configured'] = false; y confirmar que existe el fichero setup.php en el mismo directorio. A continuación se abre un navegador y se introduce la URL de postfixadmin:

http://localhost/postfixadmin/setup.php



Una vez que se ha creado la cuenta se renombra el fichero setup.php a setup.php.disabled y en el fichero config.inc.php se pone a true la propiedad configured.

Referencias
http://gentoo-wiki.com/HOWTO_Secure_Mail_Server_using_Dovecot
http://panoptic.com/wiki/aolserver/How_to_generate_self-signed_SSL_certificates

No hay comentarios: