25 Lab5 Casa

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 14

Laboratorio 5

Sistema de Correo Electrónico


Completo y Seguro
Parte 1

Software a Utilizar

• OS: Ubuntu Linux


• MTA: Postfix
• POP/IMAP:Courier IMAP
• DBMS:MySQL
• Content Check: Amavisd-new
• Anti-Spam: SpamAssassin
• Anti-Virus: ClamAV
• Autenticación: Cyrus SASL, PostGrey
• Encriptación: TLS
• WebMail: SquirrelMail o Roundcube
• Plataforma: Local, Servidor remoto, VPS, Cloud

Antes de empezar

Para asegurarnos de que no existan problemas con las configuraciones del anterior laboratorio,
debemos desinstalar (purgar) todo lo realizado anteriormente y eso incluye la base de datos.

sudo apt-get purge postfix mailutils courier-pop courier-imap mysql-server

Instalación y configuración del core

MySQL
Para instalar:
sudo apt-get install mysql-client mysql-server

Ahora configuramos el servidor de Base de Datos

Debemos crear primero un usario de MySQL exclusivo para el email, despues la base de datos. No
se olviden que en la instalación, se les pidio un password de root, no se olviden ese password.
En caso de olvidarse el password de la instalación
mysqladmin -u root -p password new_password
Entren al DBMS
mysql -u root -p
Pongan el password de root
Enter password:

Ahora creamos la base de datos del correo


create database maildb;

Ahora creamos el usuario: "mail"


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;
No se olviden, reemplazar mailPASSWORD por un password para mail que sea diferente al de root

Ahora se necesitan crear las siguientes tablas:


• aliases
• domains
• users

Vuelvan a entrer a mysql, pero esta vez como el usuario mail


mysql -u mail -p maildb
Con el password de ese usuario
Enter password:

Ahora hagan lo siguiente 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(3) unsigned NOT NULL default '1',
`change_password` tinyint(3) unsigned NOT NULL default '1',
`clear` varchar(128) NOT NULL default 'ChangeMe',
`crypt` varchar(128) NOT NULL default 'sdtrusfX0Jj66',
`quota` varchar(255) NOT NULL default '',
`procmailrc` varchar(128) NOT NULL default '',
`spamassassinrc` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
);

Las últimas lineas no son obligatorias, pero sirven mucho si despues esta Base de Datos se linkeará
con otra o será extendida.

Para ver las tablas creadas:


describe aliases; describe domains; describe users;
Ahora salgan de mysql
exit;

Ahora debemos modificar el archivo my.cnf de MySQL:


nano vi /etc/mysql/my.cnf
Modificamos de forma tal que se vea igual a lo siguiente:
bind-address = 127.0.0.1

Habilitamos el Log de las llamadas a SQL:


general_log_file = /var/log/mysql/mysql.log
general_log = 1

Para una implementación de producción, es recomendable deshabilitar esas lineas unas 2 o 3


semanas despues de las pruebas, solo nos sirven para hacer troubleshooting, ya que si las dejamos
indefinidamente, MySQL se puede volver lento.

Reinicien MySQL para verificar que todo este bien


sudo /etc/init.d/mysql restart

MTA - Postfix
Para instalar
sudo apt-get install postfix postfix-mysql
Ya saben como configurar el momento de la instalación, así que elijan sitio de Internet (Internet
site) y pogan el nombre correcto, el que tienen configurado en su servidor DNS (anterior
laboratorio).

Para poner en producción o pruebas de rendimiento/stress (despues), lo mejor es nombrar o poner el


nombre del servidor en este archivo
sudo nano /etc/mailname
Entonces debería ser mail.minombre.net, el mismo que configuramos en el DNS.

Ahora haremos las configuraciones, no mediante postconf, sino mas bien editaremos el archivo
como tal:
sudo nano /etc/postfix/main.cf
Todo lo que modifiquemos debe quedar así:
Especifiquen el nombre de su servidor, el mismo que esta en su DNS así como en /etc/mailname
#myhostname= mail.minombre.net

Ahora el origen del nombre, es decir, el nombre completo del server o del domino.
# myorigin=/etc/mailname
myorigin=minombre.net
Ahora deben decidir el saludo del servidor (postfix)
smtpd_banner = $myhostname ESMTP $mail_name

Dejen vacio, ya que NO utilizaremos un relay


relayhost =
NOTA.- (Si utilizaramos un relay, por ejemplo el de nuestro ISP, debemos configurarlo, pero
NO PARA ESTE LABORATORIO
relayhost = smtp.yourisp.com )

Ahora debemos configurar los detalles de la red.


inet_interfaces = all
mynetworks_style = host

Ahora enmascararemos la dirección de salida, es decir, no queremos que el


[email protected] sea el que mande los correos, sino la dirección de origen aparezca
como [email protected]
masquerade_domains = mail.minombre.net
# masquerade_exceptions = root

Como utilizaremos virtual domains, esto debe estar vacio.


local_recipient_maps =
mydestination =

Modificaremos algunos números.

delay_warning_time = 4h
unknown_local_recipient_reject_code = 450
maximal_queue_lifetime = 7d
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
smtp_helo_timeout = 60s
smtpd_recipient_limit = 16
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 12
Ahora podemos especificar algunas restricciones. Tengan mucho cuidado ya que cada opción es de
una sola linea.
# Requerimientos para el HELO statement
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname,
reject_invalid_hostname, permit
# Requerimientos de detalles del remitente
smtpd_sender_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_sender,
reject_unknown_sender_domain, reject_unauth_pipelining, permit
# Requerimiento del servidor que se conecta
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org,
reject_rbl_client blackholes.easynet.nl
# Requerimientos de la dirección de destino
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks,
reject_non_fqdn_recipient, reject_unknown_recipient_domain,
reject_unauth_destination, permit
smtpd_data_restrictions = reject_unauth_pipelining
Algunas otras restricciones:
# requerimiento de un correcto helo en las conecciones
smtpd_helo_required = yes
# Desperdicio de tiempo para spammers antes de rechazarlos
smtpd_delay_reject = yes
disable_vrfy_command = yes
Debemos realizar algunos maps & lookups para los dominios virtuales.
# local aliasing
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
# virtual mailbox folders location
virtual_mailbox_base = /var/spool/mail/virtual
# mailbox location (para cada usuario)
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf
# y para los aliases
virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
# y para los domain lookups
virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
# this is how to connect to the domains (all virtual, but the option is there)
# not used yet
# transport_maps = mysql:/etc/postfix/mysql_transport.cf
Añadan esto para el owner virtual :
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

Es necesario crear un file para el alias, este es utilizado de forma local.


sudo cp /etc/aliases /etc/postfix/aliases
# revisen que este bien, en especial el ultimo que puede ser un alias de root a una persona
sudo postalias /etc/postfix/aliases

Debemos crear un directorio donde todo el correo sea guardado, es posible que se haya creado al
momento de la instalación (apt-get). Pero mejor lo hacemos y de paso creamos el usuario que será
dueño de los directorios.
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 de Postfix-MySQL
Debemos configurar los archivos que nos darán acceso a los lookups via la base de datos. Por el
momento solo configuraremos algunas opciones, si son necesarias otras, lo haremos después:

Editen o creen el siguiente archivo


sudo nano /etc/postfix/mysql_mailbox.cf
user=mail
password=mailPASSWORD
dbname=maildb
table=users
select_field=maildir
where_field=id
hosts=127.0.0.1
additional_conditions = and enabled = 1

Creen el archivo para encontrar el email alias:


sudo nano /etc/postfix/mysql_alias.cf
user=mail
password=mailPASSWORD
dbname=maildb
table=aliases
select_field=destination
where_field=mail
hosts=127.0.0.1
additional_conditions = and enabled = 1

Creen el archivo para encontrar los dominios:


sudo nano /etc/postfix/mysql_domains.cf
user=mail
password=mailPASSWORD
dbname=maildb
table=domains
select_field=domain
where_field=domain
hosts=127.0.0.1
additional_conditions = and enabled = 1

Pop/IMAP - Courier IMAP


Instalamos:
sudo apt-get install courier-base courier-authdaemon courier-authlib-mysql courier-imap
courier-imap-ssl courier-ssl

Les pedira webdirectories, diganle que NO. Tambien les pedira un certificado, ignorenlo.

Hacemos las configuraciones:


sudo nano /etc/courier/authdaemonrc

Todo debe estar como lo descrito a continuación:


authmodulelist="authmysql"
DEBUG_LOGIN=2

sudo nano /etc/courier/authmysqlrc


#Cambiamos el usuario y su password
MYSQL_USERNAME mail
MYSQL_PASSWORD mailPASSWORD
# Cambiamos la base de datos
MYSQL_DATABASE maildb
# las tablas de usuario
MYSQL_USER_TABLE users
Mantenemos encriptado el password
MYSQL_CRYPT_PWFIELD crypt
# MYSQL_CLEAR_PWFIELD clear
#añadimos el maildir
MYSQL_MAILDIR_FIELD concat(home,'/',maildir)
# añadimos el where clause
MYSQL_WHERE_CLAUSE enabled=1

Pueden ver el archivo imapd, pero NO realicen cambios:


cat /etc/courier/imapd

Añadan usuarios y dominios (virtuales)

Tenemos un servidor configurado, pero nos faltan usuarios y dominios.


Entonces lo primero que se debe hacer es añadir data por defecto, es data necesaria y que tiene
sentido.
Despues añadiran sus propios dominios.

Dominios requeridos y usuarios para el correo local


Pueden hacerlo por linea de ordenes o mejor por phpMyAdmin (sudo apt-get install phpmyadmin)
INSERT INTO domains (domain) VALUES
('localhost'),
('localhost.localdomain');

Ahora insertamos algunos aliases por defecto, muchos textos indican que no son necesarios, pero
para tener un mejor control sobre los servicios brindados y poner el email real es mejor tenerlos.
INSERT INTO aliases (mail,destination) VALUES
('postmaster@localhost','root@localhost'),
('sysadmin@localhost','root@localhost'),
('webmaster@localhost','root@localhost'),
('abuse@localhost','root@localhost'),
('root@localhost','root@localhost'),
('@localhost','root@localhost'),
('@localhost.localdomain','@localhost');
Ahora creamos un usuario root
INSERT INTO users (id,name,maildir,crypt) VALUES
('root@localhost','root','root/',encrypt('apassword', CONCAT('$5$',
MD5(RAND()))) );
NOTA: esta orden utiliza la función encrypt con un salto randomico por usuario y con un prefijo
$5$ que indica el uso del algoritmo de hasheo SHA-256.

Ya es tiempo de añadir data adecuada para usuarios y dominios, por ejemplo en este servidor tienen
dominios funcionales como ser "minombre.net", "whopper.nu" y "lala.com".
Entonces, el nombre del servidor es "mail.minombre.net"

Todo el correo enviado a lala.com será reenviado a whupper.nu.


INSERT INTO domains (domain) VALUES
('minombre.net'),
('mail.minombre.net'),
('whopper.nu'),
('lala.com');

INSERT INTO aliases (mail,destination) VALUES


('@lala.com','@whupper.nu'),
('@mail.minombre.net','@minombre.net'),
('[email protected]','postmaster@localhost'),
('[email protected]','abuse@localhost'),
('[email protected]','postmaster@localhost'),
('[email protected]','abuse@localhost');

Entonces, tenemos dos usuarios "Xandros" y "Vivita".


INSERT INTO users (id,name,maildir,crypt) VALUES
('[email protected]','xandros','xandros/',encrypt('apassword', CONCAT('$5$',
MD5(RAND()))) ),
('[email protected]','vivita','vivita/', encrypt('anotherpassword', CONCAT('$5$',
MD5(RAND()))) );

INSERT INTO aliases (mail,destination) VALUES


('[email protected]','[email protected]'),
('[email protected]','[email protected]');
Queremos hacer que todo el correo de whooper.nu vaya a xandros (catchall).
INSERT INTO aliases (mail,destination) VALUES
('@whopper.nu','[email protected]');

Tambien está el usuario "Carlos", pero este usuario quiere que todo su correo llegue a una cuenta
externa en gmail
INSERT INTO aliases (mail,destination) VALUES
('[email protected]','[email protected]');

Entonces, que hacen todas las lineas que creamos?, los dominios no necesitan explicación, los
usuarios es algo sencillo, solo tienen 4 campos. ID es el correo del usuario y su username para el
login. NAME es opcional y es una descripción extra del usuario. MAILDIR es el nombre del
directorio dentro /var/spool/mail/virtual. Debe terminar en un /, de otra manera no podrá ser
utilizado como el formato de unix maildir. CRYPT es el texto encriptado para el password.
Ahora explicaremos un poco como funcionan los alias:
Imaginen que llega un email a "[email protected]".
Postfix revisa sus dominios y dice que whopper.nu es un dominio al que escucha.
Postfix entonces revisas sus aliases y revisa una columna donde encuentre a "[email protected]".
Si no hay nada, entonces lo proximo a hacer es buscar por "@whopper.nu", que es una forma de
especificar “atrapar todos los de ESE dominio” (catch all).
Encuentra una fila y su destino es "[email protected]".
Entonces busca por "[email protected]" y encuentra uno, cuyo destino es el mismo email,
entonces ese es su destino final.
Es ahi que intenta entregar el correo. La busqueda dice minombre.net es un correo local, entonces
busca los usuarios con la id solicitada y entrega el correo a su maildir.

Ahora que pasa si llega un correo para "[email protected]".


Postfix busca el dominio y es un dominio al que escucha.
La primer busqueda NO encuentra al usuario, pero la siguiente encuentra el catchall "@lala.com".
Pero el destino es otro catchall, "@minombre.net".
Esto significa que Postfix buscará por "[email protected]". Esta dirección tampoco es encontrada
y no existe un catchall para minombre.net. Entonces, esta dirección NO es valida y el mensaje es
rebotado (bounced).

Finalmente, el otro escenario, cualquier correo para "[email protected]" o "[email protected]",


es reenviado a una dirección externa "[email protected]". El reenvio es simple y el mail
se envia al servidor de gmail.com.
Tambien se añadieron los aliases postmaster y abuse de minombre.net y whopper.nu. El catchall de
lala.com significa que los aliases no son necesarios para ese dominio.
Otro alias importante es root, ya que por lo general se necesitan los correos de admin de por
ejemplo los cron jobs del servidor, etc. Otros aliases muy utilizados en organizaciones son info,
sysadmin, soporte, ventas, webmaster, mail, contacto, correo y otros más, pero los mismos son
dulce para spam (como se vio en clases) así que sólo pongan los necesarios.

Ya tienen un servidor de correo básico con conexión a base de datos.

Antes de seguir, hagan las pruebas de funcionamiento:

Postfix puede recibir correo?

Revisen que MySQL y Postfix esten corriendo.

Intentemos enviar un mensaje a [email protected] (o utilicen postmaster@localhost) desde


[email protected] (reemplacen con una dirección real de correo electrónico que NO este
asociada a este servidor, por ejemplo de gmail.)
telnet localhost 25
EHLO mail.minombre.net
>250-mail.minombre.net
>250-PIPELINING
>....
>....
MAIL FROM: <[email protected]>
> 250 Ok
RCPT TO: <[email protected]>
> 250 Ok
data
> 354 End data with <CR><LF>.<CR><LF></LF></CR></LF></CR>
# ingresen el mensaje y terminen con .
Prueba llegada
blah
.
> 250 Ok; queued as QWKJDKASAS
# cierren conexión
quit
> 221 BYE
Entonces en otra consola, mientras hacen lo anterior, lancen una tail al /var/log/mail.log y verán en
tiempo real toda la actividad, incluso los errores si existen estos.
Tambien en una tercera consola, hagan un tail de /var/log/mysql/mysql.log y debería existir
actividad, caso contrario algo anda mal.
Si ven algun error o NO actividad lo que es peor, lean bien lo que dice el log y hagan la corrección.

Si no tuvieron errores y ven que se crea el directorio /var/mail/virtual/xandros entonces el sistema


SI puede recibir correos.

Postfix puede enviar correos?


Una vez que sabemos que recibimos emails, entonces debemos ver que enviamos.

telnet localhost 25

EHLO mail.minombre.net
>250-mail.minombre.net
>250-PIPELINING
>....
>....
MAIL FROM: <[email protected]>
> 250 Ok
# Ahora, envien el mail a una cuenta externa, por ejemplo gmail, etc
RCPT TO: <[email protected]>
> 250 Ok
data
> 354 End data with <CR><LF>.<CR><LF></LF></CR></LF></CR>
# Ingeren el mensaje entero y terminen con .
Prueba
blah blah blah
y blah
.
> 250 Ok; queued as QWKJDKASAS
quit
> 221 BYE
Deberían ver algo similar a esto en el log de /var/log/mail.log

Mar 17 10:25:45 servername postfix/smtp[12345]: 12345678: to=<[email protected]>,


relay=127.0.0.1[127.0.0.1]:10024,
delay=15, delays=15/0.01/0.02/0.11, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=12345-09, from
MTA([127.0.0.1]:10025):
250 2.0.0 Ok: queued as 1234567)

Si es así el envio funciona, entonces entren a Internet. Revisen su correo y ahí debe estar.

Por favor muestren este avance antes de continuar.

También podría gustarte