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!