GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Ubuntu 13.10)

Este tutorial tiene Copyright (c) 2014 de Falko Timme y Srijan Kishore. Se deriva de un tutorial de Christoph Haas que puede encontrar en http://workaround.org. Puede usar este tutorial bajo la licencia Creative Commons 2.5 o cualquier versión posterior.

Este documento describe cómo instalar un servidor de correo Postfix basado en usuarios y dominios virtuales, es decir, usuarios y dominios que se encuentran en una base de datos MySQL. También demostraré la instalación y configuración de Courier (Courier-POP3, Courier-IMAP), para que Courier pueda autenticarse contra la misma base de datos MySQL que usa Postfix.

El servidor Postfix resultante es capaz de SMTP-AUTH y TLS y cuota (La cuota no está integrada en Postfix de forma predeterminada, le mostraré cómo parchear su Postfix de manera adecuada). Las contraseñas se almacenan en encriptadas formulario en la base de datos (la mayoría de los documentos que encontré trataban con contraseñas de texto sin formato, lo que es un riesgo de seguridad). Además de eso, este tutorial cubre la instalación de Amavisd , Asesino de spam y ClamAV para que los correos electrónicos sean escaneados en busca de spam y virus. También mostraré cómo instalar SquirrelMail como una interfaz de correo web para que los usuarios puedan leer y enviar correos electrónicos y cambiar sus contraseñas.

La ventaja de una configuración "virtual" de este tipo (usuarios y dominios virtuales en una base de datos MySQL) es que tiene mucho más rendimiento que una configuración basada en usuarios "reales" del sistema. Con esta configuración virtual, su servidor de correo puede manejar miles de dominios y usuarios. Además, es más fácil de administrar porque solo tiene que lidiar con la base de datos MySQL cuando agrega nuevos usuarios/dominios o edita los existentes. No más comandos postmap para crear archivos db, no más recargas de Postfix, etc. Para la administración de la base de datos MySQL, puede usar herramientas basadas en web como phpMyAdmin, que también se instalará en este tutorial. La tercera ventaja es que los usuarios tienen una dirección de correo electrónico como nombre de usuario (en lugar de un nombre de usuario + una dirección de correo electrónico) que es más fácil de entender y tener en cuenta.

Este howto pretende ser una guía práctica; no cubre los antecedentes teóricos. Se tratan en muchos otros documentos en la web.

¡Este documento viene sin garantía de ningún tipo! Quiero decir que esta no es la única forma de establecer un sistema de este tipo. Hay muchas maneras de lograr este objetivo, pero este es el camino que tomo. ¡No emito ninguna garantía de que esto funcione para usted!

1 nota preliminar

Este tutorial se basa en el servidor Ubuntu 13.10 (Saucy Salamander), por lo que debe configurar una instalación básica del servidor Ubuntu 13.10 antes de continuar con este tutorial. El sistema debe tener una dirección IP estática. Uso 192.168.0.100 como mi dirección IP en este tutorial y server1.example.com como nombre de host.

Asegúrese de haber iniciado sesión como raíz (escriba

sudo su

para convertirse en root), porque debemos ejecutar todos los pasos de este tutorial como usuario root.

Es muy importante que haga de /bin/sh un enlace simbólico a /bin/bash...

dpkg-reconfigure dash

¿Usar guión como shell del sistema predeterminado (/bin/sh)? <-- No

... y que deshabilites AppArmor:

/etc/init.d/apparmor stop 
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils

 

2 Instale Postfix, Courier, Saslauthd, MySQL, phpMyAdmin

Para instalar Postfix, Courier, Saslauthd, MySQL y phpMyAdmin, simplemente ejecutamos

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass

Se le harán algunas preguntas:

Nueva contraseña para el usuario "root" de MySQL:<-- yourrootsqlpassword
Repita la contraseña para el usuario "root" de MySQL:<-- yourrootsqlpassword
¿Crear directorios para la administración basada en web? <-- No
Tipo general de configuración de correo:<-- Sitio de Internet
Nombre de correo del sistema:<-- server1.example.com
Se requiere certificado SSL <-- Ok
Servidor web para reconfigurar automáticamente:<-- apache2
¿Configurar base de datos para phpmyadmin con dbconfig-common? <-- No

3 Aplicar el parche de cuota a Postfix

Tenemos que obtener las fuentes de Postfix, parchearlo con el parche de cuota, crear nuevos paquetes .deb de Postfix e instalar esos paquetes .deb:

apt-get build-dep postfix
cd /usr/src
apt-get source postfix

(Asegúrese de usar la versión correcta de Postfix en los siguientes comandos. Tengo instalado Postfix 2.10.2. Puede averiguar su versión de Postfix ejecutando

postconf -d | grep mail_version

La salida debería verse así:

[email protected]:/usr/src# postconf -d | grep mail_version
mail_version = 2.10.2
milter_macro_v = $mail_name $mail_version
[email protected]:/usr/src#

wget http://vda.sourceforge.net/VDA/postfix-vda-v13-2.10.0.patch
cd postfix-2.10.2
patch -p1 < ../postfix-vda-v13-2.10.0.patch

A continuación, abra debian/rules y cambie DEB_BUILD_HARDENING de 1 a 0:

vi debian/rules

Si no hace esto, su compilación fallará con los siguientes mensajes de error:

maildir.c: In function âdeliver_maildirâ:
maildir.c:974:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c:977:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c:983:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c:986:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c: In function âsql2fileâ:
maildir.c:404:25: warning: ignoring return value of âreadâ, declared with attribute warn_unused_result [-Wunused-result]
maildir.c:417:26: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result [-Wunused-result]
cc1: some warnings being treated as errors
make: *** [maildir.o] Error 1
make: Leaving directory `/usr/src/postfix-2.10.2/src/virtual'
make[1]: *** [update] Error 1
make[1]: Leaving directory `/usr/src/postfix-2.10.2'
make: *** [build] Error 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2
[email protected]:/usr/src/postfix-2.10.2#

Ahora podemos construir los nuevos paquetes Postfix .deb:

dpkg-buildpackage

Ahora subimos un directorio, ahí es donde se han creado los nuevos paquetes .deb:

cd ..

El comando

ls -l

te muestra los paquetes disponibles:

[email protected]:/usr/src# ls -l
total 7124
drwxr-xr-x 18 root root    4096 Apr 16 04:29 postfix-2.10.2
-rw-r--r--  1 root root   48594 Apr 16 04:29 postfix-cdb_2.10.2-1_amd64.deb
-rw-r--r--  1 root root  161974 Apr 16 04:29 postfix-dev_2.10.2-1_all.deb
-rw-r--r--  1 root root 1094344 Apr 16 04:29 postfix-doc_2.10.2-1_all.deb
-rw-r--r--  1 root root   57342 Apr 16 04:29 postfix-ldap_2.10.2-1_amd64.deb
-rw-r--r--  1 root root   50554 Apr 16 04:29 postfix-mysql_2.10.2-1_amd64.deb
-rw-r--r--  1 root root   50804 Apr 16 04:29 postfix-pcre_2.10.2-1_amd64.deb
-rw-r--r--  1 root root   50756 Apr 16 04:29 postfix-pgsql_2.10.2-1_amd64.deb
-rw-r--r--  1 root root   55701 Jun  7  2013 postfix-vda-v13-2.10.0.patch
-rw-r--r--  1 root root  282175 Apr 16 04:28 postfix_2.10.2-1.diff.gz
-rw-r--r--  1 root root    1522 Apr 16 04:28 postfix_2.10.2-1.dsc
-rw-r--r--  1 root root    3899 Apr 16 04:29 postfix_2.10.2-1_amd64.changes
-rw-r--r--  1 root root 1542368 Apr 16 04:29 postfix_2.10.2-1_amd64.deb
-rw-r--r--  1 root root 3828326 Sep 12  2013 postfix_2.10.2.orig.tar.gz

Elija los paquetes postfix y postfix-mysql e instálelos así:

dpkg -i postfix_2.10.2-1_amd64.deb postfix-mysql_2.10.2-1_amd64.deb

4 Crea la base de datos MySQL para Postfix/Courier

Ahora creamos una base de datos llamada correo:

mysqladmin -u root -p create mail

Se le pedirá esta pregunta:

Introduzca la contraseña:<-- yourrootsqlpassword

A continuación, vamos al shell de MySQL:

mysql -u root -p

En el shell de MySQL, creamos el usuario mail_admin con la contraseña mail_admin_password (reemplácela con su propia contraseña) que tiene privilegios SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR en la base de datos de correo. Este usuario será utilizado por Postfix y Courier para conectarse a la base de datos de correo:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;

Todavía en el shell de MySQL, creamos las tablas que necesitan Postfix y Courier:

USE mail;
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
ENGINE=MyISAM;
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
ENGINE=MyISAM;
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) ENGINE=MyISAM;
CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) ENGINE=MyISAM;
quit;

Como habrás notado, con la renuncia; hemos dejado el shell de MySQL y estamos de vuelta en el shell de Linux.

Los dominios la tabla almacenará cada dominio virtual para el que Postfix debería recibir correos electrónicos (por ejemplo, example.com ).

[...]
export DEB_BUILD_HARDENING=0
[...]

Los reenvíos la tabla es para crear un alias de una dirección de correo electrónico a otra, p. reenviar correos electrónicos para [email protected] a [email protected] .

dominio
ejemplo.com

Los usuarios La tabla almacena todos los usuarios virtuales (es decir, las direcciones de correo electrónico, porque la dirección de correo electrónico y el nombre de usuario son los mismos) y las contraseñas (en formato cifrado). formulario!) y un valor de cuota para cada casilla de correo (en este ejemplo, el valor predeterminado es 10485760 bytes, lo que significa 10 MB).

fuente destino
[correo electrónico protegido] [correo electrónico protegido]

El transporte La tabla es opcional, es para usuarios avanzados. Permite reenviar correos para usuarios individuales, dominios completos o todos los correos a otro servidor. Por ejemplo,

correo electrónico contraseña cuota
[correo electrónico protegido] No9.E4skNvGa. ("secreto" en forma encriptada) 10485760

reenviaría todos los correos electrónicos para example.com a través del protocolo smtp al servidor con la dirección IP 1.2.3.4 (los corchetes [] significa "no realizar una búsqueda del registro MX DNS" (lo que tiene sentido para las direcciones IP...). Si usa un nombre de dominio completo (FQDN) en su lugar, no usaría los corchetes).

Por cierto, (supongo que la dirección IP de su sistema de servidor de correo es 192.168.0.100) puede acceder a phpMyAdmin en http://192.168.0.100/phpmyadmin/ en un navegador e iniciar sesión como mail_admin. A continuación, puede echar un vistazo a la base de datos. Más tarde puede usar phpMyAdmin para administrar su servidor de correo.

5 Configurar postfijo

Ahora tenemos que decirle a Postfix dónde puede encontrar toda la información en la base de datos. Por lo tanto, tenemos que crear seis archivos de texto. Notará que le digo a Postfix que se conecte a MySQL en la dirección IP 127.0.0.1 en lugar de localhost. Esto se debe a que Postfix se está ejecutando en una cárcel chroot y no tiene acceso al socket MySQL, que intentaría conectar si le dijera a Postfix que use localhost. Si uso 127.0.0.1, Postfix usa la red TCP para conectarse a MySQL, lo cual no es un problema incluso en un chroot jail (la alternativa sería mover el socket de MySQL al chroot jail, lo que causa otros problemas).

Asegúrese de que /etc/mysql/my.cnf contenga la siguiente línea:

vi /etc/mysql/my.cnf
dominio transporte
ejemplo.com smtp:[1.2.3.4]

Si tuvo que modificar /etc/mysql/my.cnf, reinicie MySQL ahora:

/etc/init.d/mysql restart

Ejecutar

netstat -tap | grep mysql

para asegurarse de que MySQL esté escuchando en 127.0.0.1 (localhost.localdomain):

[email protected]:~# netstat -tap | grep mysql
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      24970/mysqld   
[email protected]:~#

Ahora vamos a crear nuestros seis archivos de texto.

vi /etc/postfix/mysql-virtual_domains.cf
[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address           = 127.0.0.1
[...]
vi /etc/postfix/mysql-virtual_forwardings.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
vi /etc/postfix/mysql-virtual_mailboxes.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
vi /etc/postfix/mysql-virtual_email2email.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1
vi /etc/postfix/mysql-virtual_transports.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1
vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT transport FROM transport WHERE domain='%s'
hosts = 127.0.0.1

Luego cambie los permisos y el grupo de estos archivos:

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Ahora creamos un usuario y un grupo llamados vmail con el directorio de inicio /home/vmail. Aquí es donde se almacenarán todos los buzones de correo.

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

A continuación hacemos algo de configuración de Postfix. ¡Asegúrese de reemplazar server1.example.com con un FQDN válido, de lo contrario, su Postfix podría no funcionar correctamente!

postconf -e 'myhostname = server1.example.com'
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e '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'

Luego creamos el certificado SSL que se necesita para TLS:

cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Nombre del país (código de 2 letras) [AU]:<-- Ingrese el nombre de su país (por ejemplo, "DE").
Nombre del estado o provincia (nombre completo) [Algún estado]:<-- Ingrese su estado o Nombre de la provincia.
Nombre de la localidad (p. ej., ciudad) []:<-- Ingrese su ciudad.
Nombre de la organización (p. ej., empresa) [Internet Widgits Pty Ltd]:<-- Ingrese el nombre de su organización (p. ej., el nombre de su empresa).
Nombre de la unidad organizativa (p. ej., sección) []:<-- Ingrese el nombre de su unidad organizativa (p. ej., "Departamento de TI").
Nombre común (p. ej., SU nombre) []:<-- Ingrese el nombre de dominio completo del sistema (por ejemplo, "servidor1.ejemplo.com").
Dirección de correo electrónico []:<-- Ingrese su dirección de correo electrónico.

Luego cambie los permisos de smtpd.key:

chmod o= /etc/postfix/smtpd.key

6 Configurar Saslauthd

Primera ejecución

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

Luego edite /etc/default/saslauthd. Establezca START en sí y cambie la línea OPTIONS="-c -m /var/run/saslauthd" a OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r":

vi /etc/default/saslauthd
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT quota FROM users WHERE email='%s'
hosts = 127.0.0.1

Luego cree el archivo /etc/pam.d/smtp. Debe contener solo las siguientes dos líneas (asegúrese de completar los detalles correctos de su base de datos):

vi /etc/pam.d/smtp
#
# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian for details.
#

# Should saslauthd run automatically on startup? (default: no)
START=yes

# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Authentication Daemon"

# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd"

# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent  -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam       -- use PAM
# rimap     -- use a remote IMAP server
# shadow    -- use the local shadow password file
# sasldb    -- use the local sasldb database file
# ldap      -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"

# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""

# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5

# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# WARNING: DO NOT SPECIFY THE -d OPTION.
# The -d option will cause saslauthd to run in the foreground instead of as
# a daemon. This will PREVENT YOUR SYSTEM FROM BOOTING PROPERLY. If you wish
# to run saslauthd in debug mode, please run it by hand to be safe.
#
# See /usr/share/doc/sasl2-bin/README.Debian for Debian-specific information.
# See the saslauthd man page and the output of 'saslauthd -h' for general
# information about these options.
#
# Example for chroot Postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
# Example for non-chroot Postfix users: "-c -m /var/run/saslauthd"
#
# To know if your Postfix is running chroot, check /etc/postfix/master.cf.
# If it has the line "smtp inet n - y - - smtpd" or "smtp inet n - - - - smtpd"
# then your Postfix is running in a chroot.
# If it has the line "smtp inet n - n - - smtpd" then your Postfix is NOT
# running in a chroot.
#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

A continuación, cree el archivo /etc/postfix/sasl/smtpd.conf. Debería verse así:

vi /etc/postfix/sasl/smtpd.conf
auth    required   pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

A continuación, agregue el usuario de Postfix al grupo sasl (esto garantiza que Postfix tenga permiso para acceder a saslauthd):

adduser postfix sasl

Luego reinicie Postfix y Saslauthd:

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

7 Configurar mensajería

Ahora tenemos que decirle a Courier que debe autenticarse en nuestra base de datos MySQL. Primero, edite /etc/courier/authdaemonrc y cambie el valor de authmodulelist para que diga:

vi /etc/courier/authdaemonrc
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: select password from users where email = '%[email protected]%r'

Luego haga una copia de seguridad de /etc/courier/authmysqlrc y vacíe el archivo antiguo:

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc

Luego abra /etc/courier/authmysqlrc y coloque las siguientes líneas:

vi /etc/courier/authmysqlrc
[...]
authmodulelist="authmysql"
[...]

Durante la instalación, los certificados SSL para IMAP-SSL y POP3-SSL se crean con el nombre de host localhost. Para cambiar esto al nombre de host correcto (server1.example.com en este tutorial), elimine los certificados...

cd /etc/courier
rm -f /etc/courier/imapd.pem
rm -f /etc/courier/pop3d.pem

... y modifique los siguientes dos archivos; reemplace CN=localhost con CN=server1.example.com (también puede modificar los otros valores, si es necesario):

vi /etc/courier/imapd.cnf
MYSQL_SERVER localhost
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD mail_admin_password
MYSQL_PORT 0
MYSQL_DATABASE mail
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
vi /etc/courier/pop3d.cnf
[...]
CN=server1.example.com
[...]

Luego vuelva a crear los certificados...

mkimapdcert
mkpop3dcert

... y reinicie 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

Al correr

telnet localhost pop3

puede ver si su servidor POP3 está funcionando correctamente. Debería devolver +OK Hola. (Escriba quit para volver al shell de Linux).

[email protected]:/etc/courier# telnet localhost pop3
Probando ::1...
Conectado a localhost.localdomain.
El carácter de escape es '^]'.
+OK Hola.
<-- salir
+OK Mejor suerte la próxima vez.
Conexión cerrada por host externo.
[email protected]:/etc/courier#

8 Modificar /etc/aliases

Ahora deberíamos abrir /etc/aliases. Asegúrese de que postmaster apunte a root y root a su propio nombre de usuario o su dirección de correo electrónico, p. así:

vi /etc/aliases
[...]
CN=server1.example.com
[...]

o así (si el administrador es su propio nombre de usuario):

[...]
postmaster: root
root: [email protected]
[...]

Siempre que modifique /etc/aliases, debe ejecutar

newaliases

después y reinicie Postfix:

/etc/init.d/postfix restart

9 Instale amavisd-new, SpamAssassin y ClamAV

Para instalar amavisd-new, spamassassin y clamav, ejecute el siguiente comando:

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax

Posteriormente debemos configurar amavisd-new. La configuración se divide en varios archivos que residen en el directorio /etc/amavis/conf.d. Eche un vistazo a cada uno de ellos para familiarizarse con la configuración. La mayoría de las configuraciones están bien, sin embargo, debemos modificar tres archivos:

Primero debemos habilitar ClamAV y SpamAssassin en /etc/amavis/conf.d/15-content_filter_mode descomentando las líneas @bypass_virus_checks_maps y @bypass_spam_checks_maps:

vi /etc/amavis/conf.d/15-content_filter_mode

El archivo debería verse así:

[...]
postmaster: root
root:   administrator
[...]

Y luego debería echar un vistazo a la configuración de spam y las acciones para spam-/virus-mails en /etc/amavis/conf.d/20-debian_defaults. No es necesario cambiar nada si la configuración predeterminada le parece bien. El archivo contiene muchas explicaciones, por lo que no es necesario explicar la configuración aquí:

vi /etc/amavis/conf.d/20-debian_defaults
use strict;

# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.

#
# Default antivirus checking mode
# Please note, that anti-virus checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:


@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);


#
# Default SPAM checking mode
# Please note, that anti-spam checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:


@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

1;  # ensure a defined return

Finalmente, edite /etc/amavis/conf.d/50-user y agregue la línea $pax='pax'; en el medio:

vi /etc/amavis/conf.d/50-user
[...]
$QUARANTINEDIR = "$MYHOME/virusmails";
$quarantine_subdir_levels = 1; # enable quarantine dir hashing

$log_recip_templ = undef;    # disable by-recipient level-0 log entries
$DO_SYSLOG = 1;              # log via syslogd (preferred)
$syslog_ident = 'amavis';    # syslog ident tag, prepended to all messages
$syslog_facility = 'mail';
$syslog_priority = 'debug';  # switch to info to drop debug output, etc

$enable_db = 1;              # enable use of BerkeleyDB/libdb (SNMP and nanny)
$enable_global_cache = 1;    # enable use of libdb-based cache if $enable_db=1

$inet_socket_port = 10024;   # default listening socket

$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt  = 2.0;  # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 6.31; # triggers spam evasive actions
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent
[...]
$final_virus_destiny      = D_DISCARD;  # (data not lost, see virus quarantine)
$final_banned_destiny     = D_BOUNCE;   # D_REJECT when front-end MTA
$final_spam_destiny       = D_BOUNCE;
$final_bad_header_destiny = D_PASS;     # False-positive prone (for spam)
[...]

Luego, ejecute estos comandos para agregar el usuario clamav al grupo amavis y reiniciar amavisd-new y ClamAV:

adduser clamav amavis
/etc/init.d/amavis restart
/etc/init.d/clamav-freshclam restart
/etc/init.d/clamav-daemon restart

Ahora tenemos que configurar Postfix para canalizar el correo electrónico entrante a través de amavisd-new:

postconf -e 'content_filter = amavis:[127.0.0.1]:10024'
postconf -e 'receive_override_options = no_address_mappings'

Luego agregue las siguientes líneas a /etc/postfix/master.cf:

vi /etc/postfix/master.cf
use strict;

#
# Place your configuration directives here.  They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#
$pax='pax';

#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

Luego reinicie Postfix:

/etc/init.d/postfix restart

Ahora corre

netstat -tap

y debería ver Postfix (maestro) escuchando en el puerto 25 (smtp) y 10025, y amavisd-new en el puerto 10024:

[email protected]:/etc/courier# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:http                  *:*                     LISTEN      6134/apache2
tcp        0      0 *:ssh                   *:*                     LISTEN      610/sshd
tcp        0      0 *:smtp                  *:*                     LISTEN      23128/master
tcp        0      0 localhost.localdo:10024 *:*                     LISTEN      21937/amavisd-new (
tcp        0      0 localhost.localdo:10025 *:*                     LISTEN      23128/master
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      4308/mysqld
tcp        0     52 server1.example.com:ssh 192.168.0.206:57597     ESTABLISHED 976/0
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      610/sshd
tcp6       0      0 [::]:smtp               [::]:*                  LISTEN      23128/master
tcp6       0      0 [::]:imaps              [::]:*                  LISTEN      18191/couriertcpd
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN      18259/couriertcpd
tcp6       0      0 [::]:pop3               [::]:*                  LISTEN      18222/couriertcpd
tcp6       0      0 [::]:imap2              [::]:*                  LISTEN      18154/couriertcpd
[email protected]:/etc/courier#
 

10 Install Razor, Pyzor And DCC And Configure SpamAssassin

Razor, Pyzor and DCC are spamfilters that use a collaborative filtering network. To install Razor and Pyzor, run

apt-get install razor pyzor

DCC isn't available in the Ubuntu 13.10 repositories, so we install it as follows:

cd /tmp
wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z
tar xzvf dcc-dccproc.tar.Z
cd dcc-dccproc-1.3.1.154
./configure --with-uid=amavis
make
make install
chown -R amavis:amavis /var/dcc
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Now we have to tell SpamAssassin to use these three programs. Edit /etc/spamassassin/local.cf and add the following lines to it:

vi /etc/spamassassin/local.cf
[...]
amavis unix - - - - 2 smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes

127.0.0.1:10025 inet n - - - - smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks

Then we must enable the DCC plugin in SpamAssassin. Open /etc/spamassassin/v310.pre and uncomment the loadplugin Mail::SpamAssassin::Plugin::DCC line:

vi /etc/spamassassin/v310.pre
[...]
#dcc
use_dcc 1
dcc_path /usr/local/bin/dccproc

#pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor

#razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf

#bayes
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1

You can check your SpamAssassin configuration by executing:

spamassassin --lint

It shouldn't show any errors.

Restart amavisd-new afterwards:

/etc/init.d/amavis restart

Now we update our SpamAssassin rulesets as follows:

sa-update --no-gpg

We create a cron job so that the rulesets will be updated regularly. Run

crontab -e

to open the cron job editor. Create the following cron job:

[...]
# DCC - perform DCC message checks.
#
# DCC is disabled here because it is not open source.  See the DCC
# license for more details.
#
loadplugin Mail::SpamAssassin::Plugin::DCC
[...]

This will update the rulesets every second day at 4.23h.


Ubuntu
  1. Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Ubuntu 14.04LTS)

  2. Alojamiento virtual con Proftpd y MySQL (incluida la cuota) en Ubuntu 14.04LTS

  3. Usuarios virtuales y dominios con Postfix, Courier y MySQL (Ubuntu 6.10 Edgy Eft)

  4. Usuarios virtuales y dominios con Sendmail

  5. Servidor de correo con usuarios y dominios virtuales usando Postfix y Dovecot en un CentOS 6 VPS

Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Ubuntu 12.10)

Alojamiento virtual con vsftpd y MySQL en Ubuntu 12.10

Alojamiento virtual con Proftpd y MySQL (incluida la cuota) en Ubuntu 12.10

Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Debian Wheezy)

Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (CentOS 6.3 x86_64)

Usuarios virtuales y dominios con Postfix, Courier, MySQL y SquirrelMail (Fedora 18 x86_64)

    23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null