miércoles, 12 de noviembre de 2014

Servidor Mail Seguro parte IV

Chequeadores de contenido (Anti Spam & Anti Virus)

 Esta cuarta parte de la guía pretende instalar y configurar en nuestro servidor de correo (Que ya debería contar con MySQL para usuarios virtuales, Postfix como agente de correo y Courier como servicio de IMAP) el anti virus ClamAV, las medidas de protección contra spam SpamAssassin y Postgrey y la gestión e implementación en el servidor por parte de Amavisd.

Amavis:

 Vamos a empezar con Amavisd que permitirá interaccionar a nuestro agente de correo con las herramientas de seguridad dentro de nuestro servidor. Es decir, permitirá transportar el correo de un servicio a otro y canalizarlo después para dejarlo en nuestros buzones de correo.
sudo apt-get install amavisd-new
 La configuración por defecto en Ubuntu nos vale perfectamente así que nos limitaremos a leer su documentación para entender cómo funciona y echaremos un vistazo sus opciones predefinidas con un cat:
cd /etc/amavis/conf.d/
 En este directorio podemos ver archivo por archivo la configuración de Amavis pero en principio, nos valen los valores tal como están. Sólo uno de ellos será modificado:
sudo nano /etc/amavisd/50-user
 Añadimos antes de las 2 lineas finales:
@local_domains_acl = qw(.);
$log_level = 2;
$syslog_priority = 'debug';
$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 = 8.0; # triggers spam evasive actions
# $sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent
$final_spam_destiny = D_PASS;
# $final_spam_destiny = D_REJECT; # default
# $final_spam_destiny = D_BOUNCE; # debian default
# $final_spam_destiny = D_DISCARD; # ubuntu default, recommended as sender is usually faked
 Ahora hemos de permitir a Amavis el acceso a los correos para que pueda chequearlos así que nos vamos a reconfigurar Postfix:
sudo nano /etc/postfix/master.cf
 Añadimos las siguientes líneas al final del archivo. Antes conviene asegurarse de que no estén ya presentes. ¡Ojo! Antes de las opciones -o existen dos espacios.
amavis  unix    -       -       -       -       2       smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20

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_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
 En el mismo archivo buscamos el servicio pickup y añadimos dos líneas, quedándose así:
pickup    unix  n       -       -       60      1       pickup
  -o content_filter=
  -o receive_override_options=no_header_body_checks
 En el otro archivo de configuración de Postfix:
sudo nano /etc/postfix/main.cf
 Añadimos la siguiente línea:

content_filter = amavis:[127.0.0.1]:10024
 Con esta configuración Amavis debería poder tener acceso al correo. Antes de activar el anti virus y el anti spam deberíamos probar que realmente lo tiene. Primero reiniciamos el servicio con un sudo /etc/init.d/amavis restart Ahora hemos de enviar un correo al servidor y buscar en los logs que amavis cumple su función. Recomiendo seguir el Anexo I, en concreto la prueba para ver si Postfix recibe correo conectándonos por telnet y después comprobar syslog con un:
cat /var/log/syslog | grep 'amavisd-new, port 10024'

 Si aparece algún resultado, es que Amavis está recibiendo el correo para su chequeo. Si todo va bien, el paso siguiente es activar las opciones del anti virus y del anti spam en su configuración.
sudo nano /etc/amavis/conf.d/15-content_filter_mode

 Dónde quitaremos el comentario de las siguientes líneas dejándolo como sigue:
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Si ya hemos hecho la comprobación de funcionamiento de Amavis y todo va como debe, podemos proceder a bajar el nivel de registro que alteramos anteriormente:
sudo nano /etc/amavis/conf.d/50-user
 El bloque de configuración que añadimos casi al final cambiará a éste:
@local_domains_acl = qw(.);
$log_level = 1;
$syslog_priority = 'info';
#$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 = 8.0; # triggers spam evasive actions
# $sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent
#$final_spam_destiny = D_PASS;
# $final_spam_destiny = D_REJECT; # default
# $final_spam_destiny = D_BOUNCE; # debian default
 $final_spam_destiny = D_DISCARD; # ubuntu default, recommended as sender is usually faked
 Hemos terminado con Amavis. Reiniciamos servicio y pasamos a lo siguiente:
sudo /etc/init.d/amavis restart

SpamAssassin:

 SpamAssassin, como su nombre indica, cumple la misión de identificar y eliminar gestionar por nosotros el correo no deseado. Procedemos a instalarlo con:
sudo apt-get install spamassassin spamc
 La configuración por defecto, una vez más, está bien para empezar y si no deseamos rompernos demasiado la cabeza, la dejaremos tal cual. No obstante, si alguien quiere ir más allá recomiendo un vistazo a su documentación y a la página web del proyecto que he enlazado arriba.
 Vamos a configurarlo para que arranque al inicio.
sudo nano /etc/default/spamassassin
 Dónde cambiamos ENABLED para dejarlo como sigue:

ENABLED=1

 

ClamAV:

 ClamAV será nuestro anti virus. Comprobará que nuestros correos estan limpios de malware y otras amenazas (Claro está, en la medida que puede hacerlo un anti virus). Instalamos:
sudo apt-get install clamav clamav-base libclamav6 clamav-daemon clamav-freshclam
 ClamAv tampoco necesitas grandes cambios. Podemos ver su configuración en /etc/clamav/ pero en principio será más por curiosidad. Freshclam en cambio quizá necesite un pequeño ajuste. Es el servicio que se encarga de la actualización de la base de datos de virus y por defecto viene configurado para hacerlo una vez cada hora (24 por día) lo cual es algo excesivo.
sudo dpkg-reconfigure clamav-freshclam
 Esta línea nos llevará a un asistente de configuración en el que podremos cambiar la tasa a 1 así como elegir un servidor cercano y definir las opciones de conexión.

 Si estamos animados y con ganas quizá interese usar el asistente de configuración de clam-base para definir opciones pero no es necesario:
sudo dpkg-reconfigure clamav-base
 Vamos a añadir el usuario clamav a Amavis para que pueda escanear los ficheros temporales.
sudo adduser clamav amavis
 Con esto está todo. Seguimos con Postgrey.

Postgrey:

Postgrey  es una pequeña herramienta que nos ayudará a evitar correo no deseado con el simple acto de retener los correos entrantes de remitentes no conocidos durante 5 minutos. Normalmente, los servidores de correo legítimo reintentarán mandar el correo unas cuantas veces antes de devolver un error, cosa que en un servidor de envío masivo de spam que genera de manera automática las direcciones de remite falsificadas o usa enormes listas de direcciones, no ocurrirá. Esto puede tener el inconveniente de que quizá ciertos correos de confirmación de alta o similares se retrasen un poco pero es un precio muy bajo por mantener lejos el spam.
sudo apt-get install postgrey
 Dejamos la configuración por defecto y nos vamos a Postfix para añadir normas de interacción con esta nueva herramienta:
sudo nano /etc/postfix/main.cf
 Y ahí buscamos la linea recipient_restrictions y la dejamos como sigue (Una única línea):
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
 Listo.

 Ahora disponemos de un servidor de correo electrónico avanzado que comprueba los correos en busca de amenazas o spam. No está mal, pero falta algo. A mi juicio lo más importante, el cifrado y la autenticación. En el siguiente post hablaremos sobre ello. Por ahora recomiendo comprobar que todo funciona como debe antes de seguir y dar tiempo a que venga el próximo...
¡Saludos!

miércoles, 5 de noviembre de 2014

Servidor Mail Seguro Anexo I

Posibles errores y soluciones

 Es conveniente, en diversos puntos de la guía, pararnos a comprobar el funcionamiento de lo que tenemos configurado hasta el momento, y se hace imprescindible poner todo a prueba antes de abrir los puertos que permitan el acceso público a nuestro servidor. En este apartado vamos a probar el correcto funcionamiento de cada parte de los componentes de nuestro servidor de correo electrónico y las formas de revisar los registros del sistema  en caso de fallos, que nos den pistas sobre la posible causa del error.

 Primero vamos a reiniciar los servicios para que los cambios de configuración surtan efecto:
sudo /etc/init.d/mysql restart
sudo /etc/init.d/postfix restart
sudo /etc/init.d/courier-imap-ssl restart
sudo /etc/init.d/courier-imap restart
sudo /etc/init.d/courier-authdaemon restart

Crear un usuario para las pruebas en la base de datos.

Si venimos de la parte III del manual, todavía no hemos creado ningún usuario virtual, así que, difícilmente vamos a poder poner a prueba nuestro servidor. Vamos a crear un usuario, sea cual sea, que bien nos puede servir solo para probar lo que llevamos hecho hasta ahora y lo eliminaremos cuando hayamos concluido el manual, o bien se puede hacer algo más que un corta y pega, y crear el vuestro propio y definitivo. Vamos a ello.
 Nos conectamos a la base de datos de nuestro servidor:
mysql -u mail -p maildb
 Nos identificamos con la contraseña del usuarios creado para realizar las consultas e introducimos el siguiente código que generará un dominio virtual correspondiente a nuestro propio dominio de internet. Sobra decir que tudominio.com ha de ser una dirección de dominio real.
INSERT INTO domains (domain) VALUES
('tudominio.com');
 Para el usuario 'test' con contraseña 'test1234'
INSERT INTO users (id,name,maildir,crypt) VALUES
('test@tudominio.com','test','test/',encrypt('test1234', CONCAT('$5$', MD5(RAND()))) );
  Y para terminar, creamos entradas en la table de aliases.
INSERT INTO aliases (mail,destination) VALUES
('pruebas@tudominio.com','test@tudominio.com'),
('test@tudominio.com','test@tudominio.com');
 Con aliases, en la primera entrada de la tabla, hemos enlazado la dirección pruebas@tudominio.com con la dirección del usuario test. La segunda entrada es para que se dé como final la dirección test@tudominio.com

 Recuerda que para ver las tablas se usa el comando describe seguido del nombre de la tabla a mostrar. Para eliminar una entrada se usa; DELETE FROM seguido del nombre de la tabla WHERE y la condición, es decir,  columna = fila. Por ejemplo: DELETE FROM  users WHERE name = 'test'

 Con esto queda configurado el usuario de prueba. Lo recordaré al final de la guía pero no está de más hacerlo aquí también. Si has usado el nombre de usuario y la contraseña del ejemplo,
NO OLVIDES ELIMINAR LA ENTRADA EN LA TABLA ANTES DE EXPONER EL SERVIDOR A INTERNET.

Comprobando el funcionamiento del servidor MTA (Postfix):

 ¿Puede Postfix recibir correo? Esto es lo primero que vamos a averiguar. Para ello nos vamos a servir de Telnet, que nos permitirá realizar una conexión manual al puerto de escucha SMTP.
telnet localhost 25

 Si todo va bien, el servidor nos contestará con el código 220 seguido de su nombre y el prompt quedará esperando nuestra respuesta:
chaosnet@lamula:~$ telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 lamula.thedarknode.es ESMTP Postfix (Ubuntu)
# Introducimos el saludo
EHLO lamula.thedarknode.es
250-lamula.thedarknode.es
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
# La respuesta anterior del servidor puede variar según lo que
# tengamos configurado hasta ahora.
# Ahora indicamos al servidor que queremos dejar un correo e indicamos
# su dirección de origen. No tiene por qué ser real para las pruebas.
MAIL FROM: <test@dominiodeprueba.com>                                  
250 2.1.0 Ok
# Si todo va bien nos devolverá un Ok y seguiremos con la dirección de destino
RCPT TO: <chaosnet@thedarknode.es>
250 2.1.5 Ok
# Otro Ok nos sirve para pasar al comando para dar el contenido del mensaje.
data
354 End data with <CR><LF>.<CR><LF>
# Escribimos en cuerpo y salimos con una linea de un solo punto
Esto es una prueba de recepción de correo para nuestro servidor Postfix.
Visita http://blog.thedarknode.es !!
.
250 2.0.0 Ok: queued as 2629A581177
# Tras un nuevo Ok indicándonos que el mensaje a sido aceptado y puesto
# en cola, cerramos la conexión con un;
quit
221 2.0.0 Bye
Connection closed by foreign host.
chaosnet@lamula:~$
 Esto, si lo acompañamos en otra terminal de un
tail -f -n 30 /var/log/mail.log
 Y abrimos una tercera para:
tail -f -n 30 /var/log/mysql/mysql.log
 Nos debería bastar para ver los errores que pudiese haber en nuestra configuración.

 ¿Puede Postfix enviar correo? Vamos a comprobarlo:
chaosnet@lamula:~$ telnet localhost 25
...
Connected to localhost.
Escape character is '^]'.
220 lamula.thedarknode.es ESMTP Postfix (Ubuntu)
EHLO lamula.thedarknode.es
250-lamula.thedarknode.es
250-PIPELINING
...
# Aquí esta vez damos una dirección válida en nuestro servidor
MAIL FROM: <chaosnet@thedarknode.es>
250 2.1.0 Ok
# Y aquí dejamos una dirección en internet a la que tengamos acceso
RCPT TO: <mail@real.com>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Esto es una prueba de envio de correo para nuestro servidor Postfix.
Visita http://blog.thedarknode.es !!
.
250 2.0.0 Ok: queued as 85EE2581189
quit
221 2.0.0 Bye
Connection closed by foreign host.
 Comprobando el registro de /var/log/mail.log y nuestra cuenta de correo a la que enviamos el mensaje, verificaremos si hay errores y cuales son.

Comprobando Courier.

Antes de proceder con esta comprobación tenemos que estar seguros de que Postix puede enviar y recibir correo correctamente. Si ya lo has comprobado, procedemos a enviar una conexión telnet al puerto IMAP 143.
chaosnet@lamula:~$ telnet localhost 143
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc.  See COPYING for distribution information.
 Si la salida es parecida a esa, el demonio está escuchando de manera correcta, de lo contrario habría que revisar los logs.

 El resto ha de ser probado por un cliente de correo externo cuando se abra el servidor a internet.

 Si existe algún problema que no saben resolver, recomiendo en primer lugar repasar la configuración en busca de pasos omitidos o errores tipográficos.

Saludos y hasta la próxima.

Servidor Mail Seguro parte III

Servidor IMAP

 Continuando con ésta guía para montar nuestro propio servidor de correo seguro cara a internet, y habiendo ya configurado MySQL para montar nuestra base de datos de usuarios y dominios virtuales en la primera parte, y configurado Postfix con su módulo MySQL en la segunda, pasamos a instalar y configurar Courier como servidor IMAP.
 Internet Message Access Protocol (IMAP, Protocolo de acceso a mensajes de internet) es un protocolo que nos permitirá acceder de manera remota o local a nuestros buzones de correo y de esta manera gestionar con un cliente (Thunderbird, Zimbra, Balsa, Evolution... (Sí, tambien Outlook, malditos)) nuestras carpetas de recibidos y enviados.
 El servicio que se encargará de esta tarea será Courier. Lo instalaremos junto con su demonio de autenticación y su plugin para MySQL.
sudo apt-get install courier-base courier-authdaemon courier-authlib-mysql courier-imap courier-imap-ssl courier-ssl
 Cuando nos pregunte sobre dividir la configuración en sub-directorios le diremos que no e inmediatamente después obviaremos el mensaje de configuración SSL aceptándolo.
 Procedemos a editar el archivo de configuración del demonio de autenticación:
sudo nano /etc/courier/authdaemonrc
 Y cambiamos la cambiamos la variable authmodelist:
authmodulelist="authmysql"
 Además, como medida temporal, habilitaremos los logs del demonio a nivel 2 para facilitarnos la depuración en caso de futuros errores que pudiesen aparecer.
DEBUG_LOGIN=2
 Ahora vamos a asegurar que la lista de authmysql esté bien configurada:
sudo nano /etc/courier/authmysqlrc
 Aquí debemos buscar los campos que acreditan al demonio a consultar la base de datos que creamos anteriormente en MySQL:
MYSQL_SERVER localhost
MYSQL_USERNAME mail
MYSQL_PASSWORD mailPASS # Contraseña que establecimos para el
# usuario mail en MySQL
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE maildb
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD crypt
#MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD id
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat(home,'/',maildir)
MYSQL_WHERE_CLAUSE enabled=1
 Por lo general, en Ubuntu solo necesitaremos cambiar las variables MYSQL_USERNAME y MYSQL_PASSWORD.
 Con esto ya tendríamos un servidor de correo simple perfectamente configurado. No obstante es poco o nada seguro ya que no usa cifrados para comunicarse ni le hemos implementado medidas anti-spam ni anti-virus.
 Si se desea, se le puede echar un vistazo al archivo /etc/courier/imapd para comprobar su configuración. No obstante, éste no requiere ningún cambio.

 Llegados a este punto, nos debemos plantear el probar el funcionamiento del servidor, antes de continuar con las implementaciones más avanzadas. Para hoy mismo, si no me surge ningún imprevisto, crearé un anexo a esta guía para implementar un usuario, dominio y alias virtual en nuestra base de datos y poner a prueba la emisión, recepción y autenticación en Postfix y Courier.
 La próxima entrada nos meteremos con temas de configuración un poco más avanzada que implementará los chequeadores de contenido, es decir, el anti-spam y el anti-virus.

 Saludos y ya sabéis, para cualquier duda o corrección, a comentar.

martes, 4 de noviembre de 2014

Servidor Mail Seguro parte II

 Continuando con la guía comenzada en el post anterior para montar un servidor de correo sobre TLS con usuarios virtuales, seguridad anti-spam y anti-virus, hoy le toca a la configuración del MTA o Mail Transport Agent que traducido del inglés, se entiende como la capa de transporte del correo.
 El programa que utilizaremos como MTA será Postfix, y ejecutará las labores de dirigir tanto el correo entrante como el saliente a otros servicios que autentiquen el usuario y dirección y finalmente y si procede, a la carpeta que almacenará nuestro correo o a internet buscando el servidor de destino en caso de ser correo saliente. Postfix (http://www.postfix.org/) es un servidor de correo electrónico open source originalmente escrito por Wietse Venema en febrero de 2001 y que ya va por la versión 2.10. Es más rápido, seguro y fácil de administrar que su competidor en sistemas Linux, Sendmail.
 Para realizar la instalación y la de los módulos que permitirán su interacción con la base de datos MySQL que tratamos en el anterior post ejecutaremos es siguiente comando en el servidor Ubuntu.


sudo apt-get install postfix postfix-mysql

 El prompt cambiará y nos mostrará un dialogo en el que elegiremos "sitio de internet" como tipo de servidor y a continuación escogeremos el nombre del servidor (que no del dominio), normalmente el de nuestro host.
 Ahora empezamos a configurar postfix. Crearemos un archivo en /etc/mailname que contendrá el nombre del servidor de correo (en mi caso smpt.thedarknode.es).

sudo nano /etc/mailname

 Escribimos en la primera linea el nombre del servidor, salimos con CTRL+X y guardamos. Comenzaremos ahora con el archivo principal de configuración de Postfix ubicado en /etc/postfix/main.cf :

sudo nano /etc/postfix/main.cf

 En este archivo cambiaremos varias lineas y otras estarán configuradas de serie en nuevas versiones, por si a caso, mejor asegurarse:

# La siguiente linea se comenta ya que por defecto Postfix buscará en nombre
# del servidor en el archivo /etc/mailname
#myhostname = mail.example.com

En la opción "smtpd_banner" podemos editar el texto de bienvenida que dará el servidor a las conexiones. Por defecto Ubuntu muestra una cadena compuesta por el nombre del host y en nombre del servidor mail seguido de "(Ubuntu)" Conviene no especificar demasiada información en este campo a fin de dificultar la labor de recopilación de información por posibles hackers. Con esta línea es suficiente:

smtpd_banner = $myhostname ESMTP $mail_name

 La  siguiente linea corresponde al origen anexado en los correos. Este puede ser un nombre completo o un nombre de dominio:

#myorigin = /etc/mailname
myorigin = tudominio.com

 Para seguir primero necesitamos hacer una pequeña elección. Se trata de quén va a sacar los correos salientes, es decir, si usarás un servidor SMTP externo o será Postfix el encargado de hacerlo. Usar un servidor externo hace que tu correo no sea marcado como spam por listas negras ya que muchas no dejan que las IPs dinámicas actúen como servidores. Además el servidor tendrá menos trabajo. Por otra parte, enviaro nosotros mismos nuestro correo hace que nuestro servidor no dependa de terceras partes con lo que aumentamos el grado de privacidad. De todos modos, aquí solo reflejaré la linea para indicar a postfix que él se encargará del correo saliente. Para usar un ISP externo, basta con añadir la dirección de éste en la siguiente variable:

relayhost =


 Vamos con los detalles de la red. Estas líneas le dicen a Postfix que va a escuchar en cualquier interfaz de red, confiar solo en localhost y tratar exclusivamente con protocolo IPv4.

inet_interfaces = all
mynetworks_style = host
inet_protocols=ipv4

 En cuanto al correo saliente, la siguiente opción, permite enmascarar las direcciones de salida. Normalmente no queremos que la dirección de envio que sale de nuestro servidor sea el nombre completo de un host (mail.ejemplo.com o www.ejemplo.es) y las lineas siguientes permiten una lista de direcciones que serán enmascaradas con el nombre del dominio exclusivamente. La segunda trata las excepciones:

masquerade_domains = mail.ejemplo.es smtp.ejemplo.es www.ejemplo.es
masquerade_exceptions = root

 Como vamos a usar usuarios y dominios virtuales, las siguientes lineas han de estar como siguen:

mydestination =
local_recipient_maps =

 Ahora procedemos a cambiar una serie de parámetros:

# Cuánto tiempo si hay no entregados antes de enviar la actualización
# de advertencia al remitente
delay_warning_time = 4h
# Tipo de error, temporal o permanente
unknown_local_recipient_reject_code = 450
# Cuanto tiempo en la cola antes de entregar mensaje fallido.
maximal_queue_lifetime = 7d
# Tiempo max y min en seg entre reintentos si la conexión falla
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
# Cuanto tiempo de espera de helo antes de recibir el resto de datos
smtp_helo_timeout = 60s
# Límite de direcciones que pueden ser usadas en un mensaje.
# efectivo parando spammers masivos y copias accidentales de listas
smtpd_recipient_limit = 16
# Cuantos errores antes de retroceder.
smtpd_soft_error_limit = 3
# Cuántos errores antes de bloquear.
smtpd_hard_error_limit = 12

 Alguna restricción más. Cuidado con las lineas enteras.

# Requirements for the HELO statement
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit
# Requirements for the sender details
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
# Requirements for the connecting server
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl
# Requirement for the recipient address
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
smtpd_data_restrictions = reject_unauth_pipelining
# require proper helo at connections
smtpd_helo_required = yes
# waste spammers time before rejecting them
smtpd_delay_reject = yes
disable_vrfy_command = yes

 Ahora la configuración para las consultas y los mapas de aliases y dominios virtuales:

alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
# Esto especifica donde están los directorios de los buzones virtuales
virtual_mailbox_base = /var/spool/mail/virtual
# Localización de los buzones para cada usuario
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf
# Alias virtuales
virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
# domain lookups
virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
# UID y GID para los archivos de correo creados
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

 Salimos de Nano y guardamos main.conf . Ahora vamos a copiar el archivo aliases desde /etc/ .

sudo cp /etc/aliases /etc/postfix /etc/postfix/aliases

sudo postalias /etc/postfix/aliases

  Vamos a crear las carpetas y gestionar los permisos de éstas para los buzones de correo, también añadiremos un usuario y un grupo al sistema que se encargará de copiar y manejar archivos, llamado virtual:

sudo mkdir /var/spool/mail/virtual
sudo groupadd --system virtual -g 5000
sudo useradd --system virtual -u 5000 -g 5000
sudo chown -R virtual:virtual /var/spool/mail/virtual

Configuración MySQL para Postfix.

 Tal como le indicamos a postfix para resolver los dominios y alias virtuales, ahora tenemos que crear unos archivos con datos de conexión a MySQL que le permitan acceder a nuestras bases de datos. Son tres ficheros, uno para los buzones (mysql_mailbox.cf) otro para alias (mysql_alias.cf) y el último para dominios (mysql_domains.cf).

sudo nano /etc/postfix/mysql_mailbox.cf

user=mail # Nombre del usuario mysql que creamos anteriormente
password=mailPASS #Su password
dbname=maildb
table=users
select_field=maildir
where_field=id
hosts=127.0.0.1
additional_conditions = and enabled = 1

sudo nano /etc/postfix/mysql_alias.cf

user=mail
password=mailPASS
dbname=maildb
table=aliases
select_field=destination
where_field=mail
hosts=127.0.0.1
additional_conditions = and enabled = 1

sudo nano /etc/postfix/mysql_domains.cf

user=mail
password=mailPASS
dbname=maildb
table=domains
select_field=domain
where_field=domain
hosts=127.0.0.1
additional_conditions = and enabled = 1
 Con esto concluye, de momento al menos, la configuración de Postfix. Para el siguiente post empezaremos con el servidor POP/IMAP.
 Un saludo y para cualquier cosita, a comentar se ha dicho.

miércoles, 29 de octubre de 2014

Servidor Mail Seguro parte I

Puesto que hoy me he visto ante un kernel panic! mental creo que voy a redactar una entrada que hace tiempo tenía en mente. Hoy, gracias a la ayuda de flurdy.com voy a escribir (algunas partes traducir meramente) una extensa y detallada guía sobre cómo montar un servidor de correo seguro utilizando usuarios virtuales con Postfix como MTA, Courier como servidor IMAP, MySQL como base de datos, Amavisd-new como chequeador de contenido, SpamAssassin como escudo anti-spam, ClamAV como antivirus, Cyrus SASL como autenticador, PostGrey como pequeño script anti-spam, TLS como encriptación y SquirrelMail como cliente de webmail. ¿Completito no? Pues ahí que vamos: Antes de nada, obvia decir que como todo en este blog, corre sobre sistemas Linux y esta guía más en concreto está pensada para funcionar sobre Ubuntu Server y testada en la versión 12.04. MySQL: Lo primero de todo será instalar y configurar la base de datos que nos permita guardar y facilite las consultas hacia los usuarios, sus direcciones mail en el servidor, así como sus datos de acceso, dominios virtuales, etc.
sudo apt-get install mysql-client mysql-server
Esto, tras autenticarnos con la contraseña de superusuario, instalará tanto el cliente como el servidor de MySQL. Ahora hemos de configurar un usuario que accederá a la base de datos para realizar las consultas. No es para nada recomendable que éste sea root por motivos de seguridad así que procederemos a crear un usuario con nombre "mail" y accesos restringidos a nuestras tablas. Luego crearemos la base de datos que contendrá lo necesario para los usuarios virtuales. Toma nota del nombre de usuario que agregues como mail así como de su contraseña. Para ejecutar éste código será necesaria la contraseña de root que se dió durante la instalación del servidor de MySQL.
# Si aún no lo hemos hecho (durante la instalación del paquete)...
mysqladmin -u root -p password new_password
# Nos loggeamos como root
mysql -u root -p
# Luego introducimos la contraseña de root cuando el prompt sea Enter password:
# Ahora creamos la base de datos
create database maildb;
# Creamos un nuevo usuario: "mail" y le damos acceso y privilegios
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON maildb.* TO 'mail'@'localhost' IDENTIFIED by 'mailPASSWORD';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON maildb.* TO 'mail'@'%' IDENTIFIED by 'mailPASSWORD';
exit;
Sobra decir que donde "mailPASSWORD" ha de ir vuestra contraseña. Lo siguiente será crear nuevas tablas. En esta guía usaremos éstas: - aliases - domain - users Nos logeamos con el nuevo usuario:
mysql -u mail -p maildb
# Ingresamos la contraseña recién creada
Y ejecutamos los siguientes comandos para crear las tablas.
CREATE TABLE `aliases` (
'pkid' smallint(3) NOT NULL auto_increment,
'mail' varchar(120) NOT NULL default '',
'destination' varchar(120) NOT NULL default '',
'enabled' tinyint(1) NOT NULL default '1',
PRIMARY KEY ('pkid'),
UNIQUE KEY 'mail' ('mail') ) ;
CREATE TABLE `domains` (
`pkid` smallint(6) NOT NULL auto_increment,
`domain` varchar(120) NOT NULL default '',
`transport` varchar(120) NOT NULL default 'virtual:',
`enabled` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`pkid`) ) ;
CREATE TABLE `users` (
`id` varchar(128) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`uid` smallint(5) unsigned NOT NULL default '5000',
`gid` smallint(5) unsigned NOT NULL default '5000',
`home` varchar(255) NOT NULL default '/var/spool/mail/virtual',
`maildir` varchar(255) NOT NULL default 'blah/',
`enabled` tinyint(1) NOT NULL default '1',
`change_password` tinyint(1) NOT NULL default '1',
`clear` varchar(128) NOT NULL default 'ChangeMe',
`crypt` varchar(128) NOT NULL default 'sdtrusfX0Jj66',
`quota` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`) ) ;
# Para ver las tablas creadas:
describe aliases;
describe domains;
describe users;
# salimos de mysql
exit;
Lo siguiente, antes de terminar, por ahora, con MySQL, será hacer una pequeña comprobación. Creo que en las nuevas versiones del paquete viene por defecto, pero no está de más comprobarlo.
sudo nano /etc/mysql/my.cnf
Comprobaremos que existe una linea que enlace al localhost:
bind-address = 127.0.0.1
Es muy recomendable para empezar habilitar temporalmente los logs de MySQL para un posible análisis en caso de que algo no marche bien. Esta medida es solo temporal y una vez todo esté funcionando se debe comentar para evitar una saturación en los logs del sistema.
general_log_file = /var/log/mysql/mysql.log
general_log = 1
Ahora rearrancamos MySQL:
sudo /etc/init.d/mysql restart
Como todas las entradas de código que veais por la web me gustaría recalcar que es vital saber lo que se está haciendo con cada instrucción. Aquí dejo un enlace a "La Biblia de MySQL" Un libro bastante completo sobre el tema de la ed Anaya. Mañana me pongo con la configuración del agente de transporte de mail, Postfix. Un saludo!

jueves, 5 de junio de 2014

Reset The Net

Contra la vigilancia masiva en internet:
Reset The Net https://www.resetthenet.org/





Por cierto, estoy en proceso de mundanza. No he abandonado el proyecto de hacer mi web y ya he redirigido los DNS del dominio a mi servidor que me vale para las diversas pruebas que ando haciendo. Aún queda mucho por hacer para que el sitio esté operativo, lo mayor acabará siendo alquilar un hosting... Tiempo al tiempo.