Cicle formatiu: CFGM Sistemes Microinformàtics i Xarxes (SMX) / CFGS Administració de sistemes informàtics en xarxa (ASIX)
Mòdul: 0226 — Seguretat Informàtica / 0227 - Serveis de xarxa / 0375 - Serveis de xarxa i Internet
Sistema operatiu: Ubuntu Server 26.04 LTS
El protocol SMTP, dissenyat als anys 80, no verifica qui envia
realment un correu: qualsevol servidor pot afirmar que envia en nom de
qualsevol domini, sense cap comprovació. Això fa possible el
spoofing (suplantar un remitent) i el phishing: un
atacant pot enviar-te un correu que sembli venir del teu banc o de la
teva empresa sense tenir-hi cap relació real — per exemple, un missatge
que sembli venir de banc@elteubanc.com sense que el banc hi
tingui res a veure.
L’autenticació de correu (SPF, DKIM i DMARC) tanca aquest forat: verifica que el servidor emissor estigui autoritzat, que el missatge no s’hagi alterat pel camí, i defineix què fer si alguna comprovació falla. Sense això, els destinataris no tenen cap manera fiable de distingir correu legítim de suplantat.
SPF (Sender Policy Framework) és un mecanisme que permet a un domini de correu dir, públicament i verificable, “aquestes són les úniques màquines autoritzades a enviar correu en el meu nom”. Ho fa publicant un registre TXT al DNS del domini amb la llista d’IPs/servidors autoritzats; el destinatari, en rebre un correu, consulta aquest registre i comprova si la IP d’origen hi coincideix.
SPF només verifica la IP del servidor emissor, no el contingut ni la identitat real de qui ha escrit el correu — per això sol combinar-se amb DKIM (signatura criptogràfica del missatge) i DMARC (la política que uneix tots dos i li diu al destinatari què fer si algun falla). Els tres junts formen l’estàndard actual d’autenticació de correu.
DKIM (DomainKeys Identified Mail) permet a un domini remitent signar criptogràficament els seus missatges de sortida, perquè el destinatari pugui verificar dues coses:
- Que el correu realment prové del domini que diu (autenticitat)
- Que el contingut no s’ha modificat pel camí (integritat)
A diferència de l’SPF (que només comprova la IP del servidor), DKIM verifica el missatge en si mateix, cosa que el fa més robust.
Es basa en criptografia de clau pública/privada, igual que un certificat TLS:
El servidor de correu genera un parell de claus: una privada (secreta, es queda al servidor) i una pública (es publica al DNS).
Quan surt un correu, el servidor el signa amb la clau privada, generant un hash xifrat d’algunes capçaleres i del cos del missatge. Aquesta signatura s’afegeix com una capçalera nova al correu:
DKIM-Signature: v=1; a=rsa-sha256; d=thos.local; s=mail; ...; b=Kj3f9s...El destinatari (Gmail, per exemple) rep el correu, consulta al DNS la clau pública del domini remitent (a
mail._domainkey.thos.local), i amb ella desxifra i comprova que la signatura coincideix amb el contingut real del missatge.Si coincideix → el correu no s’ha tocat pel camí i realment prové d’algú amb accés a la clau privada d’aquest domini (és a dir, el servidor legítim).
| Terme | Significat |
|---|---|
Selector (s=mail) |
Un nom arbitrari que identifica quina clau concreta s’ha fet servir (útil si tens diverses claus o vols rotar-les sense trencar res) |
Domini (d=thos.local) |
El domini que reivindica haver enviat el correu |
| Clau privada | Es queda al servidor (per exemple, mail.private), mai
es comparteix |
| Clau pública | Es publica com a registre TXT al DNS: mail._domainkey.thos.local |
| SPF | DKIM | |
|---|---|---|
| Què verifica | La IP del servidor emissor | El contingut i l’autenticitat del missatge |
| Es trenca si… | El correu es reenvia des d’un altre servidor | El contingut es modifica pel camí (per exemple, un servidor intermedi hi afegeix una capçalera) |
| Mecanisme | Consulta DNS simple | Criptografia de clau pública |
Fer servir tots dos junts (i sovint DMARC per sobre) és el que dona una protecció real contra la suplantació — cadascun cobreix un vector d’atac diferent que l’altre no cobreix.
DMARC (Domain-based Message Authentication, Reporting & Conformance) és el mecanisme que uneix SPF i DKIM sota una política única, i li diu al destinatari (Gmail, Outlook, etc.) què ha de fer exactament si un correu falla aquestes comprovacions. SPF i DKIM, per si sols, verifiquen coses, però no diuen què fer amb el resultat — cada proveïdor decideix pel seu compte. DMARC treu aquesta ambigüitat: el propietari del domini especifica explícitament la política a seguir.
Es publica un registre TXT addicional al DNS:
_dmarc.thos.local. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc-reports@thos.local"Quan arriba un correu, el destinatari comprova
l’alineació (alignment): que el domini del From: visible coincideixi amb el domini que ha passat SPF o
DKIM (no cal que passin els dos, però almenys un ha d’estar “alineat”
amb el domini visible).
Segons el resultat i la política publicada (p=), el
destinatari decideix:
| Política | Significat |
|---|---|
p=none |
Només informa (mode d’observació, no bloqueja res) |
p=quarantine |
Marca’l com a sospitós (típicament, carpeta spam) |
p=reject |
Rebutja’l directament, no l’entreguis |
A diferència de SPF/DKIM, DMARC inclou un mecanisme de
retroalimentació: amb rua=mailto:..., els
grans proveïdors (Gmail, Yahoo, Microsoft) t’envien periòdicament
informes agregats (XML) dient-te qui està enviant correu en nom
del teu domini i si passa o falla les comprovacions — útil per detectar
suplantacions o servidors legítims que t’has deixat sense autoritzar a
l’SPF.
| Mecanisme | Què verifica | Qui decideix què fer |
|---|---|---|
| SPF | La IP del servidor emissor | Cada destinatari, pel seu compte |
| DKIM | La signatura/integritat del missatge | Cada destinatari, pel seu compte |
| DMARC | Que SPF o DKIM estiguin alineats amb el domini visible | El domini remitent, explícitament |
En resum: SPF i DKIM són els mecanismes de verificació; DMARC
és la política que decideix les conseqüències. Els proveïdors
grans com Gmail donen molt més pes a un domini que té DMARC configurat
(especialment amb p=reject) que a un que només té SPF/DKIM
solts sense cap política que els lligui.
Abans de començar, un aclariment important: SPF i DKIM
funcionen publicant registres al DNS públic del domini
remitent, perquè els servidors externs (Gmail, etc.) puguin
consultar-los. Com que thos.local és un domini de
laboratori, no resoluble des d’Internet, cap servidor extern real podrà
mai verificar aquests registres per a thos.local — per
tant, Gmail o qualsevol altre destinatari extern seguirà sense
poder validar SPF/DKIM dels teus correus, independentment del
que configuris.
Dit això, val molt la pena fer-ho igualment amb finalitat
didàctica: podràs veure el mecanisme complet funcionant
dins del laboratori (publicant els registres a la teva pròpia zona BIND
de thos.local, i verificant-los amb dig/opendkim-testkey des d’una altra màquina
interna). Si en el futur vols que sigui efectiu de debò cap a
l’exterior, caldria fer-ho sobre un domini públic real.
SPF només necessita un registre TXT indicant quines
IP poden enviar correu en nom del domini. Si ja tens BIND9 gestionant la
zona thos.local, afegeix-hi:
thos.local. IN TXT "v=spf1 mx a:correu.thos.local ip4:10.0.2.10 -all"
mxia:correu.thos.local→ autoritza el mateix servidor de correuip4:10.0.2.10→ autoritza explícitament la IP-all→ rebutja qualsevol altra font (política estricta, correcta per a un domini que només té un servidor de sortida)
Recarrega la zona:
sudo rndc reload thos.local
dig TXT thos.local +shortsudo apt install opendkim opendkim-toolssudo mkdir -p /etc/opendkim/keys/thos.local
sudo opendkim-genkey -b 2048 -d thos.local -D /etc/opendkim/keys/thos.local -s mail -v
sudo chown -R opendkim:opendkim /etc/opendkim/keys
sudo chmod 700 /etc/opendkim/keys/thos.local
sudo chmod 600 /etc/opendkim/keys/thos.local/mail.privateAixò genera mail.private (clau privada, per signar) i mail.txt (el registre DNS que has de publicar).
/etc/opendkim.confsudo nano /etc/opendkim.confSyslog yes
UMask 002
Canonicalization relaxed/simple
Mode sv
Domain thos.local
KeyFile /etc/opendkim/keys/thos.local/mail.private
Selector mail
Socket local:/run/opendkim/opendkim.sock
UserID opendkim:opendkim
sudo mkdir -p /run/opendkim
sudo chown opendkim:postfix /run/opendkim/run/ és un sistema de fitxers en memòria
(tmpfs) que es buida completament en cada arrencada del
servidor. Si només fas el mkdir manual, el directori
desapareixerà després del pròxim reinici i OpenDKIM
fallarà en arrencar. Per evitar-ho, defineix-lo perquè es recreï
automàticament a cada arrencada:
sudo nano /etc/tmpfiles.d/opendkim.confd /run/opendkim 0750 opendkim postfix -
Això li diu a systemd-tmpfiles que recreï el directori
amb els permisos correctes cada cop que arrenqui la màquina, sense
dependre que ho facis manualment.
postfix al grup opendkim (perquè pugui
llegir el socket)sudo usermod -aG opendkim postfixsudo postconf -e 'milter_default_action = accept'
sudo postconf -e 'milter_protocol = 6'
sudo postconf -e 'smtpd_milters = local:/run/opendkim/opendkim.sock'
sudo postconf -e 'non_smtpd_milters = local:/run/opendkim/opendkim.sock'sudo systemctl restart opendkim
sudo systemctl restart postfixthos.localcat /etc/opendkim/keys/thos.local/mail.txtCopia el contingut (format mail._domainkey IN TXT "v=DKIM1; h=sha256; k=rsa; p=...") a
la teva zona:
mail._domainkey.thos.local. IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBg..."
sudo rndc reload thos.localsudo opendkim-testkey -d thos.local -s mail -vvvHauria de respondre key OK.
Envia un missatge de prova (per exemple, joan → maria) i revisa les capçaleres del missatge rebut (a SOGo: obre el missatge →
menú de tres punts → “Mostra el codi font” o similar) — hauries de veure
una capçalera DKIM-Signature: afegida automàticament.
Afegeix a la zona thos.local (el mateix fitxer on ja
tens el registre SPF i el mail._domainkey):
_dmarc.thos.local. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@thos.local; pct=100"
Explicació de cada paràmetre:
| Paràmetre | Significat |
|---|---|
v=DMARC1 |
Versió del protocol (sempre aquest valor) |
p=quarantine |
Política: si falla l’alineació, marca’l com a sospitós (es recomana
començar aquí, no directament amb reject) |
rua=mailto:... |
On enviar els informes agregats (XML) — cal que aquesta bústia existeixi realment al teu servidor |
pct=100 |
Aplica la política al 100% dels correus (útil posar-ho més baix, per
exemple pct=10, durant les primeres proves) |
Recarrega la zona:
sudo rndc reload thos.local
dig TXT _dmarc.thos.local +shortSi vols que rua=mailto:dmarc-reports@thos.local funcioni
de debò dins del laboratori, cal que aquest usuari existeixi al teu LDAP, igual que joan/maria:
ldapadd -x -H ldap://ldapserver.thos.local -D "cn=admin,dc=thos,dc=local" -w CONTRASENYA <<'EOF'
dn: uid=dmarc-reports,ou=Usuaris,dc=thos,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: dmarc-reports
cn: DMARC Reports
sn: Reports
mail: dmarc-reports@thos.local
uidNumber: 10003
gidNumber: 10001
homeDirectory: /home/dmarc-reports
loginShell: /usr/sbin/nologin
userPassword: {SSHA}...
EOFCom que ja tens Postfix configurat amb virtual_mailbox_domains/LMTP, aquesta bústia es crearà
automàticament a /var/mail/vhosts/dmarc-reports/ en rebre
el primer correu, sense cap pas addicional.
dig TXT thos.local +short
dig TXT mail._domainkey.thos.local +short
dig TXT _dmarc.thos.local +shortTots tres haurien de respondre amb el contingut esperat.
En un domini real, la pràctica habitual és començar amb p=none (només observar via informes), confirmar durant unes
setmanes que tot el correu legítim passa SPF/DKIM correctament, i només
llavors pujar a p=quarantine i finalment p=reject. Per al teu entorn de laboratori, pots saltar-te
directament a p=quarantine o p=reject per
veure l’efecte immediatament, ja que no hi ha trànsit de producció real
que es pugui veure afectat.