Restringir el acceso a las cuentas de correo electrónico mediante la dirección IP

octubre 10th, 2014 by admin
  • catalan
  • spanish

En este artículo nos centraremos en proteger el acceso a las cuentas de correo electrónico restringiendo por la dirección IP. En este caso, estamos usando Dovecot con MySQL. Este método es especialmente útil si queremos permitir el acceso a una cuenta de correo electrónico a una sola dirección IP o si por el contrario, queremos bloquear el acceso a una determinada dirección IP debido al SPAM.

Antes de empezar, será necesario tener instalado Dovecot con usuarios virtuales mediante MySQL (en este caso, con ISPConfig 3). Si no utilizais ISPConfig 3 será necesario revisar la tabla de la base de datos y/o los nombres de las columnas en las consultas.

Primero pues, vamos a crear una tabla en la base de datos del servidor de correo donde almacenaremos las restricciones. En este ejemplo utilizaremos la base de datos de ISPConfig 3 (dbispconfig).
Abrimos la consola de MySQL:

mysql -u root -D dbispconfig -p

Creamos la tabla de restricciones:

CREATE TABLE mail_user_ip_restriction (
restriction_id INT(11) UNSIGNED NOT NULL auto_increment,
mailuser_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
ip VARCHAR(50) NOT NULL DEFAULT '',
mode ENUM('w','b') NOT NULL DEFAULT 'w',
service VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY (`restriction_id`),
KEY `ident` (`mailuser_id`, `mode`, `service`, `ip`)
) ENGINE=MyISAM;

Ahora hay que modificar el archivo de configuración SQL de Dovecot (en nuestro caso /etc/dovecot/dovecot-sql.conf). Modificaremos estas dos líneas:

password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n'
user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n'

Por estas dos:

password_query = SELECT m.password FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL
user_query = SELECT m.email as user, m.maildir as home, CONCAT('maildir:', m.maildir, '/Maildir') as mail, m.uid, m.gid, CONCAT('*:storage=', m.quota, 'B') AS quota_rule, CONCAT(m.maildir, '/.sieve') as sieve FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL

Una vez modificado el archivo de configuración de Dovecot, hay que reiniciar el servicio:

service dovecot restart

O dependiendo del sistema:

/etc/init.d/dovecot restart

Verificamos que en el registro del servidor de correo o del sistema no haya habido errores. En caso de que los haya, revisaremos las modificaciones antes de continuar.

Cómo bloquear una dirección IP

Para evitar que una determinada dirección IP tenga acceso a una cuenta de correo electrónico hay que añadirla a la tabla de restricciones como tipo “b“. Necesitaremos primero el mailuser_id de la cuenta de correo electrónico. Para consultarlo, ejecutaremos este código:

SELECT `mailuser_id` FROM `mail_user` WHERE `email` = 'mail@quequeremosproteger.com';

El sistema nos devolverá un valor, “10” por ejemplo. Así pues, la consulta que enviaremos a la base de datos podría ser:

INSERT INTO `mail_user_ip_restriction` VALUES (NULL, 10, '123.234.123.234', 'b', '');

En este caso, estamos bloqueando el acceso a la IP 123.234.123.234 a la cuenta 10, o lo que es lo mismo, a mail@quequeremosproteger.com. El último valor es el servicio que queremos bloquear y en este caso, poniendo “”, incluimos POP3, IMAP y SMTP. Se pueden añadir cuantas restricciones se quieran. Por ejemplo, si queremos bloquear el acceso IMAP a la cuenta de correo electrónico pero permitir POP3 y SMTP, pondríamos:

INSERT INTO `mail_user_ip_restriction` VALUES (NULL, 10, '123.234.123.234', 'b', 'imap');

Cómo limitar el acceso a una determinada dirección IP

Los ejemplos anteriores son más adecuados para evitar que ciertos clientes, como por ejemplo spammers, accedan a nuestro servidor. Por el contrario, quizás nos interese restringir el acceso a una determinada dirección IP, bloqueando el resto. En este caso, sólo la IP introducida tendrá acceso al servicio que indiquemos. Tan sólo hay que sustituir la “b” por “w“.

INSERT INTO `mail_user_ip_restriction` VALUES (NULL, 10, '123.234.123.234', 'w', 'pop3');
INSERT INTO `mail_user_ip_restriction` VALUES (NULL, 10, '123.234.123.235', 'w', 'smtp');

Con estas dos órdenes, estamos indicando que para esta cuenta de correo electrónico:

  1. Sólo la dirección IP 213.234.123.234 tiene acceso al servicio POP3.
  2. Sólo la dirección IP 123.234.123.235 tiene acceso al servicio SMTP.
  3. Cualquier IP tiene acceso al servicio IMAP.

Caso real

Imaginemos que tenemos una tienda online que utiliza una cuenta de correo electrónico. Queremos evitar que nadie más pueda enviar correos con esta cuenta pero queremos permitir el acceso para poder leer los mensajes que nos envíen los clientes, pero sólo por POP3. Suponiendo que la dirección IP del servidor fuera 10.0.0.101 y 123 el mailuser_id de la cuenta de correo electrónico, deberíamos introducir lo siguiente:

INSERT INTO `mail_user_ip_restriction` VALUES (NULL, 123, '10.0.0.101', 'w', 'smtp');
INSERT INTO `mail_user_ip_restriction` VALUES (NULL, 123, 'none', 'w', 'imap');

Con estas dos órdenes, indicamos que queremos permitir el acceso SMTP a la dirección IP 10.0.0.101 y que queremos evitar que nadie pueda acceder por IMAP. Al no especificar nada sobre POP3, estamos indicando que cualquiera tendrá acceso.

Si el servidor o el cliente tienen IPv6 además de IPv4, deberemos añadir entradas para ambas.

Artículo basado en la documentación incluida aquí: http://www.howtoforge.com/improve_spam_abuse_protection_in_dovecot_by_restricting_access_to_mail_accounts_by_ip


0 Responses to this post

  1. No Comments

Leave a Response