E-mail Linux amb Docker

De Cacauet Wiki
Salta a la navegació Salta a la cerca

#FpInfor #Asix #AsixMp08 #AsixMp08Uf3 #AsixMp08Uf03 #Smx #SmxMp07 #SmxMp07Uf2 #SmxMp07Uf02


Introducció

El servei de correu electrònic és força complexe ja que es composa de diversos processos o daemons. A part del típic servei de MTA (postfix, sendmail, etc.) ens cal també un servei de Fetchmail (Courier, Dovecot), antivirus, anti-spam, etc., a part de configurar els certificats i modes d'autenticació encriptada.

El sistema de contenidors Docker ens facilita tota aquesta posada en marxa del servei. Bé, en concret Docker solament no, sinó algú que s'ha currat el sistema de correu complert i n'ha fet una versió dockeritzada. Per poder fer aquesta pràctica cal que estiguis fortament familiaritzat amb Docker.

Farem aquesta pràctica en una màquina virtual Amazon AWS EC2. Si no has treballat amb elles mira't l'article AWS: Amazon Web Services. Això és per diversos motius:

  • Necessitem una IP fixa (les dinàmiques estan en una blacklist i els grans servidors com gmail o hotmail no ens permetran enviar-los emails). Les elastic IPs de AWS ens ho permetran.
  • Els instituts solen tenir limitades les connexions sortints de correu per evitar els spammers i accions de segons quins virus.


Posta en marxa del docker

Prerequists: docker-compose

En Ubuntu existeix el package docker-compose, però és una versió antiga i necessitem la versió més actual.

Instal·la la darrera versió seguint aquestes explicacions:

https://docs.docker.com/compose/install/

Prerequisits: MX records

El correu electrònic utilitza els registres MX, enlloc dels habituals registres A en el nostre DNS server (del registrador del domini).

Ves, doncs, al panell de control del teu registrador (.com o .tk) i crea un registre MX. Et demanarà que el reenviis cap a un domini definit en un registre A prèviament creat. Típicament la gent sol fer un registre A amb mail.elmeudomini.com i el MX sense subdomini el reenvia a aquest.

Explorant imatges de Docker

Per veure quines opcions tenim podem executar:

$ docker search mail

A mi m'ha funcionat prou bé la versió de Thomas Vial, que és la 1a que surt a la llista amb força "stars" (aka "likes"). Podeu trobar el codi aquí per tafanejar-lo:

https://github.com/tomav/docker-mailserver

Posta en marxa del mailserver

Caldrà que coneguis docker-composer per posar en marxa el docker-mailserver.

Segueix les instruccions que explica el desenvolupador en el README.

IMPORTANT: modifiqueu els següents paràmetres del docker-compose.yml

  1. Deshabiliteu el mòdul FAIL2BAN, ja que per fer proves ens pot molestar. És un mòdul molt útil que prohibeix les IPs que fallen en la autenticació diverses vegades. Molt interessant per seguretat, però pot fastidiar-nos les proves. Canvieu la variable d'entorn:
       - ENABLE_FAIL2BAN=0
  2. Poseu els 2 volums mailstate i maildata com a directoris locals. És convenient per diversos motius:
    • Permet fer persistents els arxius amb els correus dels usuaris
    • Triga menys a arrencar el contenidor (ha de regenerar menys arxius)

Creant comptes

Abans que el nostre servidor sigui operatiu caldrà crear diversos comptes d'usuari. Per fer-los consulta el README del docker.

Recorda que pots crear comptes de diferents dominis, fes-ne al menys de 2 dominis diferents.


Activant memòria virtual

Per algunes aplicacions podríem necessitar memòria virtual o swap, però les màquines EC2 inicialment no en porten. És el cas del docker-mailserver. El sistema pot fallar si no tenim prou RAM, 1 GB és molt just per a algunes aplicacions.

Com explica aquest issue, el spamd i/o el clamav fallen si tenim poca RAM.

Utilitza aquest tutorial per afegir memòria virtual a un EC2.

Amb 1 GB n'hi ha prou, no afegiu més pq el disc dur és petit (8 GB) i si ens passem podem saturar-lo i fer que la màquina funcioni malament.


Accedint des de clients

Test amb TELNET

Podem enviar un missatge al nostre servidor, sempre i quan el destinatari sigui alguna bústia interna. Proveu d'accedir al port 25 del vostre servidor de forma externa, i feu un email tal i com explica l'apartat "SMTP transport example" de l'aritcle sobre SMTP de la Vikipèdia.

D'aquesta manera podreu veure una mica més en detall com funcionen els internals del SMTP.

Proveu també d'enviar un email a una adreça externa, i mostra a l'informe quin error et dona.

Proveu també de fer el mateix des del propi servidor. Veureu que feu el telnet des de localhost podreu enviar emails on vulgueu, i no només a les adreces internes.

Accedint via IMAPS

Configura una aplicació client d'email (com Outlook, Thunderbird, etc.) per a accedir al teu servidor i llegir els correus via IMAPS. Es recomana fer-ho des d'una aplicació de correu per al mòbil, en concret Bluemail és força bona.

Abans de res cal obrir els ports del servidor 993, 25, 587. Per testejar si el vostre servidor és accessible es recomana la comanda linux nmap per veure quins ports teniu oberts, per ex:

$ nmap jolgorio.tk

Starting Nmap 7.01 ( https://nmap.org ) at 2017-02-15 20:30 CET
Nmap scan report for jolgorio.tk (54.229.49.51)
Host is up (0.024s latency).
rDNS record for 54.229.49.51: ec2-54-229-49-51.eu-west-1.compute.amazonaws.com
Not shown: 992 filtered ports
PORT     STATE  SERVICE
22/tcp   open   ssh
25/tcp   open   smtp
80/tcp   open   http
443/tcp  open   https
465/tcp  closed smtps
587/tcp  open   submission
993/tcp  open   imaps
8081/tcp closed blackice-icecap

Nmap done: 1 IP address (1 host up) scanned in 5.26 seconds

És important accedir a través de la versió segura (IMAPS al port 993 i no al IMAP - port 143) per permetre la confidencialitat de la transferència de dades.

Tingues en compte que al no tenir els certificats no la validació del SSL no serà correcta. Cal configurar la utilització del SSL sense verificació dels certificats.

Resumint, la configuració del vostre client seria:

  • Correu entrant: IMAPS, port 993, SSL, Contrasenya simple, ometre comprovació de certificats
  • Correu sortint: SMTPS, port 587, STARTTLS, Contrasenya simple, ometre comprovació de certificats

Webmail

Busca una imatge Docker d'un software de webmail, instal·la-la en el teu servidor i configura-la perquè es connecti al servidor de correu que hem realitzat fins ara.

Per alguns d'aquests softwares més sofisticats (com Roundcube) caldrà que instal·lis també una base de dades MySQL (guarda configuracions de la interfície, preferències d'usuari, etc.). Altres més senzills potser no la necessiten.

Aquesta versió del Roundcube està muntada amb sqlite i no necessita tant setup com en el altres casos (per lligar-la amb mysql es fa més feixuc). L'únic inconvenient és que els settings desapareixen si reiniciem el contenidor, però pot ser un mal menor:

https://hub.docker.com/r/robbertkl/roundcube/

Si l'instal·leu a un VPS com el de Amazon AWS, us trobareu que haureu de publicar un port per veure el webmail. Però clar, accedir al nostre correu a través, per exemple de http://elmeudomini.com:9000 fa lleig. Solució:

  1. Utilitzar un túnel SSH per accedir-hi i depurar el funcionament del webmail.
  2. Visualitzar el roundcube en una URL principal (o sigui, del port 80 del domini). Tenim varies opcions:
    • Activar el mòdul de proxy invers del Apache per visualitzar el webmail en una altra adreça com:
      http://elmeudomini.com/webmail
    • Fer un virtual server en un subdomini per accedir al webmail, per exemple:
      http://webmail.elmeudomini.com

En ambdós casos us caldrà activar el mòdul de proxy invers i connectar-se per túnel per depurar. Aquest article ho explica (és pel Tomcat, però us servirà de forma molt similar).

Per tal que el container del Roundcube funcioni, caldrà ajustar les següents variables (si ho feu amb docker-compose va tal qual, sense cometes; si ho feu des de docker a seques, cal que poseu cometes simples en l'argument, per ex.'ssl://mail'):

ROUNDCUBE_DEFAULT_HOST=ssl://mail
ROUNDCUBE_DEFAULT_PORT=993
ROUNDCUBE_SMTP_SERVER=tls://mail
ROUNDCUBE_SMTP_PORT=587

Si, a més, voleu poder controlar els filtres d'email des del Roundcube, haureu de configurar:

ROUNDCUBE_MANAGESIEVE_HOST=mail
ROUNDCUBE_MANAGESIEVE_USETLS=true


Tunejant el servidor

Per acabar de fer un sistema competent, necessitarem diversos ajustos:

  • Familiaritza't amb AMAVIS, el software que gestiona el antivirus i el anti-spam (spamassassin):
    https://help.ubuntu.com/community/PostfixAmavisNew
  • Millora la detecció del anti-spam amb aquests consells:
    http://linux.kieser.net/salearn.html


Seguretat en servei de correu electrònic

La seguretat del nostre servei gira entorn de 3 eixos principals:

  1. Exploits: si el nostre servei és "petable" (per un bug o alguna operació maliciosa que explota una debilitat) el nostre sistema es pot fer vulnerable a intrusions. Per combatre això convé:
    • Estar a la darrera versió del sistema operatiu (al menys en el parxes de seguretat) i del servei que fem servir.
    • Utilitzar docker per aïllar parts del sistema. Si el procés de correu és vulnerable, una possible intrusió només podrà accedir als arxius de correu, i no a altres serveis.
  2. Virus: l'email és una gran porta d'entrada al sistema. Poden entrar virus i usuaris incautes poden introduir-los involuntàriament en el sistema. Calen diverses eines:
    • Antivirus servidor: Clam / Amavis (incloses al docker-mailserver)
    • Antivirus PC client: Avast, Panda, .
  3. SPAM: el maldecap més gran per a la implantació d'un servidor de correu. Ens calen 2 tipus d'eines:
    • SpamAssassin : ens permet filtrar els spam a la nostra inbox (inclòs al docker-mailserver). Sol aprendre sol en base a algorismes heurístics, però té algunes comandes per "ensenyar-lo" i apuntar-li quins son els autèntics SPAM. Tenir un honeypot sol ser interessant pel bon funcionament del server.
    • Sistemes de signatura per validació i reputació del nostre servidor de correu

Signatura, autenticitat i reputació dels nostres emails

El SPAM (correu no sol·licitat o correu brossa) és una de les grans dificultats per desplegar un servidor d'email. Al ser un sistema obert, on tothom pot enviar a qualsevol adreça, el perill de tenir la inbox inundada i fer el servei inutilitzable obliga a algun tipus de protecció per tal que el sistema sigui usable pels usuaris finals.

Els grans proveidors de comptes de correu (Google, Hotmail, Yahoo) van idear certes mesures per assegurar l'origen dels emails, i impedir que qualsevol pugues enviar un email amb qualsevol remitent (cosa que d'entrada era i segueix sent possible). D'aquests sistemes, en destaquem aquests 3:

  • DKIM: bàsicament consisteix en signar tots els emails amb una clau privada, i presentar la clau pública al servidor DNS.
  • DMARC
  • SPF: similar a DKIM, inclourem certa informació als registres TXT del DNS, però en aquest cas per associar unes IPs concretes des de les que serà vàlid enviar els correus del nostre domini.

Aquests mecanismes permeten als sistemes destinataris identificar si el correu que li arriba és bo. Si no quadra, la probabilitat de que sigui SPAM és molt alta i el filtra cap a la spam box.

Pel docker-mailserver farem:

Comprovant la nostra reputació

Utilitza aquesta eina per saber si has configurat correctament els diferents sistemes de signatura i validació d'autenticitat dels nostres emails.

https://www.mail-tester.com/


Ampliacions possibles

Si amb això no has tingut prou:

  1. Activa el protocol POP3 i comprova-ho amb un client.
  2. Activa FAIL2BAN tal i com s'explica a la web del contenidor, i comprova que funciona.
    • Per defecte FAIL2BAN et baneja la teva IP durant 8 hores si falles 3 cops consecutius en un login.
    • Modifica FAIL2BAN per canviar el paràmetre dels 3 errors i fer que siguin 10.
  3. Utilitzant TELNET:
    • Envia un email amb autenticació via SMTP + STARTSSL.
    • Accedeix a llegir els missatges via IMAP sense encriptació.
    • Accedeix a llegir els missatges via POP3 sense encriptació.
  4. Troba la manera de canviar dinàmicament la contrasenya dels usuaris que tens al teu sistema dockeritzat. Algunes possibilitats:
    • Explora la configuració amb un servidor LDAP. Pot ser-te d'utilitat l'article Servidor LDAP en Debian/Ubuntu
    • Pots intentar fer-ho "a pèl":
      • Investiga com fer-ho des de la pròpia línia de comandes del contenidor.
      • Fes un script per canviar la contrasenya d'un usuari de forma interactiva.
      • Fes una pàgina web que permeti modificar la contrasenya d'un compte.
  5. Prova el mateix que hem fet fins ara per la creació o eliminació de comptes de forma dinàmica.
  6. Investiga com fer un servidor "catch-all". Aquest issue del mateix creador del docker-mailserver et servirà.
  7. El servidor d'email té un mòdul per fer filtres d'emails anomenat SIEVE. El podem habilitar fent:
    • Activant el MANAGESIEVE del mailserver
    • Configurar el Roundcube com a interfície per a crear i editar els filtres del server. Caldrà afegir alguna variable d'entorn del Roundcube per activar-lo.
  8. Testeja l'antivirus Clamav.


Troubleshooting

Et poden donar problemes diverses coses:

  • Memòria virtual del servidor: si no la tens activada, és fàcil que l'antivirus del mailserver-docker peti i deixi de funcionar tot plegat. Consulta com afegir swap al teu AWS.
  • FAIL2BAN : el mòdul et prohibeix connectar-te a la teva màquina si ha fallat l'autenticació. Deshabilita FAIL2BAN en la conf del mailserver-docker
  • Paràmetres del client :
  • Emails van a SPAM: comprova la carpeta de spam del correu del destinatari, és molt fàcil que els envii allà.
  • Ports del teu servidor tancats: vigila els security-groups del teu AWS