Está en la página 1de 54

2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.

com

INSTALACINYCONFIGURACINDEUN
SERVIDORDECORREOCOMPLETOENLINUX
JUEVES,01DEENERODE2015Categoras:LinuxInternet
Esteartculoseleeenaprox.70minutos.
UnodelosserviciosmsimportantesdeInternetessin
duda el correo electrnico, y al igual que con muchos
otros servicios, no hay nada que gestione mejor el
correoqueGNU/Linux.

Hay muchos proyectos conocidsimos y de gran


importancia en el mundo de GNU/Linux, como por
ejemplo el servidor web Apache, las bases de
datos MySQL y PostgreSQL, el servidor de
nombresBindymuchsimosms...perohay2deestos
grandsimosproyectosquenosuelensertanconocidos
para el ciudadano de a pi, y sin embargo son una
parte fundamental de Internet. Me estoy refiriendo
a Postfix y a Courier, la pareja perfecta para hacerse
cargo de algo tan importante hoy en da como es el
correoelectrnico.

Y es que la combinacin de estos 2 sistemas no solo


funciona,sinoqueademslohaceincreblementebien.

Viendo que este artculo puede resultar bastante extenso, voy a dividirlo un poco y a crear un
pequeondice:

1.Unpocodehistoriaantesdeempezar
2.ConfiguracindelDNSdeldominiopararecibiremails
3.Creacindelabasededatosdeusuarios
4.InstalacindePostfixcomoservidorSMTP
5.ConfiguracindeSASLparaautenticacindePostfix
6.InstalacindeCouriercomoservidorPOP/IMAP
7.Instalacindeantivirusyantispam
8.Estadsticasymonitorizacin
9.Referencias

Vamosconelprimerodelospuntos...

UNPOCODEHISTORIAANTESDEEMPEZAR
Sideverdadtienesmuchsimaprisaenmontartuservidordecorreo,puedessaltartestapartee
irdirectamentealcaptulo2,peroesimportantesaberquvasainstalar,porqulovasahacery
cmofuncionarealmenteelmundodelcorreoelectrnico.

Hay2procesoscompletamentediferenciadoseneltemadelcorreoelectrnico:

Elenvodelmensaje:realizadomedianteelprotocoloSMTPporprogramas
llamadosMTA.
Lalecturadelmensaje:realizadamediantelosprotocolosPOPoIMAP.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 1/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Estos procesos no tiene nada que ver uno con otro, y como el uso del correo electrnico es
totalmentetransparenteparaelusuario,lamayoradeellosnilosentiendenilosdiferencia(yno
merefierosoloatusabuelosoalosmos,sinoinclusoagentedelgremiode la informtica), ni
faltaqueleshace... pero tranquilo, que si ests leyendo ste artculo significaquegraciasalos
Dioses,tunoformaspartedeesamayoradeusuarioszombis,lamersycatetosvarios.

Todo el sistema de correo electrnico se puede entender fcilmente siguiendo la analoga que
tieneconelsistemadecorreopostaldetodalavida,enelquehayoficinasdecorreos,carteros,
buzones,etc.

Cuando t quieres escribir una carta postal a alguien (olvdate del email o el mvil, haz un
esfuerzoeimagnatelo,hombre!),unavezredactadalametesenunsobreindicandoelremitente
y el destinatario, y la metes en el buzn. Un cartero recoge esa carta, y la lleva a la oficina de
correosdetubarrio,dondesilacartaesvlida(llevaladireccindeldestinatario,elsobreest
cerrado,etc)esclasificadasegnseasudestino,momentoenelcualuntransportista(ocartero)
larecogedeesaoficinaylaentregaenlaoficinadecorreosdelbarriodedichodestinatario.En
esaoficina,otroscarterosrecogenlascartasrecinllegadasylasllevanalbuzndeldestinatario,
el cul a partir de ese momento ya puede abrir su buzn cuando lo desee y coger las cartas (y
leerlasenesemomentoocuandolprefiera).

steesexactamenteelmismoprocesoquesigueelcorreoelectrnico.

Cuando tu quieres escribir un email a alguien, una vez escrito en tu cliente de correo favorito
(Thunderbird/Icedove,Evolution,~~Outlook~~,~~GMail~~, etc), estos lo envan a tu servidor de
correosaliente(laoficinadecorreosdetubarrio).All,sielemailesvalido(hayunremitenteyun
destinatario cuyo dominio existe, su servidor de correo responde, etc) se mira en el DNS del
dominioalquevadirigidoelcorreoculeselservidorSMTPdedichodominio,yselereenvael
mensajeadichoservidor(la oficina de correos del barrio del destinatario). All, si el destinatario
existe,sedejaelemailensubuzn(mailbox)alaesperadequesteseconecteasteservidor
(mediante un cliente de correo) y se descargue los mensajes que en l pudiera haber (y ya los
leercuandolquiera).

Veslaanaloga,verdad?Esprcticamentelomismo(voyatratardeilustrarelejemploconuna
grficautilizandoelgenialGraphviz,delcualyahablensteotroartculo):

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 2/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Porlotantoelprimerpasonecesarioenstacadenaeselenvodecorreo,esdecir,elMTA.

HaymuchosprogramasenGNU/LinuxqueactandeMTA.Elmsfamosodetodosseguramente
sea Sendmail, que fue uno de los primeros MTA que existieron, y fue utilizado durante mucho
tiempo en prcticamente todos los servidores SMTP de Internet. No obstante siempre se le ha
consideradodifcil de configurar, lo que unido a los numerosos problemas de seguridad que ha
tenidoensuhistoria,hoyendapodramosdecirquehasidoreemplazadoporotrosMTAscomo
porejemploQmail,EximoPostfix.

steltimoessindudamipreferido,yeselquevoyaexplicarenesteartculo.

UnaveztengamoselSMTPfuncionando,necesitaremosotrossistemasqueaccedanalosemails
queelMTAnoshayadejado.Paraestotambintenemosdiferentesybuenasopciones,comopor
ejemploDovecotoCourier.

He probado ambos, y aunque Dovecot funciona muy bien, siempre me ha gustado mucho ms
Courier...porlotanto,eselquevoyaexplicarenesteartculo.

Montar cualquiera de estos servicios basndose en los usuarios locales del servidor no tiene
ningnmisterio,apartedeseralgomuypocorecomendableya que supondra que tendramos
que crear un usuario en el servidor por cada usuario de correo que furamos a utilizar (solo el
imaginarloyamedaurticaria!).Porlotanto,losusuariosdenuestroservidordecorreovanaser
usuarios virtuales cuyos datos van a estar almacenados en una base de datos (que podra
serMySQL,PostgreSQLoinclusoOpenLDAP).

Ytalycomoindicaelttulodelartculo,vamosaexplicarcomomontarelservidorCOMPLETO,y
no sera verdaderamente un servidor de correo completo si no tuviera tambin deteccin

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 3/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

deSPAM,antivirus,filtrosdecorreo,SSLentodosestosservicioseinclusoestadsticasygrficas
paralamonitorizacindetodoelsistema.

Ahoraquehemosvistounpocolosfundamentosbsicosdelsistemadecorreoelectrnico,vamos
aentrarenmateria...

CONFIGURACINDELDNSDELDOMINIOPARA
RECIBIREMAILS
Hay una parte fundamental para entender cmo funciona el correo electrnico en Internet, y
aunque es sumamente obvia y bsica para los que conocemos el tema, voy a explicarla
simplemente para asegurarme de que entiendes lo que estamos haciendo, no sea que despus
detodoelrolloqueestoycontandoenesteartculo,todavanotengasclarosalgunosconceptos
bsicossobreelfuncionamientodelosservidoresdecorreo(ysilosconoces,puesteaguantasy
lo lees de nuevo, que seguro que te va a costar a ti mucho menos leerlo que a mi escribirlo
xDDDD).

Supongamosqueyatenemosnuestroflamanteservidordecorreolistoyfuncionando,preparado
pararecibirelcorreodelasdireccionesdeemailde(porejemplo)pornohardware.com(merefiero
adireccionesdeltipousuario@pornohardware.comysimilares).

Puedequeelservidorestfuncionando,pero...cmosabelagentequesteservidorqueacabo
de configurar es a donde tienen que enviar los emails que vayan a la
direccinusuario@pornohardware.com,porejemplo?

Larespuestaest,comocasitodolorelativoalosnombresdelosdominios,enelDNS.

DoyporsentadoqueconoceselserviciodeDNSdeundominio,yquesabesperfectamenteque
steDNSseencargadedecirleatunavegador(porejemplo)queladireccinIPdelservidorde
pornoharware.comesla188.165.118.8,verdad?

ElDNSseconfiguraabasederegistros,yloshaydevariostipos.Unodelosmsutilizadoses
elregistrodetipoA,queseencargaprecisamentedeestoltimoqueacabodedecir:traducirel
nombredeundominioaunadireccinIP.

Sinembargo,hayotrostiposderegistrosenunDNSquesonigualdeimportantesqueelA,como
porejemploelqueataealcorreodedichodominio,llamadoregistrodetipoMX.

Si un registro de tipo A del dominio de pornohardware.com dira que "la direccin


www.pornohardware.comesenrealidadlaIP188.165.118.8",unregistrodetipoMXdeldominio
de pornohardware.com dira que "el servidor que se encarga del correo de las direcciones
acabadasen@pornoharware.comeslaIP141.8.224.25(porejemplo)".

Poreso,cuandoenviamosunemailaunadireccin,nuestroservidorhaceunaconsultaalDNS
deldominiodeldestinatarioparasaberculeslaIPdelservidordecorreodedichodestinatario...
yunavezobtenida,seintentaconectaraesadireccinparapasarleelemail.

stetipoderegistrosDNStienenademsunaparticularidadquenotienenlosdems,yesquees
posibleasignarmsde1servidordecorreoacadadominio,definiendodiferentesprioridadesa
cadaunodeellos...esdecir,quepodemosconfigurar2servidoresdecorreodiferentesparaque
se hagan cargo del correo de un dominio determinado, y decirle al DNS que el servidor de
correo habitual ser el 1... pero que en aquellos casos en los que el servidor 1 est cado por
cualquiermotivo,puedeenviarelemailtambinalservidor2.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 4/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Tambin podemos configurar 2 servidores de correo diferentes para el mismo dominio, y


asignarleslamismaprioridad.Ensteseirautilizandounservidoruotroindistintamente,siendo
estomuytilparabalancearlacargaentreambos.
UNEJEMPLOPRCTICO
EncualquierdistribucindeGNU/Linuxtenemosdisponibleelcomando nslookup ,quesirvepara
conectarseaunservidorDNSyhacerleconsultas.

Noentraraexplicarsusintaxis,nicamentetenisqueverqueconelsiguientecomandoleestoy
pidiendoalservidorDNS208.67.222.222(unodelosservidoresDNSpblicosdeOpenDNS)que
medigaculeslaIPdelservidordepornohardware.com:

bhean@vader:~$nslookuppornohardware.com208.67.222.222
Server:208.67.222.222
Address:208.67.222.222#53

Nonauthoritativeanswer:
Name:pornohardware.com
Address:188.165.118.8

Comoveis,primeronosdiceaquservidorDNSleestamoshaciendolaconsulta(enstecaso:
208.67.222.222 ) y a travs de qu puerto ( 208.67.222.222#53 ), y luego nos da lo que le hemos

pedido: Address:188.165.118.8 .

SienlugardepedirlelaIPdeladireccinweb,lepedimoslasIPsdesuservidor/servidoresde
correo,elcomandosera:

bhean@vader:~$nslookuptype=mxpornohardware.com208.67.222.222
Server:208.67.222.222
Address:208.67.222.222#53

Nonauthoritativeanswer:
pornohardware.commailexchanger=5mail.pornohardware.com.

En ste caso, nos dice que el servidor de correo


depornohardware.comesmail.pornohardware.com.

Si hacemos la misma prueba pero con un dominio que tenga configurados varios servidores de
correo,porejemplo debian.org ,veremosesto:

bhean@vader:~$nslookuptype=mxdebian.org208.67.222.222
Server:208.67.222.222
Address:208.67.222.222#53

Nonauthoritativeanswer:
debian.orgmailexchanger=5mailly.debian.org.
debian.orgmailexchanger=10muffat.debian.org.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 5/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Vemosquelosservidoresdecorreodeldominio debian.org son2:

mailly.debian.org:conprioridad5
muffat.debian.org:conprioridad10

Comounotieneunaestablecidaunaprioridadde5yelotrode10,elquetengaelvalormsbajo
eselqueseconsideraservidorprincipal,yencasodeestarcado,seutilizaraelotro.

Esdecir,aMENORvalor,MSprioridadtendreseservidorconrespectoalosdems.

Ahora que ya tenemos claro cmo anunciar a todo Internet que nuestro servidor va a ser el
encargadodemanejarelcorreodedeterminadodominio,vamosalturrn...

CREACINDELABASEDEDATOSDE
USUARIOS
Como ya he dicho antes, que los usuarios del sistema de correo sean los usuarios locales que
haya en el servidor (que es el funcionamiento por defecto) es algo completamente
desaconsejable,ydaigualquepensisqueparaunpardeusuariosquevaisausarnomerece
la penaunabasede datos,oque solo es una prueba y si va bien ya lo montareis con base de
datosmsadelanteocualquierotraexcusaqueseosocurra.

Miexperienciacomosysadminmehademostradounayotravezquestascosas,alcabodeno
muchotiempo,nuncasoncomoerancuandosepensaronymontaroninicialmente.Esdecir,que
siahorapiensasquesolovasausar2usuarios,cuandotequierasdarcuentatendrsunadocena
deellos...ysialgomolestasobremaneraaunsysadminbofhestrabajar2vecesparalomismo,
asquevamosahacerlascosasbiendesdeelprincipio,quenocuestanada!xDD

LoprimeroeselegirsivasautilizarbasededatosoLDAPparaalmacenarlosusuarios,yaque
sonmtodosMUYdiferentes.

Yorecomiendobasededatos(ymsconcretamentePostgreSQL), pero si vas a implementar el


servidor de correo en un entorno en el que ya dispones de un directorio activo u OpenLDAP,
tambinpuedeshacerlo.

Para ste artculo usar base de datos, concretamente PostgreSQL (aunque si hubiera alguna
diferencias en alguna parte con respecto a MySQL, intentar explicarla). Llegados a ste punto
doyporhechoqueyatenisvuestroservidordebasededatosinstaladoyfuncionando,porloque
sinoesas,instalayconfiguraelservidordebasededatosantesdecontinuar.

Siquiereshacerqueprcticamentetodalainformacindelsistemasealmaceneygestioneenla
basededatos,puedeshacerlo.Yonormalmentesolousolabasededatosparalainformacinde
losusuariosyparaladesusaliasdecorreo.

Paraalmacenarstainformacintenemosquecrearunatablaparacadacosa,yquecontengala
informacinnecesariatantoparaPostfixcomoparaCourier.Unejemplocompletamentevlidoy
que llevo utilizando muchsimos aos en diferentes servidores de correo que administro es el
siguiente:
TABLAPARAUSUARIOS
Nombre Tipo
Valorpordefecto Nulos?
columna columna
user_id integer nextval('user_id_seq') NO
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 6/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Nombre Tipo
Valorpordefecto Nulos?
columna columna
character
name NULL SI
varying(64)
character
surname NULL SI
varying(128)
character
login NULL NO
varying(32)
character
password_crypt NULL NO
varying(64)
character
email_local NULL NO
varying(255)
timestamp
insert_date withouttime now() NO
zone
character
description NULL SI
varying(255)
imap_access character(1) 0 NO
smtp_access character(1) 0 NO
character
path_maildir '/' NO
varying(255)
user_active character(1) 0 NO

TABLAPARAALIASDECORREO
Nombre Valorpor
Tipocolumna Nulos?
columna defecto
character
email_local NULL NO
varying(255)
character
email_alias NULL NO
varying(255)

Ahoraveremoslasquerysnecesariasparacrearesastablas...primertmateunossegundospara
examinarloscamposdedichastablasyhacerteunaideaaproximadadelosdatosquevamosa
guardar en ellas: todos los campos son ms o menos auto explicativos, pero por si acaso
comentarparaqusevanausar:
TABLAPARAUSUARIOS
user_id:staserlaclaveprimariadelatabla,poresosuvalorpordefectoen
PostgreSQLeslasecuencia user_id_seq ,yenMySQLserun
campoAUTOINCREMENT.
name:Enstecamposealmacenarelnombredelusuario(merefieroasunombrede
pila,queesnecesarioparaalgunascosas,noelnick).
surname:Enstecamposealmacenarnlosapellidosdelusuario.
login:Nickdelusuario
password_crypt:Lacontraseadelusuario(utilizandoelalgoritmodeencriptacin
crypt basadoenDES).
email_local:Ladireccindeemailquevamosacrearparaelusuario.
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 7/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

insert_date:Fechadecreacindelusuario
description:Comosunombreindica,esladescripcinquequeramoshacerdelacuenta
desteusuario.
imap_access:Usaremosestecampoparapermitironopermitirqueelusuariose
conectealservidorIMAPparaleercorreo.
smtp_access:Usaremosestecampoparapermitironopermitirqueelusuariose
conectealservidorSMTPparaenviarcorreo.
path_maildir:Aquindicaremoslarutafsicaeneldiscodurodelservidordelmailboxdel
usuario.
user_active:Conestecampohabilitaremosonolacuentadelusuario.

TABLAPARAALIASDECORREO
email_local:Ladireccindecorreodelusuarioalquevamosacrearunalias.
email_alias:Elaliasdecorreoquevamosacrear.

Unavezexplicadosloscamposdeambastablas,elcdigoSQLnecesarioparacrearlasserael
siguiente:

ParalatabladeusuariosenPostgreSQL:

CREATEDATABASEemail;
\\cemail

CREATETABLEusers(
"user_id"integerDEFAULTnextval(('user_id_seq'::text)::regclass)NOTNULL,
"name"charactervarying(64)DEFAULTNULL::charactervarying,
"surname"charactervarying(128)DEFAULTNULL::charactervarying,
"login"charactervarying(32)NOTNULL,
"password_crypt"charactervarying(64)NOTNULL,
"email_local"charactervarying(255)NOTNULL,
"insert_date"timestampwithouttimezoneDEFAULTnow()NOTNULL,
"description"charactervarying(255)DEFAULTNULL::charactervarying,
"imap_access"character(1)DEFAULT0NOTNULL,
"smtp_access"character(1)DEFAULT0NOTNULL,
"path_maildir"charactervarying(255)DEFAULT'/'::charactervaryingNOTNULL,
"user_active"character(1)DEFAULT0NOTNULL
);

ALTERTABLEONLYusers
ADDCONSTRAINTusers_pkeyPRIMARYKEY("user_id");

ALTERTABLEONLYusers
ADDCONSTRAINT"users_email_local_key"UNIQUE("email_local");

ALTERTABLEONLYusers
ADDCONSTRAINT"users_login_key"UNIQUE("login");

CREATESEQUENCEuser_id_seq
STARTWITH1
INCREMENTBY1
NOMINVALUE
NOMAXVALUE
CACHE1;

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 8/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

ParalatabladeusuariosenMySQL:

CREATEDATABASEemail;
useemail;

CREATETABLEusers(
user_idint(7)NOTNULLAUTO_INCREMENT,
namevarchar(64)DEFAULTNULL,
surnamevarchar(128)DEFAULTNULL,
loginvarchar(32)NOTNULLDEFAULT'',
password_cryptvarchar(64)NOTNULL,
email_localvarchar(255)NOTNULLDEFAULT'',
insert_datedatetimeNOTNULL,
descriptiontext,
imap_accesschar(1)NOTNULLDEFAULT'0',
smtp_accesschar(1)NOTNULLDEFAULT'0',
path_maildirvarchar(255)NOTNULLDEFAULT'/',
user_activechar(1)NOTNULLDEFAULT'1',
PRIMARYKEY(user_id),
UNIQUEKEYemail_local(email_local),
KEYimap_access(imap_access),
KEYsmtp_access(smtp_access)
)ENGINE=MyISAMAUTO_INCREMENT=1;

ParalatabladealiasdeusuariosenPostgreSQL:

CREATETABLEusers_aliases(
"email_local"charactervarying(255)NOTNULL,
"email_alias"charactervarying(255)NOTNULL
);

ALTERTABLEONLYusers_aliases
ADDCONSTRAINTusers_emails_ukeyUNIQUE("email_local","email_alias");

ParalatabladealiasdeusuariosenMySQL:

CREATETABLEusers_aliases(
email_localvarchar(255)NOTNULLDEFAULT'',
email_aliasvarchar(255)NOTNULLDEFAULT'',
UNIQUEKEYemail_local(email_local,email_alias)
)ENGINE=MyISAMAUTO_INCREMENT=1;

Apartedelastablas(ylasecuencia,enelcasodePostgreSQL)necesitaremoscreartambinlos
usuariosquevanautilizartantoPostfixcomoCourierparaaccederalabasededatos.Siempre
esrecomendablecrearunusuarioparacadaunoenlugardecrearunoencomn.

Os recomiendo utilizar contraseas complejas (que contengan letras, nmeros y caracteres


especiales,ycuyalongitudnoseanuncainferiora10caracteres)generadasdeformaaleatoria,
yaqueunaveztengislosserviciosconfigurados,nonecesitareisrecordarlas.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 9/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Una web bastante til y sencilla para generar contraseas complejas de forma aleatoria es
http://www.clavesegura.org/

Crearemosentonces3usuarios,unoparacadaunodelosserviciosquevamosaconfigurarms
adelante(Postfix,CourierySASL),porlotantoejecutamosstasquerysennuestrabasededatos
paracreardichosusuariosyparadarlespermisossobrelastablasqueacabamosdecrear.

Nohayqueconfundirestosusuarios(quesonlosqueusarPostfix,porejemplo,paraobtener
los datos del destinatario de un email) con los usuarios de nuestro correo (es decir, las
personasquevanadisponerdedireccionesdeemailgestionadaspornuestroservidor).

Paracrearlosusuariosqueusarnestosservicios(Postfix,CourierySASL)paraconectarseala
basededatosenPostgreSQL:

CREATEROLEapp_postfix;
ALTERROLEapp_postfixWITHNOSUPERUSERINHERITNOCREATEROLENOCREATEDBLOGINNOREPLICATIONPASSWORD

CREATEROLEapp_courier;
ALTERROLEapp_courierWITHNOSUPERUSERINHERITNOCREATEROLENOCREATEDBLOGINNOREPLICATIONPASSWORD

CREATEROLEapp_sasl;
ALTERROLEapp_saslWITHNOSUPERUSERINHERITNOCREATEROLENOCREATEDBLOGINNOREPLICATIONPASSWORD

GRANTSELECTONTABLEusersTOapp_postfix;
GRANTSELECTONTABLEusersTOapp_courier;
GRANTSELECTONTABLEusersTOapp_sasl;

GRANTSELECTONTABLEusers_aliasesTOapp_postfix;
GRANTSELECTONTABLEusers_aliasesTOapp_courier;
GRANTSELECTONTABLEusers_aliasesTOapp_sasl;

Yparacrearlosusuariosqueusarnestosservicios(Postfix,CourierySASL)paraconectarsea
labasededatosenMySQL:

CREATEUSER'app_postfix'@'localhost'IDENTIFIEDBYPASSWORD'QZrRPfzuq';
CREATEUSER'app_courier'@'localhost'IDENTIFIEDBYPASSWORD'OQ5JQ3+pNR';
CREATEUSER'app_sasl'@'localhost'IDENTIFIEDBYPASSWORD'hb9mwJGcc';

GRANTSELECTONemail.usersTO'app_postfix'@'localhost';
GRANTSELECTONemail.usersTO'app_courier'@'localhost';
GRANTSELECTONemail.usersTO'app_sasl'@'localhost';
GRANTSELECTONemail.users_aliasesTO'app_postfix'@'localhost';
GRANTSELECTONemail.users_aliasesTO'app_courier'@'localhost';
GRANTSELECTONemail.users_aliasesTO'app_sasl'@'localhost';

FLUSHPRIVILEGES;

EnelcasodePostgreSQL,esnecesarioespecificarensuarchivodeconfiguracindeaccesos
pg_hba.conf habilitemoselaccesodelos3usuariosqueacabamosdecrear.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 10/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Editamoselarchivoyespecificamosqueestos3ltimosusuariospuedenconectarsealabasede
datos email para leer. Repito: nicamente en el caso de PostgreSQL. Si estamos
configurandoelservidornicamenteparaMySQL,entoncesNOhayquehaceresto:

#
#DatabaseadministrativeloginbyUnixdomainsocket
localallpostgrespeer

#TYPEDATABASEUSERADDRESSMETHOD
hostemailapp_postfix127.0.0.1/32md5
hostemailapp_courier127.0.0.1/32md5
hostemailapp_sasl127.0.0.1/32md5

#"local"isforUnixdomainsocketconnectionsonly
localallallpeer
#IPv4localconnections:
hostallall127.0.0.1/32md5
#IPv6localconnections:
hostallall::1/128md5
#Allowreplicationconnectionsfromlocalhost,byauserwiththe
#replicationprivilege.
#localreplicationpostgrespeer
#hostreplicationpostgres127.0.0.1/32md5
#hostreplicationpostgres::1/128md5

Porltimo,comprobamosquepodemosconectarnosalastablasdenuestrabasededatos,que
enelcasodePostgreSQLsehaceas:

$psqlh127.0.0.1Uapp_postfixWcommand='SELECTCOUNT(*)FROMusers;'email

count

0
(1row)

YenelcasodeMySQLsehaceas:

$echo"SELECTCOUNT(*)FROMusers;"|mysqlh127.0.0.1uapp_postfixpemail

COUNT(*)
0

Alejecutarestosltimoscomandosseospedirlacontraseadelusuarioquevayisaprobar(en
ste caso el usuario es app_postfix ). Una vez introducida debera ejecutarse
laquerycorrectamente...siporelcontrarioobtenisalgunmensajedeerror,seguramentesedeba
aproblemasconlospermisosdelosusuarios.chaleunojoaloquehasidohaciendo,averigua
enqupuntolahascagadoyarrglalo...xDDD

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 11/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Sitodohaidobien,staparteyalahemosacabado...ahorasolonosquedarainsertarunusuario
paraprobar,ytambinalgunalias.Esimportanterecordarqueconvieneinsertarunregistroen
la tabla de aliases que contenga la propia direccin local del usuario que estamos
creando(esdecir,unaliasdesimismo,apartedelosdemsaliasquevayamosaconfigurarpara
ese usuario) ya que en algunas circunstancias Postfix nicamente consulta la existencia de un
usuariomirandoenlatabladealiases,porloquesinotenemosunregistroahqueespecifiquela
direccin normal del usuario, Postfix no lo encontrar y pensar que dicho usuario no existe,
aunquesqueexistaenlatablasusers.

Lapassworddelusuariotienequeirencriptadapormotivosobviosdeseguridad,paraquenadie
(inclusoquienpudierateneraccesoaconsultarlatablaenlaquesealmacena)pudieraverla.

ElalgoritmodeencriptacinquevamosausareselmismoqueutilizaGNU/Linuxparaalmacenar
las contraseas de los usuarios del sistema, y que si no me equivoco, es el utilizado en la
funcinCRYPTmedianteelalgoritmoDES.

Pero no os preocupis si no estis muy puestos en criptografa... existe un comando que os


permitir generar el hash de la contrasea que queris utilizando diferentes algoritmos. ste
comandosellama authpasswd y forma parte del paquete courierauthlib , por lo que debemos
instalarlo.

Denuevo,siusamosDebian/Ubuntu,bastacon:

$sudoaptgetinstallcourierauthlib

YsiusamosCentOS/RedHat,metemoqueestospaquetesnoformanpartedesusrepositorios
oficiales,porloquetendraisquecompilarelcdigovosotrosmismos.Siesvuestrocaso,podis
bajarlodesdeaqu:http://www.couriermta.org/download.htmls

En cualquier caso, una vez que tengis el paquete courierauthlib instalado, y por tanto el
comando authpasswd disponible, solo tenis que ejecutarlo especificando el algoritmo CRYPT y
despusdeintroducirlapasswordquequeris.Esoosdevolverelhashcorrespondienteadicha
password,queporejemplo,enelusuariodepruebaquevamosacrearstapasswordvaaser
galactica :

$authpasswdcrypt
Password:
Reenterpassword:
{CRYPT}V1TBTcBUTkibk

Porlotanto,lapasswordencriptadadegalacticaesV1TBTcBUTkibk.

Constasquerysdeberamossercapacesdeinsertarunusuariodepruebacon1aliasyconla
passwordencriptadaennuestrarecincreadabasededatos:

Insertamoselusuario
INSERTINTO
users
(

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 12/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

name,
surname,
login,
password_crypt,
email_local,
description,
imap_access,
smtp_access,
path_maildir,
user_active
)
VALUES
(
'William',
'Adama',
'bill',
'V1TBTcBUTkibk',
'adama@pornohardware.com',
'EmaildelComandanteAdama',
1,
1,
'/srv/maildirs/pornohardware.com/adama/',
1
);

Insertamoselaliasdesimismo
INSERTINTO
users_aliases
(
email_local,
email_alias
)
VALUES
(
'adama@pornohardware.com',
'adama@pornohardware.com'
);

Insertamosunaliasparaelusuario
INSERTINTO
users_aliases
(
email_local,
email_alias
)
VALUES
(
'adama@pornohardware.com',
'william.adama@pornohardware.com'
);

Una vez ejecutados estos INSERT ya tendremos configurado nuestro usuario con sus alias, as
queahoravamosavercmolosutilizamos...

INSTALACINDEPOSTFIXCOMOSERVIDOR
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 13/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

INSTALACINDEPOSTFIXCOMOSERVIDOR
SMTP
Ahoraqueyatenemoslabasededatoscreadaynuestroprimerusuariodepruebaguardadoen
ella,vamosaprepararunservidorSMTPparaquecuandolellegueunemailparanuestrousuario,
sepaqueefectivamenteesparalyloguardeensumailboxparaquestepuedaleerlocuando
quiera.

Como ya coment anteriormente, el SMTP que utilizo normalmente


esPostfix.

Noesperfecto,peroenmiopinineselmejorSMTPquehayhoyen
da,aunquecomoencasitodohayvariosbandosenfrentados(enste
casoelotrobandosonlosdefensoresdeExim,otrogranSMTP).

Hay que tener claro de antemano que la tarea de configurar un


servidorSMTPsedivideen2subtareas:

Configurarelservidorparaquenuestrosusuariospuedanenviaremailsaotraspersonas.
Configurarelservidorparaquecuandolellegueunemailaunodenuestrosusuarios,
steloguardeparaqueelusuariopuedaleerlo.

QuieroquequedeclaraladivisinporqueaunqueseaPostfixquienseencarguedeambas,son2
procesosdiferentes.

Vamosconlaprimera...

UnservidorSMTPesunservicioquecorrenormalmenteenelpuerto25(y/oenelpuerto465si
nosconectamosatravsdeSSL).

Esto significa que cuando queramos enviar un email, debemos conectarnos a ste servidor y
mediante los comandos propios de su protocolo debemos indicar quienes somos, a quin
queremosenviarelemail,conqutextoqueremosenviarlo,etc.ysilohemoshechobien,nuestro
servidor enviar dicho email al SMTP del destinatario (como ya dije en el esquema de
funcionamientodelcorreoquepusearriba).

Sinembargo,elSMTPnopuedeestarabiertoacualquiera(situacinconocidacomoopenrelay),
yaqueentonceslosspammersloutilizarnparaenviaremailspublicitariosodecualquierotrotipo
a todo el mundo, lo que aparte de generar numerosos problemas, podra hacer que la IP de
nuestro servidor de correo fuera incluida en alguna base de datos pblica despammers, lo que
provocaraquelamayorpartedelosservidoresdecorreodelmundorehusaranrecibirnuestros
emails(aunquestosfueranemailslegtimosenviadosnormalmentepornosotros).

nicamente nuestros usuarios (aquellos que mediante su login y password se autentiquen


satisfactoriamente)deberatenerpermisosparapoderenviaremailsatravsdeesteSMTP.

El SPAM es una lacra, y no solo es molesto, sino que puede llegar a causar problemas de
verdad...asque,porfavor,ponespecialatencinaprotegertuservidorparaquestapandade
desgraciadosnopuedaservirsedel.

As que debemos configurar Postfix para que nicamente acepte emails de los usuarios que se
autentiquen.Comoestosusuarioslostenemosenunabasededatos,vamosaconfigurarPostfix
paraqueseconecteaellaylosbusque.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 14/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Lo primero es instalar los paquetes de Postfix segn la base de datos que estemos usando (ya
seaMySQLoPostgreSQL).Ycomosiempre,estainstalacinestrivialsiusamosunadistribucin
deGNU/LinuxdecentecomoporejemploDebian.Enstecaso(oeneldelasquesebasanen
ella,comoporejemploUbuntu),bastaracon:

$sudoaptgetinstallpostfixpostfixmysqlpostfixpgsql

Si por algun motivo (por ejemplo, que seamos masoquistas) utilizamos CentOS, Redhat o
similares,podemosinstalarlotambindeformamuyfcilcon:

$sudoyuminstallpostfix

Ahoraqueyalotenemosinstaladovamosaconfigurarlo.Los2archivosdeconfiguracinprincipal
dePostfixson master.cf y main.cf (amboseneldirectorio /etc/postfix ).

Enelprimerodeellos( /etc/postfix/master.cf )seespecificanlasopcionesdelprocesodemonio


de nuestro servidor SMTP, tales como filtros, configuracin de chroot, etc. Es normal que las
primerasvecesqueseexaminastearchivopuedepareceralgocomplejo de manejar... pero al
finalestansimplecomoelrestodePostfix.

Unejemplodestearchivopodraserelsiguiente:

/etc/postfix/master.cfdownload

#Postfixmasterprocessconfigurationfile.Fordetailsontheformat
#ofthefile,seethemaster(5)manualpage(command:"man5master").
#
#==========================================================================
#servicetypeprivateunprivchrootwakeupmaxproccommand+args
#(yes)(yes)(yes)(never)(100)
#==========================================================================
smtpinetnnsmtpd
#submissioninetnsmtpd
#osmtpd_tls_security_level=encrypt
#osmtpd_sasl_auth_enable=yes
#osmtpd_client_restrictions=permit_sasl_authenticated,reject
#omilter_macro_daemon_name=ORIGINATING
smtpsinetnnsmtpd
osmtpd_tls_wrappermode=yes
osmtpd_sasl_auth_enable=yes
osmtpd_client_restrictions=permit_sasl_authenticated,reject
omilter_macro_daemon_name=ORIGINATING
#628inetnqmqpd
pickupfifon601pickup
cleanupunixn0cleanup
qmgrfifonn3001qmgr
#qmgrfifon3001oqmgr
tlsmgrunix1000?1tlsmgr
rewriteunixtrivialrewrite
bounceunix0bounce
deferunix0bounce
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 15/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

traceunix0bounce
verifyunix1verify
flushunixn1000?0flush
proxymapunixnproxymap
#proxywriteunixn1proxymap
smtpunixsmtp
#WhenrelayingmailasbackupMX,disablefallback_relaytoavoidMXloops
relayunixsmtp
osmtp_fallback_relay=
#osmtp_helo_timeout=5osmtp_connect_timeout=5
showqunixnshowq
errorunixerror
retryunixerror
discardunixdiscard
localunixnnlocal
virtualunixnnvirtual
lmtpunixlmtp
anvilunix1anvil
scacheunix1scache
#
#====================================================================
#InterfacestononPostfixsoftware.Besuretoexaminethemanual
#pagesofthenonPostfixsoftwaretofindoutwhatoptionsitwants.
#
#ManyofthefollowingservicesusethePostfixpipe(8)delivery
#agent.Seethepipe(8)manpageforinformationabout${recipient}
#andothermessageenvelopeoptions.
#====================================================================
#
#maildrop.SeethePostfixMAILDROP_READMEfilefordetails.
#Alsospecifyinmain.cf:maildrop_destination_recipient_limit=1
#
maildropunixnnpipe
flags=DRhuuser=vmailargv=/usr/bin/maildropd${recipient}
#
#SeethePostfixUUCP_READMEfileforconfigurationdetails.
#
uucpunixnnpipe
flags=Fqhuuser=uucpargv=uuxrnza$sender$nexthop!rmail($recipient)
#
#Otherexternaldeliverymethods.
#
ifmailunixnnpipe
flags=Fuser=ftnargv=/usr/lib/ifmail/ifmailr$nexthop($recipient)
bsmtpunixnnpipe
flags=Fq.user=bsmtpargv=/usr/lib/bsmtp/bsmtpt$nexthopf$sender$recipient
mailmanunixnnpipe
flags=FRuser=listargv=/usr/lib/mailman/bin/postfixtomailman.py
${nexthop}${user}
scalemailbackendunix n n 2 pipe
flags=Ruser=scalemailargv=/usr/lib/scalemail/bin/scalemailstore${nexthop}${user}${extension
smtpamavisunixn2smtp
osmtp_data_done_timeout=1200
odisable_dns_lookups=yes
#Amavisfilter
127.0.0.1:10025inetnsmtpd
ocontent_filter=
olocal_recipient_maps=
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 16/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

orelay_recipient_maps=
osmtpd_restriction_classes=
osmtpd_client_restrictions=
osmtpd_helo_restrictions=
osmtpd_sender_restrictions=
osmtpd_recipient_restrictions=permit_mynetworks,reject
omynetworks=127.0.0.0/8
ostrict_rfc821_envelopes=yes
osmtpd_sasl_auth_enable=yes

La estructura del archivo es sencilla: se empieza con el nombre del servicio que estamos
configurando,seguidode o n dependiendodesiqueremosactivarodesactivarlasdiferentes
funcionalidades (cada columna del archivo corresponde a una funcionalidad), y en la lnea
siguienteseespecificanlasdiferentesopcionesquepudieratenerelservicio.

Laprimeralneaquedebemosmodificaresla8,quecorrespondealservicio smtp .
En ella debemos desactivar el chroot, aunque si bien no lo recomiendo, es posible instalarlo
utilizandolajauladelchroot(dehecho,elresultadoseramuchomsseguro),perolacomplejidad
delsistemaaumentatantsimoquepersonalmentenocreoqueseanecesario.

TenencuentaqueahoraestamosnicamenteconfigurandoPostfix,perocuandoterminesdeleer
ste artculo tendremos un sistema de correo en el que adems de l habr muchos otros
servicios que deben interactuar, y tener a Postfix encerrado en un chroot dificultara las cosas
muchsimo.Haymuchasotrasformasdeprotegerelsistema...peroobviamenteestoessolouna
recomendacin ma. Si eres el sysadmin de la NSA y ests montando el Postfix personal de
Obama en el mismo servidor en el que l guarda sus fotos ms comprometidas, quizs s que
serabuenaideaquedejaraselchrootactivado...xDDD

Lo mismo haremos con la linea 14, que corresponde al servicio smtps (es decir, el servicio a
travs del protocolo seguro SSL): descomentamos las lineas (si es que estaban comentadas) y
desactivamos el chroot. Ms adelante ya hablaremos de cmo utilizar el SSL en todos los
serviciosdenuestroservidordecorreo.

Si te fijas en las lneas que van de la 74 a la 76 y las que van de la 79 a la 94 del archivo
master.cf que he puesto de ejemplo, vers que se trata de la configuracin de 2 filtros: uno
llamado mailman yotrollamado smtpamavis .Perodemomentonotepreocupesporesto,nolo
configuresan...yahablaremosdeestosservicioscuandotengamoselrestoterminado...

Una vez terminado master.cf (al menos de momento), si abrimos el otro archivo de
configuracin /etc/postfix/main.cf nos encontraremos todas las directivas que
vienenpreconfiguradaspordefecto.Podisecharleunojoparafamiliarizarosconelarchivoycon
susdirectivas,lamayoradeellastienenunnombrebastantedescriptivo.

Unejemplodestearchivo(remarcandolasdirectivasmsrelevantes)seraalgoas:

/etc/postfix/main.cfdownload

#Debianspecific:Specifyingafilenamewillcausethefirst
#lineofthatfiletobeusedasthename.TheDebiandefault
#is/etc/mailname.
myorigin="pornohardware.com"

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 17/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

smtpd_banner=$myhostnameESMTP$mail_name(Debian/GNU)
biff=no

#appending.domainistheMUA'sjob.
append_dot_mydomain=no

#Uncommentthenextlinetogenerate"delayedmail"warnings
delay_warning_time=4h

#TLSparameters
smtpd_tls_cert_file=/srv/sites/conf/ssl/mail.pornohardware.com.crt
smtpd_tls_key_file=/srv/sites/conf/ssl/mail.pornohardware.com.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database=btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database=btree:${data_directory}/smtp_scache

#See/usr/share/doc/postfix/TLS_README.gzinthepostfixdocpackagefor
#informationonenablingSSLinthesmtpclient.

myhostname=pornohardware.com
mydomain=pornohardware.com
alias_maps=hash:/etc/aliases
alias_database=hash:/etc/aliases
mydestination=pornohardware.com
relay_domains=$mydestination,
pornosoftware.com
mynetworks=127.0.0.0/8,188.165.118.8
mailbox_command=procmaila"$EXTENSION"
mailbox_size_limit=0
recipient_delimiter=+
inet_interfaces=all
transport_maps=hash:/etc/postfix/transport
message_size_limit=25600000

#MySQL
virtual_mailbox_base=/
virtual_uid_maps=static:102
virtual_gid_maps=static:8
virtual_mailbox_maps=mysql:/etc/postfix/mysql/mysql_virt.cf
virtual_maps=mysql:/etc/postfix/mysql/alias.cf
local_transport=virtual

#Amavis
content_filter=smtpamavis:[127.0.0.1]:10024

#Nobackscatter
soft_bounce=no
unknown_local_recipient_reject_code=550

#SASL2Auth
smtpd_sasl_auth_enable=yes
smtpd_sasl_security_options=noanonymous
smtpd_sasl_local_domain=$myhostname
broken_sasl_auth_clients=yes
smtpd_recipient_restrictions=permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_sender,
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 18/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_sasl_authenticated,
reject_unauth_destination,
#check_policy_serviceunix:private/policy,
check_policy_serviceinet:127.0.0.1:10023,
regexp:/etc/postfix/blacklist,
permit
maps_rbl_domains=rbl.maps.vix.com,
relays.mailabuse.org,
relays.ordb.org,
dev.null.dk,
spews.relays.osirusoft.com,
spamhaus.relays.osirusoft.com,
relays.visi.com

DIRECTIVA:MYORIGIN,MYHOSTNAMEYMYDOMAIN
Laprimeradelasdirectivasquetenemosqueconfigurares myorigin (lnea 4 del archivo). Con
stavariabledefinimoselnombredeldominiopordefectodesdeelquevamosaenviarlosemails.

Por ejemplo, si la configuramos con el valor pornohardware.com, cuando enviemos un email


desdeeseservidor(desdelalneadecomandos,conelusuarioroot,porejemplo),eldestinatario
dedichoemailveracomoremitenteladireccinroot@pornohardware.com.

Convienesaberquestadirectivaacepta2tiposdevalores:obienelnombredeldominio,obien
larutadeunarchivoquecontengadichonombre.Esdecir,podemosponer:

myorigin=pornohardware.com

O bien podemos crear un archivo llamado /etc/mailname que nicamente contenga


pornohardware.com ,yconfigurarladirectivaas:

myorigin=/etc/mailname

Amboscasosseraiguales,asquehacerlocomomsoguste.Personalmenteprefieroelprimer
caso por facilidad y simplicidad, as la configuracin est en un nico archivo en lugar de en
varios,perohastaquemealcecomovuestroLderenunNuevoOrdenMundial,estoesunmundo
libre,porloquepodishacerlocomoqueris(aunqueinsisto:solodemomentoxDD).

Asmismo,ladirectiva myhostname (lnea25) especifica el nombre de nuestro servidor (host), y


mydomain (lnea26)elnombredeldominioprincipal(ambasnotienenporqucoincidir,aunquees
frecuentequelohagan).
DIRECTIVA:SMTPD_BANNER
Ladirectiva smtpd_banner (lnea6)permitedefinireltextoquenuestroservidormostrarcuando
seestablezcaunaconexinalpuertodelSMTP.Normalmentenoesalgoqueelusuariovea,por
lo que es indiferente lo que pongamos aqu, pero ten en cuenta que si nos conectamos

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 19/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

manualmente(con telnet ,porejemplo)alpuertodelSMTP,veremosesetexto...yunatacante


podrausarlainformacinquemostremosenl(nombredelservidorSMTPqueestamosusando,
sistema operativo que tenemos instalado, etc) para recopilar datos sobre nuestro servidor como
primer paso a un ataque... pero bueno, eso ya depende de vuestro grado de paranoya.
Personalmente no me gusta dar nunca ms informacin de la necesaria, pero no pasa nada
porquemostremoselnombredelsoftwaredeservidorSMTPqueestamosusando(Postfix)niel
sistemaoperativo(GNU/Linux).
DIRECTIVAS:SMTPD_TLS_KEY_FILEYSMTPD_USE_TLS
SidisponisdeuncertificadoSSLvlidoparaelservidordecorreoqueestismontando,debis
especificar la ruta de los archivos crt y key de dicho certificado. Para eso debis usar las
directivas smtpd_tls_cert_file , smtpd_tls_key_file y smtpd_use_tls (lneas 16 a 20). El uso,
generacinyfirmadecertificadosSSLescapaalmbitodesteartculo,asquenoloexplicar
ahora(yaescribirotroartculoexplicandoestoencuantopueda,mientrastantoasumirquesi
vasausardichasopciones,yasabesmanejarstetipodecertificados).
DIRECTIVAS:ALIAS_MAPSYALIAS_DATABASE
Estasdirectivas(lneas27y28)seutilizanparaindicarlarelacindealiasdelosusuarioslocales
del servidor. Es decir, si queremos evitar (por ejemplo) que el correo que se enve al
usuario root local del sistema se redirija a otro usuario (o a otra direccin), podemos definir
un alias para ese usuario, de forma que los correos que se le enven sern redirigidos
alaliasautomticamente.

Unarecomendadsimaprcticaenlaadministracindeservidoresdecorreosueleserladedefinir
unaliascomomnimoalusuarioroot,deformaquelosemailsqueselepodranllegaraenviar
seanredirigidosaotrousuario.Estosehaceparaevitarquealguienpudieracolapsarelservidor
llenandoelbuzndecorreodelusuariorootconmilesdeenormesemails(yaquenormalmenteel
usuariorootnosueletenerestablecidaunaquotadedisco,niunlmitedeemails,niningunaotra
restriccin).

Postfixutilizaunabasededatospropia para almacenar sta informacin, y la forma de generar


dichabasededatosesmedianteelcomando newaliases ,queconvierteelarchivo /etc/aliases
(texto plano) en /etc/aliases.db (la base de datos que Postfix utiliza). Por lo tanto, nosotros
debemostrabajarsiemprecon /etc/aliases ,yunavezmodificado,ejecutardenuevoelcomando
paraconvertirloenelarchivoquePostfixespera.

Unejemplode /etc/aliases podraserste:

/etc/aliasesdownload

#/etc/aliases
mailerdaemon:postmaster
postmaster:root
nobody:root
hostmaster:root
usenet:root
webmaster:root
www:root
abuse:root
noc:root
security:root
root:fulanito

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 20/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

fulanito:fulanito@dominio.com

Segn ste archivo, todo el correo enviado al usuario local mailerdaemon se redirigira al
usuariopostmaster...ysteasuvezseredirigiraalusuarioroot.

Tambinseredirigiraalusuariorootelcorreoenviadoanobody,hostmaster,usenet,webmaster,
etc..

Finalmente,todoelcorreoenviadohaciarootserredirigidoalusuariofulanito(paraevitarllenael
buznderoot),elcualasuvezserreenviadoalacuentaexternafulanito@dominio.com.
DIRECTIVA:MYDESTINATION
Aqu(lnea29)especificamoslosdominiosdecorreodelosquenuestroservidorsevaaencargar.
Es decir, cuando recibamos un email que vaya a algun usuario de alguno de estos dominios,
asumiremosqueesnuestroeintentaremosentregrseloalusuarioencuestin(buscndoloenla
basededatosquehabamoscreadoantes,oenelarchivo /etc/aliases ).Ysirecibimosunemail
dirigido a un dominio que no es uno de los nuestros (es decir, un dominio que NO est
especificadoenstadirectiva)buscaremoselservidordecorreoqueseencargadelosemailsde
dichodominio,yselopasaremosparaquesealquientratedeentregrseloaldestinatario.
DIRECTIVA:RELAY_DOMAINS
Constadirectiva(lnea30)podemosdecirleanuestroservidorSMTPunaseriededominiosde
los cuales SI debe aceptar los emails, aunque dichos dominios NO sean de los que nos
encargamosensteservidor.Esdecir,con relay_domains podemosdecirleanuestroPostfixque
acepteemailsdedeterminadosdominiosaunqueestosnoestnespecificadosen mydestination .
Estoestilcomobackupdecorreo,yaquesidisponemosde2servidoresdecorreodiferentes,
podemoshacerquecadaunotengaconfiguradoalotroenstadirectiva,deformaquesialgun
daunodelos2estfueradeservicio,elotroirarecogiendoelcorreodelservidorcado,yselos
entregaraposteriormentecuandostevolvieraaestardisponible.Paraestohayqueespecificar
tambinstesegundoservidordecorreoenelregistroMXdelDNSdeldominio,ascomoutilizar
la directiva transport_maps para indicar el servidor al que entregar todo el correo ajeno que
estamosaceptandoalusarstadirectiva(yaloveremosmsadelante).

Noobstante, relay_domains nicamenteseutilizaeninstalacionesunpocomsavanzadasdelo


normal...siloqueestisconfigurandoesunservidordecorreonormalparagestionarlosemails
dealgunodevuestrosdominios,normalmentenoosharfaltautilizarla.
DIRECTIVA:MYNETWORKS
Aquindicamoslasdireccionesdereddeaquellasmquinasquequeremosquenuestroservidor
considerecomomquinasdenuestrared. Esto es til sobre todo para indicar el servidor que el
envo de correo debe estar autenticado cuando dichos emails proceden de Internet (para que
nadiepuedausarnosparaenviarSPAM),perolosdemsservidoresdenuestraredsquepueden
enviaremailssinnecesidaddeautenticacin.
DIRECTIVA:INET_INTERFACES
Como su propio nombre indica, aqu podemos especificar en qu interfaces queremos
que escuche nuestro servidor SMTP. Normalmente el valor que usaremos ser all , ya que lo
mshabitualesquequeramosqueelservidorSMTPestaccesibleentodoslosinterfacesdered
que haya en nuestro servidor, pero podra darse algun caso en el que nos interese que
nicamentepodamosconectarnosalservidorSMTPdesdelocalhostodesdeuninterfacedered
determinado,ignorandolasconexionesdesdelosdems.
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 21/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

DIRECTIVA:TRANSPORT_MAPS
Como dije antes, para poder utilizar nuestro servidor tambin como backup del correo de otro
dominio es necesario el uso de sta directiva, pero tambin se usa para enviar el correo que
queramos a un filtro determinado (configurando dicho filtro previamente en master.cf ) o para
indicarladireccindelservidorSMTPdeundominioconcretodeformamanual.

El valor que debemos indicar en sta directiva es la ruta donde se encuentra el archivo que
contienelainformacindetransportedelcorreo.Esdecir,algocomo:

transport_maps=hash:/etc/postfix/transport

Elformatodestearchivoeselmismoqueconelarchivo aliases queexpliquantes.Debemos


utilizar el archivo /etc/postfix/transport (en texto plano) para indicar la informacin que
queramos, y una vez modificado y guardado dicho archivo, debemos generar el archivo en el
formato que utiliza Postfix... que en ste caso, a diferencia del archivo aliases (que haba que
ejecutarelcomando newaliases paragenerarlo)sehacemedianteelcomando postmap desta
forma:

sudopostmap/etc/postfix/transport

Despusdeejecutaresecomando,obtendremoselarchivo /etc/postfix/transport.db ,quenoes


msqueelarchivo transport peroenelformatorequeridoporPostfix.

Algunosejemplosdearchivo transport quepuedenayudaraentendermejorsufuncionamiento


podranserestos:

Configurar transport para que el correo que llegue para el dominio fulanito.com a
nuestro servidor se reenve a otro servidor SMTP distinto. Esto se usa normalmente
para backup de correo, configurando el DNS del dominio de fulanito.com para que
nuestro servidor sea uno de sus servidores de correo (aadindolo como registro MX)
pero indicando un nmero de prioridad mayor (para que solo enven mensaje de ese
dominioanuestroservidorcuandoelprincipalestcado:

Parahaceresto,loprimeroseraaadirnuestroservidoralregistroDNSde fulanito.com
:

MX5mail.fulanito.com
MX10nuestroservidor.com

Cuando mail.fulanito.com (que como tiene la prioridad ms baja, es el servidor de


correo principal de ese dominio) no funcione, se enviarn los emails a
nuestroservidor.com , y ste a su vez estar configurado para aceptar los emails que
vayanadichodominio,peroenlugardeguardarlosenelmailboxdelusuarioencuestin,

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 22/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

los encolar e ir intentando cada cierto tiempo conectarse a mail.fulanito.com para


entregarledichosemails.

LoprimeroseradecirleanuestroPostfixqueaunquenosencarguemosdelcorreodelos
dominios especificados en la directiva mydestination del /etc/postfix/main.cf (que en
stecasosonlosdeldominio pornoharware.com ),tambindebeaceptarloscorreospara
los dominios especificados en la directiva relay_domains (que sern los que vayan
dirigidosaldominio fulanito.com ):

mydestination=pornohardware.com
relay_domains=fulanito.com

Yporltimo,enelarchivo transport estladireccindelservidorSMTPqueseencarga


deesosemails

fulanito.comsmtp:mail.fulanito.com:25

Con sta configuracin, nuestro servidor de correo ser el encargado de gestionar los
emails del dominio pornoharware.com , pero tambin aceptar los que vayan al dominio
fulanito.com mientras el servidor principal de ste est cado. Y a diferencia de los
emails que le lleguen a nuestro servidor y que vayan a pornohardware.com (que sern
guardadosenelmailboxdeldestinatarioencuestin),losquevayana fulanito.com los
iremosencolando,ytanprontovuelvaafuncionarelservidorprincipaldeesedominio,le
reenviaremostodoslosquehayamosencoladohastaesemomento,deformaquenose
habrperdidoningnemailduranteeltiempoquesuservidorestuvocado.

Configurar transport paraqueelcorreoquellegueaundominioenteroyaunadireccin


concreta, sean enviados a un script en Perl (para que ste haga lo que sea con ellos).
stescriptlohabremosconfiguradopreviamenteenelarchivo master.cf delasiguiente
forma:

filtro_scriptunixnnpipe
flags=Buser=nobodyargv=/usr/bin/perl/opt/scripts/parse_emails.pl

Conesas2lineashabremosconfiguradounfiltrollamado filtro_script ,queenviarel


contenidodelemailmediantepipealcomandoespecificadoenelparmetro argv .

Ahoradebemosindicarenelarchivo transport quemailssonlosquedebenpasarpor


esefiltro:

admin@fulanito.comfiltro_script:
menganito.comfiltro_script:

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 23/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Con sta configuracin (y una vez generado el archivo transport.db con el comando
postmap como expliqu antes) nuestro servidor reenviara al script que habamos
configurado en master.cf con el nombre de filtro_script aquellos emails cuyo
destinatario sea la direccin admin@fulanito.com y cualquier direccin del dominio
menganito.com .

DIRECTIVA:MESSAGE_SIZE_LIMIT
Esta directiva es muy fcil: como su propio nombre indica, especifica el tamao mximo que
podrntenerlosemailsquemanejarnuestroservidorPostfix.

El valor debe ir en bytes, por lo que si queremos establecer un tamao mximo de archivo de
25Mb(que para mi es el lmite mximo que debera permitirse, ya que para archivos ms
grandesnodeberamosutilizarelemail),debemosmultiplicar 25*1024000 ,esdecir:

message_size_limit=25600000

DIRECTIVAS:VIRTUAL_*
Aquvienelobueno...

Estas directivas son las que van a permitir a Postfix conectarse a nuestra base de datos para
comprobarlaexistenciadelosusuariosalosquevandirigidoslosemailsquerecibamos.

Cada vez que nuestro Postfix reciba un email dirigido a una direccin de correo de uno de los
dominios de los que l se hace cargo (los especificados en la directiva mydestination ) se
conectaralabasededatosqueindiquemosaquparacomprobarquedichodestinatarioexiste,y
en caso afirmativo, de cul es el mailbox (directorio del disco del servidor) donde tiene que
almacenardichoemail.

Lasdirectivasprincipalesson:

virtual_mailbox_base:Labasedelarutafsicaeneldiscodurodelservidordondeestn
losmailboxdecadausuario.Elvalormsindicadoes / ,yaquelarutadecadamailbox
laespecificaremosenlabasededatos,segunseaunusuariouotro.
virtual_uid_maps:EluiddelusuarioqueejecutaeldemoniodePostfix.Normalmentees
elusuariopostfix,ysuuidsepuedeverconelcomando vipw .Sistevalorfuerapor
ejemploel102,elvalorquehabraqueconfigurarparastadirectivasera static:102 .
virtual_gid_maps:Igualqueelvaloranterior,perostavezenlugardeluidhace
referenciaalgiddelgrupomail.stevalorsepuedeverconelcomando vigr ,ysidicho
valorfueraporejemploel8,elvalorquehabraqueconfigurarparastadirectivasera:
static:8 .
virtual_mailbox_maps:Aquvamosaindicarlarutafsicadelmailboxdelusuario,que
comoennuestrocasoestenlabasededatos,hayquecrearunarchivodetextoplano
conlaconfiguracinnecesariaparaquePostfixpuedaconectarseadichabasededatos.
Porlotanto,elvalorquepondremosenstadirectivaser
pgsql:/etc/postfix/db/users.cf o mysql:/etc/postfix/mysql/users.cf (despus
crearemosdichoarchivo).

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 24/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

virtual_maps:EnstadirectivapodemosconfigurardndedebePostfixbuscarlos
posiblesaliasdelusuarioqueestbuscando,ydadoqueennuestrocasosta
informacinesttambinenlabasededatos,hayquecrearunarchivodetextoplano
conlaconfiguracinnecesariaparaquePostfixpuedaconectarseadichabasededatos.
Porlotanto,elvalorquepondremosenstadirectivaser
mysql:/etc/postfix/db/alias.cf o pgsql:/etc/postfix/db/alias.cf (despuscrearemos
stearchivotambin).

Amododeresumen,laconfiguracindestasdirectivasseraalgoas:

ParaPostgreSQL:

virtual_mailbox_base=/
virtual_uid_maps=static:102
virtual_gid_maps=static:8
virtual_mailbox_maps=pgsql:/etc/postfix/db/users.cf
virtual_maps=pgsql:/etc/postfix/db/aliases.cf

ParaMySQL:

virtual_mailbox_base=/
virtual_uid_maps=static:102
virtual_gid_maps=static:8
virtual_mailbox_maps=mysql:/etc/postfix/db/users.cf
virtual_maps=mysql:/etc/postfix/db/aliases.cf

Como veis, nicamente se diferencian en las lineas que estn resaltadas (lineas 45 y 46), a la
horadeespecificarqutipodebasededatosvamosausar(PostgreSQLoMySQL).

Y en esos archivos ( /etc/postfix/db/users.cf y /etc/postfix/db/aliases.cf ) nicamente


tenemosqueespecificarlabasededatosalaquePostfixtienequeconectarseparabuscarlos
usuarios y sus alias, el nombre de las tablas, la query SQL que necesitamos para obtener los
datosquequeremos,etc.

Por lo tanto, dichos archivos (segn la base de datos de usuarios que habamos creado antes)
seranalgoas:

ParaPostgreSQL:

#ConfiguraciondePostfixparaobtenerlosdatosdelos
#usuariosvirtualesquehayenlabasededatos
#

hosts=localhost
user=app_postfix
password=QZrRPfzuq
dbname=email
query=SELECT"path_maildir"FROMusersWHERE"email_local"='%s'AND"user_active"='1'

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 25/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

#ConfiguraciondePostfixparaobtenerlosaliasdelos
#usuariosvirtualesquehayenlabasededatos
#

hosts=localhost
user=app_postfix
password=QZrRPfzuq
dbname=email
query=SELECT"email_local"FROMusers_aliasesWHERE"email_alias"='%s'

ParaMySQL:

#ConfiguraciondePostfixparaobtenerlosdatosdelos
#usuariosvirtualesquehayenlabasededatos
#

hosts=localhost
user=app_postfix
password=QZrRPfzuq
dbname=email
query=SELECTpath_maildirFROMusersWHEREemail_local='%s'ANDuser_active='1'

#ConfiguraciondePostfixparaobtenerlosaliasdelos
#usuariosvirtualesquehayenlabasededatos
#

hosts=localhost
user=app_postfix
password=QZrRPfzuq
dbname=email
query=SELECTemail_localFROMusers_aliasesWHEREemail_alias='%s'

Comopodeisver,lanicadiferenciaquehayentresiutilizamosPostgreSQLoMysqlesqueen
ste ltimo los nombres de las columnas NO pueden ir entre comillas, mientras que en
PostgreSQLesobligatorio.

Yconesto,yadeberamostenertodalapartedeconfiguracinbsicadenuestroservidorSMTP
(Postfix)terminada...

Vamos a intentar iniciar el servicio (o reiniciarlo, si ya estaba levantado) para ver si hemos
configuradotodocorrectamente:

$sudo/etc/init.d/postfixstart
[ok]StartingPostfixMailTransportAgent:postfix

Podemos echar un ojo al log para ver si el servicio se ha iniciado correctamente. El log de los
servicios de correo se encuentra en /var/log/mail.log en Debian y similares, y en
/var/log/maillog enCentOS/RedHat.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 26/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Sivemosalgoparecidoaestoenellog(sinningnotromensajechungo),podemosalegrarnos:

postfix/master[27126]:daemonstartedversion2.9.6,configuration/etc/postfix

Si vemos algun mensaje de error, Postfix debera ser lo suficientemente explcito como para
darnosenellogunabuenapistasobredondeestelproblema,quesilohay,astasalturasdela
configuracin seguramente no sea ms que un error de sintaxis o alguna tontera que hayamos
hechoenalgunodelosarchivosquehemoseditadohastaahora.Asquearrglalo!!xDD

Paraprobarquetodofuncionacorrectamente,losuyoestratardeenviarunemailalusuarioque
habamos creado en la base de datos y ver si Postfix es capaz de aceptar el email, obtener la
informacin del destinatario y guardar el email en su mailbox. Y para eso nada mejor que
conectarnosmediantetelnetal puertodelPostfix y teclear los comandos SMTP necesarios para
enviarunemail.

Primeronosconectamos:

$telnetlocalhost25
Trying127.0.0.1...
Connectedtolocalhost.
Escapecharacteris'^]'.
220pornohardware.comESMTPPostfix(Debian/GNU)

Y luego, mediante los comandos SMTP descritos en el RFC2821, primero saludamos al


servidor con HELO (o EHLO), despus identificamos el remitente del email con MAILFROM ,
luegoespecificamosaldestinatariocon RCPTTO ydespusescribimoselcontenidodelemailcon
DATA .Cuandohayamosterminadodeescribirelcontenidodelemail,debemosfinalizarconuna
nuevalineaypunto . paraenviarelmensaje.Despusfinalizamoslaconexincon QUIT .

EstoseraunejemplodelaconversacinquedebemosmantenerconelservidorSMTP:

$telnetlocalhost25
Trying127.0.0.1...
Connectedtolocalhost.
Escapecharacteris'^]'.
220pornohardware.comESMTPPostfix(Debian/GNU)

EHLOremitente.com
250remitente.com
250PIPELINING
250SIZE25600000
250VRFY
250ETRN
250STARTTLS
250AUTHPLAIN
250AUTH=PLAIN
250ENHANCEDSTATUSCODES
2508BITMIME
250DSN

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 27/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

MAILFROM:prueba@bhean.com
2502.1.0Ok

RCPTTO:adama@pornohardware.com
2502.1.5Ok

DATA
354Enddatawith<CR><LF>.<CR><LF>
Estoesunapruebaparaversitodofuncionacorrectamente
.
2502.0.0Ok:queuedasBE75A100D0

QUIT
2212.0.0Bye
Connectionclosedbyforeignhost.

Si hay algun problema lo veremos en el log del servidor, y tambin al ejecutar los comandos
anterioresconel telnet .

AntesdedarporterminadalaconfiguracindelSMTP,hayunpardeopcionesmuyinteresantes
quesepuedenincluirenel main.cf yquepuedenresultarmuytilesenalgunasocasiones:

blacklist:Seutilizaparaespecificardireccionesdeemailconcretas(odominiosenteros)
quedebenserrechazados(porquesepamosquesonspamoslgoas).
whitelist:Igualqueelanterior,peroalrevs.PermiteconfigurarservidoresdelosqueSI
queremosaceptaremails.
check_sender:Permiteaceptarorechazaremailsenfuncindeladireccindel
remitente.
check_body:Igualqueelanterior,peroenfuncindelcuerpodelemail.

Los 2 primeros ( blacklist y whitelist ) forman parte de la configuracin de


smtpd_recipient_restrictions , es decir, una serie de comprobaciones que Postfix hace cuando
recibeunemail.

Todasestascomprobacionesseirnejecutandoporordendeaparicin.Postfixirprocesndolas
una tras otra hasta que una de ellas concuerde con el email recibido. Si ninguna concuerda, el
emailseraceptado.Perosialgunadeellasconcuerda,seaceptarorechazardependiendode
loquehayamosconfiguradoendichacomprobacin.

Unaconfiguracintpicade smtpd_recipient_restrictions enelarchivo main.cf sera:

smtpd_recipient_restrictions=regexp:/etc/postfix/blacklist,
permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_sasl_authenticated,
reject_unauth_destination,

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 28/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

regexp:/etc/postfix/blacklist,
permit

Aquellasquecomienzanporregexp:seutilizanparadefinir(enunarchivoaparte)determinadas
acciones (aceptar el email, rechazarlo, etc) mediante patrones de expresiones regulares. Por
ejemplo,elarchivo /etc/postfix/blacklist podraserparecidoaesto:

/soyun@spamer\.com$/REJECTSPAMisnotallowedhere/ElSPAMnoestapermitidoaqui
/@spam\.com$/REJECTSPAMisnotallowedhere/ElSPAMnoestapermitidoaqui

Nota: Antes de nada, al igual que en los anteriores casos que hemos visto, hay que utilizar el
comando postmap con estos archivos para que Postfix pueda utilizarlos. Simplemente
ejecutamos:

$postmapblacklist

paraquesegenereelarchivo blacklist.db ,quenoesmsqueelarchivo blacklist quehemos


creado,peroenunformatoquePostfixsabemanejar.

Volviendo al ejemplo, segun el archivo blacklist que hemos creado y a la configuracin de


smtpd_recipient_restrictions , si recibiramos un email de la direccin soyun@spamer.com o de
cualquierdireccindeldominio @spam.com ,serarechazadoautomticamente(REJECT)utilizando
"SPAMisnotallowedhere/ElSPAMnoestapermitidoaqui"comorazndelrechazo.

Perosielemailrecibidonocoincidieraconningunadelasexpresionesregularesde blacklist ,
entonces Postfix pasara a la siguiente restriccin que hubiera configurada en
smtpd_recipient_restrictions , en ste caso permit_mynetworks (que significa que estn
permitidoslosemailsenviadosdesdelasmquinasdenuestrared,esdecir,losservidorescuyas
IPsestnespecificadasenladirectiva mynetworks del main.cf ).

Delmismomodopodemosconfigurartambinunarchivoparahacertodolocontrario,esdecir,en
lugar de rechazar aquellos emails que coincidan con las expresiones regulares que
especifiquemos,podramosquererquePostfixaceptaraaquellosemailsquecoincidancondichas
expresiones.

Unejemplodeunarchivo whitelist podraseralgoas:

83.138.165.68OK
5.153.231.4OK

CualquieremailprocedentededichasIPsseraaceptadopornuestroservidor.Porsupuesto,para
utilizarstearchivohabraquegenerartambinelcorrespondiente whitelist.db conelcomando
postmap .

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 29/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Y por ltimo, los archivos check_sender y check_body se basan en el mismo concepto que los
anteriores... solo que como su propio nombre indican, estos comprueban coincidencias con el
remitentedelemailyconelcuerpodelmismo,respectivamente.

Parautilizarlos,nuesto main.cf deberaincluiralgoparecidoaesto:

smtpd_sender_restrictions=regexp:/etc/postfix/check_sender
body_checks=regexp:/etc/postfix/check_body

Yendichosarchivossecrearanlasexpresionesregularesquequeramoscomprobar,juntoconel
cdigodeestadoyelmensajequequeremosquesedevuelvasialgunacoincide:

/@dominiospamer\.com$/550NoqueremosSPAM
/@otrospamer\.com$/550NoqueremosSPAM

/RyanHarding/REJECTNoqueremosSPAM
/Bet2Day/REJECTNoqueremosSPAM

Haymuchasotrasopciones,porloqueosrecomiendoqueleecheisunojoala documentacin
oficialdePostfixsiquereisveralgomsendetalle.

EncuantoalSMTP,porelmomentopodemosdarloporterminado...perorecordarquesiutilizais
unfirewall(y si no lo haceis, deberais! insensatos!) debis abrir los puertos necesarios, que en
stecasosonel25paraelSMTPyel465paraelSMTPSSL...

AhoraqueyatenemosPostfixfuncionandoparaelservicioSMTP,vamosacontinuarconunade
las partes ms importantes para evitar el spam: configurarlo para que nicamente nuestros
usuariospuedanusarloparaelenvodeemails.

CONFIGURACINDESASLPARA
AUTENTICACINDEPOSTFIX
Postfix debe aceptar los emails que vayan destinados a nuestros usuarios... pero qu pasa con
aquellosemailsquenuestrosusuariosquieranenviaraotraspersonas?

Un servidor SMTP abierto es el paraiso de cualquier spamer, por lo que nicamente nuestros
usuarios deben poder utilizar nuestro SMTP para enviar emails. De lo contrario, cualquiera que
descubranuestroservidornosutilizarparaenviarmilesdeemailsatodoelmundo...ynosolo
debemosevitarloparanocontribuirconelenvodespam,sinoquepodranmeterlaIPdenuestro
servidorenalgunadelasmuchsimaslistasnegrasdeservidoresdespamquehayenInternet,lo
queharaquetodoslosservidoresdeemailsdelmundorechazaranelcorreoenviadopornuestro
servidor,inclusolosemailslegtimosenviadospornuestrosusuarios.

Paraevitarlo,debemosconfigurarPostfixparaquesolonuestrosusuariospuedanhacerusodel.
ParallevaracabostatareadebemosutilizarSASL.

SASLharquePostfixsoloacepteenviaremailsdelosusuariosqueseidentifiquen,paralocual
consultar la base de datos a travs de PAM (Pluggable Authentication Modules), que es un
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 30/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

sistemadeautenticacinmuyextendidoenelmundounix/linux.

La instalacin de los paquetes necesarios para la autenticacin de Postfix, si


utilizamosDebian/Ubuntu,sellevaacabodestaforma:

$sudoaptgetinstalllibgsasl7libsasl22libsasl2moduleslibsasl2modulessqlsasl2binlibpammysq

YsiutilizamosRedhat/CentOS,debemosdescargareinstalarlospaquetesmanualmente,yaque
noseencuentranenlosrepositoriosoficialesdestasdistribuciones(elijeDebianlaprximavez,
jejejee)xDD

UnavezinstaladostantoSASL2comoPAM,laconfiguracindeambosesmuysencilla:primero
habilitamos la ejecucin del demonio de SASL en el arranque del servidor y especificamos el
mtododeautenticacin pam ,editandoelarchivo /etc/default/saslauthd :

#
#Settingsforsaslauthddaemon
#Pleaseread/usr/share/doc/sasl2bin/README.Debianfordetails.
#

#Shouldsaslauthdrunautomaticallyonstartup?(default:no)
START=yes

#Whichauthenticationmechanismsshouldsaslauthduse?(default:pam)
#
#AvailableoptionsinthisDebianpackage:
#getpwentusethegetpwent()libraryfunction
#kerberos5useKerberos5
#pamusePAM
#rimapusearemoteIMAPserver
#shadowusethelocalshadowpasswordfile
#sasldbusethelocalsasldbdatabasefile
#ldapuseLDAP(configurationisin/etc/saslauthd.conf)
#
#Onlyoneoptionmaybeusedatatime.Seethesaslauthdmanpage
#formoreinformation.
#
#Example:MECHANISMS="pam"
MECHANISMS="pam"

#ToknowifyourPostfixisrunningchroot,check/etc/postfix/master.cf.
#Ifithastheline"smtpinetnysmtpd"or"smtpinetnsmtpd"
#thenyourPostfixisrunninginachroot.
#Ifithastheline"smtpinetnnsmtpd"thenyourPostfixisNOT
#runninginachroot.
OPTIONS="cm/var/run/saslauthdr"

Despus, configuramos PAM para que se conecte a nuestra base de datos para comprobar el
login/password de nuestros usuarios. Para ello, editamos el archivo /etc/pam.d/smtp (si no
existiera,locrearamos)conlosvaloresdenuestrabasededatos,ydelusuario app_sasl queya
habamoscreadopreviamenteparaestoalcomienzodesteartculo:
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 31/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

authsufficientpam_pgsql.so\\
user=app_sasl\\
passwd=hb9mwJGcc\\
host=127.0.0.1\\
db=email\\
table=users\\
usercolumn=login\\
passwdcolumn=password_crypt\\
crypt=1\\
where=user_active=1\\
debug=1

authsufficientpam_unix_auth.so

accountrequiredpam_pgsql.so\\
user=app_sasl\\
passwd=hb9mwJGcc\\
host=127.0.0.1\\
db=email\\
table=users\\
usercolumn=login\\
passwdcolumn=password_crypt\\
crypt=1\\
where=user_active=1\\
debug=1

accountsufficientpam_unix_acct.so

Obviamente,sienlugardePostgreSQLutilizamosMySQL,debemoscambiar pam_pgsql.so por


pam_mysql.so .

Elparmetro debug sepuedeestablecera 1 paraaumentarlainformacinquesemostraren


ellog,algomuytilparadarnospistassialgonovabien.Sinoqueremosinformacindedebug,
lodejamosa 0 .

Porltimo,editamos(ocreamos,enelcasodenoexistir)elarchivo /etc/postfix/sasl/smtpd.conf
.EnlindicaremosaPostfixquedebeusareldemonioSASLparaautenticaralosusuarios:

pwcheck_method:saslauthd
saslauthd_path:/var/run/saslauthd/mux
mech_list:plain
log_level:5

Esimportantequeelusuario postfix seamiembrodelgrupo sasl ,yaquedelocontrarioPostfix


notendrpermisosparaaccederaSASL.Paraesobastaconejecutar:

$sudousermodGsaslpostfix

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 32/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Por ltimo, debemos asegurarnos que las directivas de configuracin de SASL estn
correctamenteespecificadasenel main.cf dePostfix:

smtpd_sasl_path=smtpd
smtpd_sasl_auth_enable=yes
#smtpd_sasl2_auth_enable=yes
smtpd_sasl_security_options=noanonymous
smtpd_sasl_local_domain=$mydestination
broken_sasl_auth_clients=yes

As como la restriccin adecuada para rechazar aquellos usuarios que NO se identifiquen


correctamente:

smtpd_recipient_restrictions=permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_sasl_authenticated,
reject_unauth_destination,
check_client_accesshash:/etc/postfix/whitelist,
permit

Ylisto!ArrancamoseldemoniodeSASL:

$sudo/etc/init.d/saslauthdstart

Ysitodohaidobien,yadeberamostenerelservidorPostfixcorrectamente.

ParacomprobarqueSASLestcorrectamenteconfiguradoyfuncionacomoqueremos,existeel
comando testsaslauth .Esmuysencillodeutilizar,solohayquepasarleelusuario,elpasswordy
el mtodo de autenticacin que queremos comprobar. Por ejemplo, en nuestro caso bill es el
usuario(campo login delatabla users ),galacticalapassword(cuyovalorencriptadoeselque
habamosguardadoenelcampo password_crypt delatabla users )y smtp esloquequeremos
comprobar,porloqueelcomandoquedaraas:

$testsaslauthdssmtpubillpgalactica
0:OK"Success."

Si ejecutamos el mismo comando, pero con el nombre de usuario o la password mal puesta,
deberamosveralgoparecidoa:

$testsaslauthdssmtpunobillpnogalactica
0:NO"authenticationfailed"

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 33/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Sielresultadodestoscomandosnoeselesperado(siempreossaleauthenticationfailedoalgo
as),podeishabilitarelmododedepuracin(debug)deSASLparaquemuestrelainformacinde
autentificacin en el log, descomentando la linea #debug que os indiqu en el archivo
/etc/pam_pgsql.conf o /etc/pam_pgsql.conf .

Tambinpodeiscomprobarquetodofuncionacomodeberaintentandoenviarunemaildeforma
annima (sin identificarnos) y comprobar que Postfix NO os deja hacerlo... y despus hacer la
mismaprueba,perostavezidentificndonoscorrectamenteantes.

Parahacerlo,denuevorecurrimosalcomando telnet parairviendopasoapasolasrespuestas


quenosdaelservidor.Peroojo!Nodebeisconectarosconelcomando telnet desdeelpropio
servidor o desde cualquier otra mquina de vuestra red, ya que como habamos especificado la
opcin permit_mynetworks en la directiva smtpd_recipient_restrictions del archivo de
configuracindePostfix,todaslasmquinasdenuestraredestanautorizadasaenviaremailsSIN
necesidad de autenticarse. Por eso, la prueba con telnet debeis hacerla desde un servidor
FUERAdevuestrared(esdecir,fueradeloespecificadoenladirectiva mynetworks del archivo
/etc/postfix/main.cf )

ParacomprobarqueelservidorNOaceptaqueenviemosemailssinidentificarnos:

$telnetipdevuestroservidort25
Trying127.0.0.1...
Connectedtolocalhost.
Escapecharacteris'^]'.
220pornohardware.comESMTPPostfix(Debian/GNU)

EHLOremitente.com
250remitente.com
250PIPELINING
250SIZE25600000
250VRFY
250ETRN
250STARTTLS
250AUTHPLAIN
250AUTH=PLAIN
250ENHANCEDSTATUSCODES
2508BITMIME
250DSN

MAILFROM:prueba@bhean.com
2502.1.0Ok

RCPTTO:cualquiercosa@hotmail.com
5545.7.1<cualquiercosa@hotmail.com>:Relayaccessdenied

QUIT
2212.0.0Bye
Connectionclosedbyforeignhost.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 34/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Como podis ver, estamos intentando enviar un email desde nuestro servidor de correo a la
direccin cualquiercosa@hotmail.com ,aloculstenosrespondeconun Relayaccessdenied .Es
decir,queNOpodemosenviaremailsadireccionesquenoseanlasdenuestropropioservidor,a
noserquenosidentifiquemospreviamente.

Si en lugar del mensaje 5545.7.1Relayaccessdenied obtenis un 2502.1.5Ok significa que


vuestro servidor est aceptando CUALQUIER EMAIL para CUALQUIER DESTINATARIO (es
decir,soisloqueseconsideraunOpenRelay),ydeseras,paracuandohayaisterminadodeleer
sta frase ya habr mediointernet conectado a vuestro servidor enviando spam a todo el
planeta... as que parar inmediatamente Postfix, cerrar el puerto SMTP en el firewall o lo que
queris, pero detener el servicio inmediatamente y revisar la configuracin de SASL, PAM y
PostfixantesdevolveraabrirloaInternet...

Quizs haya algo en el log que os ayude a encontrar el problema. Recordar que el log de los
serviciosdecorreoseencuentraen/var/log/mail.logenDebianysimilares,yen/var/log/maillogen
CentOS/RedHat.

INSTALACINDECOURIERCOMOSERVIDOR
POP/IMAP
As como para poder enviar emails necesitamos un servidor SMTP, para poder acceder a ellos
para su lectura necesitamos un servidor POP o IMAP, que son los 2 protocolos ms extendidos
paraesefin.

Podismontarambosonicamenteuno...aunquelaverdadesquePOPnotieneprcticamente
ninguna ventaja hoy en da, cada vez se usa menos, y en mi opinin no tiene ningn sentido
mantenerlo. Si os quedsteis anclados en los 90 y echis de menos geocities, los gifs
animados con smbolos de @rrobas dando vueltas, o simplemente eres un Amish montando el
servidordecorreodetualdea,POPesloquebuscas.Paratodoslosdems,IMAPeslasolucin.

Noquieroextendermemucho,peroparaquequedeunpocomsclaro,ospondrunapequea
tablacomparativasobrealgunasdelasdiferenciasmsnotablesentreambosprotocolos:

POP3 IMAP4
Depende
Permitetrabajaroffline Si
delcliente
Nmerodetransacciones Bajo Alto
Permitetrabajaronline No Si
Veremails/cabecerassin
No Si
descargarlospreviamente
Ndecarpetasgestionables 1 Ilimitado
Gestindecarpetas No Si
Buzonesmultiusuario(acceso
No Si
mltiple)
Estados/flagsenmensajes No Si
Bsquedaenmensajes No Si
GestinMIME No Si

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 35/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

POP3 IMAP4
Mecanismosdeextensinde
No Si
funciones
Firmacifrada No Si
Autenticacinprotegida APOP Nativo

Como podis ver, el uso de POP hoy en da no tiene ningn sentido... por lo que a no ser que
necesiteis implementarlo por algn extrao motivo, usar siempre IMAP. De hecho, aunque se
puedenutilizarambosalmismotiempoNOosrecomiendoque lo hagais, ya que si un usuario
(porejemplo)sedescargaelcorreoutilizandoPOP,simstardeaccedeporIMAPnopodrver
nadayaqueunavezquePOPdescargaelcorreo,steseeliminadelservidor.Yalnopermitir
POP el uso de carpetas, nicamente se descarga el correo delINBOX (bandeja de entrada), lo
que significa que si habeis organizado vuestros mensajes en carpetas utilizando IMAP, esos
mensajesnopodreisdescargarlosdesdePOP.

Lo dicho, POP es de nenazas, as que voy a explicar nicamente la de IMAP. No obstante, si


quereisinstalartambinelservidorPOP,suinstalacinesmuysencilla(ysimilar).

Vamos al tema: as como para el uso del SMTP


utilizbamos Postfix, para el uso de IMAP (o POP)
vamosautilizarCourier.

Courier es un servidor POP/IMAP que se encargar


deaccederalosmensajesdecorreoelectrnicoque
previsamentenuestroPostfixhayaalmacenadoenlosbuzonesdenuestrosusuarios.

Comosiempre,loprimeroquetenemosquehaceresinstalarlospaquetesnecesarios.

EnDebian/Ubuntu:

sudoaptgetinstallcourierauthdaemoncourierimapcourierimapsslcourierauthlibmysqlcourieraut

EnRedhat/CentOS:

PordesgraciaenstasdistribucionesnoexistenpaquetesRPMensusrepositoriosoficiales,as
que o bien lo instalais compilando su cdigo fuente a mano (podis descargarlo aqu) o bien
generais los RPMs vosotros mismos tal y como se explica aqu. Obviamente es mucho
ms incmodo que utilizar los paquetes de los repositorios oficiales, pero si hubirais elegido
unadistribucincomoDiosmandanotendraisquepreocuparos...

Encualquiercaso,unavezinstalado,laconfiguracindeCourieresmuysencilla:nicamentehay
queeditar3archivos:

/etc/courier/authdaemonrc
/etc/courier/imapd
/etc/courier/authpgsqlrc(o/etc/courier/authmysqlrc,segnloqueestemosusando)

Enelprimerodeellos( /etc/courier/authdaemonrc )nicamentehayqueindicarqumduloesel


quesevaaencargardeautenticaralosusuarios(authpgsql,authmysql,etc).

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 36/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

##NAME:authmodulelist:2
#
#Theauthenticationmodulesthatarelinkedintoauthdaemond.The
#defaultlistisinstalled.Youmayselectivelydisablemodulessimply
#byremovingthemfromthefollowinglist.Theavailablemodulesyou
#canuseare:authuserdbauthpamauthpgsqlauthldapauthmysqlauthcustomauthpipe

authmodulelist="authpgsql"

Enelarchivo /etc/courier/imapd sepuedenconfigurarvariascosas(direccinderedypuertoen


elqueescucharnuestroservidor,opcionesquesepasarnaldemonio imapd ,etc)peronosotros
solovamosacambiar2deellas:MAXPERIPeIMAPDSTART.

La primera de ellas indica el nmero de conexiones por IP que nuestro servidor IMAP puede
atender. El valor por defecto suele ser vlido en la mayora de los casos, pero en el protocolo
IMAPseestableceunaconexionporcadacarpetaIMAPalaquenosconectemos,porloquesi
tenemos varias cuentas y leemos el correo de varias carpetas, puede que necesitemos
aumentarlo.Elvalorpordefectoes50,peroyosueloconfigurarloa120:

##NAME:MAXPERIP:0
#
#MaximumnumberofconnectionstoacceptfromthesameIPaddress

MAXPERIP=120

YencuantoaIMAPDSTART,simplementehayqueestablecerloa YES paraqueelservicioIMAP


seinicieautomticamentealarrancarelservidor:

##NAME:IMAPDSTART:0
#
#IMAPDSTARTisnotuseddirectly.Rather,thisisaconvenientflagto
#bereadbyyoursystemstartupscriptin/etc/rc.d,likethis:
#
#./etc/courier/imapd
#
#casex$IMAPDSTARTin
#x[yY]*)
#/usr/lib/courier/imapd.rcstart
#;;
#esac
#
#ThedefaultsettingisgoingtobeNO,soyou'llhavetomanuallyflip
#ittoyes.

IMAPDSTART=YES

Ya solo quedara el archivo /etc/courier/authpgsqlrc (o /etc/courier/authmysqlrc , segn


proceda),queeselarchivoenqueseespecificanlosvaloresdelabasededatosnecesariospara
que Courier pueda acceder a ella para identificar a los usuarios, obtener la rutas hacia

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 37/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

sus mailbox (los directorios que contendrn los mensajes de cada usuario) y el resto de
informacinnecesaria.

Lo primero es la informacin de conexin (servidor, usuario/password, etc). Dicho


usuario/passwordsonlosqueyahabamoscreadocuandoinstalamoslabasededatos(arriba,en
elapartadoCreacindelabasededatosdeusuarios).

Estainformacindeconexinseindicautilizandolasdirectivas:

PGSQL_HOST:Direccindelservidordebasededatos.Ennuestrocasoeslocalhost,ya
quetantoCouriercomolabasededatosestnenelmismoservidor.
PGSQL_PORT:Puertoenelqueestescuchandolabasededatos.Elpuertopordefecto
dePostgreSQLesel5432yeldeMySQLesel3306.
PGSQL_USERNAME:UsuarioqueutilizarCourierparaconectarsealabasededatos.
Nosotroshabamoscreadoelusuarioapp_courierparaesto.
PGSQL_PASSWORD:PassworddelusuariodefinidoenPGSQL_USERNAME.

NOTA: Si por algn motivo quisiramos conectar a un servidor de base a travs de un socket
localenlugardeatravsdelared,debemoseliminarladirectivaPGSQL_HOSTeindicarenla
directivaPGSQL_PORTelnmerodedichosocket.Porejemplo,sinuestrosocketlocaldebase
dedatoses /tmp/.s.PGSQL.5400 ,debemosindicarelvalor 5400 enPGSQL_PORT.

Elarchivodeconfiguracinquedaraentoncesas:

##NAME:LOCATION:0
#
#Theserverhostname,port,userid,andpasswordusedtologin.

PGSQL_HOSTlocalhost
PGSQL_PORT5432
PGSQL_USERNAMEapp_courier
PGSQL_PASSWORDOQ5JQ3+pNR

Por supuesto, si en lugar de PostgreSQL estuviramos utilizando MySQL, debemos cambiar el


PGSQL_porMYSQL_enlasdirectivasdelarchivodeconfiguracin.Yasequeesobvio,perolo
comentoporsiacasoosestislimitandoacopiarypegarsinenterderloqueestamoshaciendo
(merluzos!!hayqueleerlotodo,queparaalgollevosemanasescribiendosteartculo!xDDD).

El resto del archivo de configuracin es muy sencillo, y casi todas sus directivas son
autoexplicativas,perovamosadarunpequeorepasoalrestodeellas:

PGSQL_DATABASE:Aquseindicaelnombredelabasededatosquecontienelas
tablasdondeseencuentralainformacindelosusuarios.
PGSQL_USER_TABLE:Nombredelatablaquecontienelainformacindelosusuarios.
PGSQL_CRYPT_PWFIELD:Nombredelcampo(columna)quecontiene
lapasswordencriptadadelosusuarios.
DEFAULT_DOMAIN:Sidefinimossteparmetro,sialguienintentaautenticarse(por
ejemplo)conelusuariofulanito,Courierlosustituirpofulanito@DEFAULT_DOMAIN.
Estoestilcuandoelusernamedenuestrosusuariosessudireccindeemail,ynuestro
servidornicamenteseusaparaelcorreodeunsolodominio,deformaquelagente
puedeutilizarelusernamesintenerqueteclearelrestohastacompletarladireccin
(@DEFAULT_DOMAIN).
PGSQL_UID_FIELD:UIDdelusuariolocaldelservidorqueseusarparaaccederalos
emailsdelservidor.Tpicamentesesueleutilizarelusuariodelsistemapostfix,yaqueal
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 38/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

guardarsedichosemailsusandoeseusuario,nosaseguramosasdetenerpermisospara
accederadichosarchivos.ParasaberquUIDtieneunusuarioencuestinpodemos
usarelcomando id (pasndolecomoparmetroelnombredelusuariodelque
queremosobtenerlainformacin).Porejemplo: idpostfix .Ennuestrocasoelvalor
obtenidoesel103,peroasegratedecomprobarculeselquenecesitastuyaque
puedevariardeunsistemaaotro.
PGSQL_GID_FIELD:EnstecasohayqueindicarelGIDdelgrupoqueutilizaremos
paraaccederalosemailsdelservidor.Tpicamentesesueleutilizarelgrupomail,porlo
queparaaveriguarelgiddedichogrupopodemosutilizardenuevoelcomando idmail .
Ennuestrocasoelvalorobtenidoesel8,peroaligualqueantes,asegratede
comprobarculesstegidentusistema.
PGSQL_LOGIN_FIELD:Nombredelcampo(columna)quecontienelosusernamesde
losusuarios.
PGSQL_HOME_FIELD:Nombredelcampo(columna)quecontienelarutaalahomedel
usuario(noconfundirconlarutadelosmailbox).
PGSQL_MAILDIR_FIELD:Nombredelcampo(columna)quecontienelarutade
losmailboxesdelosusuarios.Normalmentelosmailboxsuelenestarenlaruta
$HOME/Maildir ,donde $HOME eselvalorespecificadoenPGSQL_HOME_FIELD.
PGSQL_QUOTA_FIELD:Nombredelcampo(columna)quecontienelainformacinsobre
lacuotadediscodelosusuarios.
PGSQL_WHERE_CLAUSE:Aqupodemosindicarunacondicinquedeberncumplir
losusuariosparapoderidentificarseennuestroservidor.Lacondicinaquespecificada
seaadircomoWHEREenlaconsultaSQLqueCourierejecutarcuandounusuario
intenteautenticarseennuestroservidor.Esmuytilpara(porejemplo)restringir
temporalmenteelaccesoaunusuarioenconcretosintenerqueeliminarlo,simplemente
utilizandounacolumna"user_active"comolaquehemoscreadoenlatabladeusuario,o
algosimilar.Osquedarmsclaroviendoelejemplodelarchivodeconfiguracinque
pondracontinuacin.

Porlotantoelarchivo /etc/courier/authpgsqlrc deberaquedarmsomenosas:

PGSQL_HOSTlocalhost
PGSQL_PORT5432
PGSQL_USERNAMEapp_courier
PGSQL_PASSWORDOQ5JQ3+pNR

PGSQL_DATABASEemail
PGSQL_USER_TABLEusers

PGSQL_CRYPT_PWFIELD"password_crypt"
PGSQL_UID_FIELD103
PGSQL_GID_FIELD8
PGSQL_LOGIN_FIELD"login"
PGSQL_HOME_FIELD'/'
PGSQL_NAME_FIELDconcat("name","","surname")
PGSQL_MAILDIR_FIELD"path_maildir"
PGSQL_WHERE_CLAUSE"imap_access"='1'AND"user_active"='1'

Y con esto ya deberamos tener Courier listo... as que ya solo queda levantar los servicios.
Primero authdaemon (para autenticar a los usuarios) y luego los servicios propios de IMAP e
IMAPSSL :

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 39/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

$sudo/etc/init.d/courierauthdaemonstart
$sudo/etc/init.d/courierimapstart
$sudo/etc/init.d/courierimapsslstart

Configurar el servicio IMAP a travs deSSL(algo MUY importante) no tiene ningn misterio. Si
vais a utilizar certificados SSL generados por vosotros mismos y autofirmados, basta con que
levanteis el servicio courierimapssl sin ms. Y si tenis certificados SSL propios y firmados,
solohayqueconfigurardichoscertificadosenelarchivo /etc/courier/imapdssl antesdelevantar
elservicio,ylisto.

Es importante que os asegureis de tener instalado en el servidor el servicio Gamin, un sub


sistemadeFAM(FileAlterationMonitor).Setratadeundemonioencargadodenotificaraalgunos
programas(aCourier,porejemplo)loscambiosqueseproducenenalgunosarchivosdeldisco.
EsnecesarioinstalarloporqueCourierimapnecesitaestaraltantodeesoscambiosalahorade
notificaralosclientesdecorreo.Sinoloinstalamos,algunosclientesdecorreopodranmostrar
incmodosmensajesdeerror(aunqueelfuncionamientodelcorreonodeberaverseafectadoen
lamayoradeloscasos).

Detodasformas,instalarloestansencillocomosiempre:

EnDebian/Ubuntu:

$sudoaptgetinstallgamin

EnRedHat/CentOS:

$sudoyuminstallgamin

Unavezhechoesto,yadeberafuncionarperfectamente(tantolarecepcindeemailsmediante
SMPT>PostfixcomoelaccesoaellosmedianteIMAP>Courier).Asquesitodohaidobien,ya
deberaispoderconfigurarlacuentaenvuestroclientedecorreo.Existenmuchsimosclientesde
correodiferentes(Thunderbird,Evolution,KMail,etc)porloquenoentrarendetallessobrecmo
configurarunacuentaenellos,peronotieneningnmisterio...esigualquecualquierotracuenta
decorreoquehayaisconfigurado,soloqueindicandolosdatosdeconexindevuestroservidor
(ladireccindelhostdondelohabeisinstalado)ylosdatosdeaccesoavuestracuenta(segnel
ejemplo que os he puesto, usuario bill , password galactica y direccin de email
adama@pornohardware.com ).

Por supuesto, y al igual que hicimos al configurar Postfix, debemos abrir los puertos necesarios
paralosserviciosdeIMAPeIMAPSSLennuestrofirewall.Debeisabrirelpuerto143paraIMAP
yel993paraIMAPSSL.

Sillegadosastepuntonopudiraisconectaros,onopudiraisaccederconelusuario/password
o hubiera algun otro error o comportamiento extrao, podis editar el archivo
/etc/courier/authdaemonrc yhabilitarladirectiva DEBUG_LOGIN=1 paraaumentarelniveldedetalle
enloslogsdelprocesodeautenticacin.Silohaceis,noolvideisreiniciarlosserviciosde(courier
authdaemon,courierimapycourierimapssl)paraquesereflejenloscambios.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 40/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Ellogpordefectodondeseguardatodalainformacinrelativaalcorreo(Postfix,Courier,etc)es
/var/log/mail.log enDebian/Ubuntu,o /var/log/maillog enRedhat/CentOS.

INSTALACINDEANTIVIRUSYANTISPAM
Noseconcibeunservidordecorreohoyendasinestos2servicios.

Debido a la ingente cantidad de emails que se intercambian cada da en Internet, el correo


electrnico se ha convertido para los virus en el medio preferido para transmitirse por todo el
mundo.

En mis tiempos, la nica forma de coger un virus en tu ordenador era que alguien te pasara
undisqueteinfectado(muchosnosabrisniloqueessodeldisquete,jejeje).Elnmerodevirus
en aquella poca era bajsimo, e incluso los mejores de ellos tardaban muchsimo tiempo en
propagarse(yaunas,jamslograbanexpandirsecomolohacenhoyenda).

La llegada del correo electrnico facilit la comunicacin entre personas y sistemas por todo el
mundo, sin importar las distancias fsicas que hubiera entre los interlocutores de dichas
comunicaciones. Rpidamente los virus aprovecharon sta via para propagarse como lo hacen
hoyenda.

Por desgracia, el usuario en general sigue siendo un mero usuario tonto (es decir, que
prcticamentedesconoceelfuncionamientodecualquiersistema,yselimitanicamenteausarlo
casi a ciegas) por lo que no se puede confiar en que tengan un antivirus actualizado en sus
ordenadores.Estaesunadelasrazonesprincipalesporlasqueesresponsabilidaddelservidor
decorreointerceptaryeliminarlosvirusantesdequelleguenalusuario(adems,esmssencillo
ytienemssentidoacabarconellosANTESdequelleguenasudestinatarioquedejarstalabor
ensusmanos).

Yconrespectoalspam,lalacradeInternetquemsodio,sucedeexactamentelomismo.

Cualquier persona con unos minimsimos conocimientos tecnolgicos puede enviar miles de
emailsamillonesdepersonasencuestindeminutossininvertirniunsoloeuro,yademssin
quelosdestinatariosdedichosemailspuedansaberinclusoquinselosestenviado.

Esto es aprovechado cada minuto del da por miles de spammers, que inundan los mailbox de
todoelmundoconpublicidadnosolicitada.

Yaunqueparezcaunaprcticainofensiva,elspamnosolocuestaingentescandidadesdedinero
a las empresas y organizaciones que sostienen Internet debido a las grandes y
sobredimensionadas infraestructuras que deben manejar para cubrir ste uso extra del correo
electrnico (se estima que el 94% del correo mundial es spam, sino que provoca una enorme
prdidadetiempoyrecursospersonalesaquienespadecenstetormento.

Por todos estos motivos, un buen antivirus y algunos filtros antispam son absolutamente
necesariosentodoslosservidoresdecorreodelmundo.

Para instalar y configurar estos elementos, la mejor forma de hacerlo es mediante un filtro de
contenidos.Yenmiopinin,elmejorenstecampoesAmavis.

Podramos definir Amavis (o mejor dicho, amavisdnew, que es como se llama realmente) como
uninterfacequeconectaelservidordecorreoconotrosprogramas(antivirus,antispams,etc)de
formatransparenteparaelusuario.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 41/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Cuandounemailllegaanuestroservidordecorreo,steseloentregaaamavisdnew,elcualse
encargadepasrseloalosdistintosfiltrosquetengamosconfigurados,ysielmensajelossupera,
elservidordecorreoloalmacenaenelbuzndeldestinatariocorrespondiente.Encasocontrario
se pueden llevar a cabo diferentes acciones dependiendo de qu filtro haya sido el que ha
bloqueado el email. Por ejemplo, se puede configurar para que si un email contiene un virus,
automticamenteseenveunmensajealapersonaquehaenviadoelemailadvirtindoledeque
suordenadorpodraestarinfectado.

Existenvariosprogramasantiviruslibres,gratuitosyquefuncionan
muy bien en GNU/Linux. Personalmente el que ms me gusta
esClamAV.

Unodelospuntosmsimportantesenestetipodesoftwareesla
rpida localizacin e inclusin en sus bases de datos de los
nuevosvirusquesevanencontrando.

Gracias a los propios usuarios de ClamAV y a sitios


como Virustotal.com a medida que se van identificando nuevos
virus, troyanos o cualquier otro tipo de malware, estos son
rpidamente introducidos en ClamAV, por lo que se su base de
datosdevirusseactualizadiariamenteparaquenuestroservidorsemantengasiemprealda.

El software que se encarga de mantener ClamAV actualizado es el llamado Freshclam, el cual


formapartedelpaqueteClamAV.

Yconrespectoalosfiltrosantispam,tambinexistenvarios...aunqueelquemsdestacaenel
mundoopensourceesSpamAssassin.

Dispone de multitud de filtros y


reglas,yselepuedeentrenarparaquevayaaprendiendoaidentificarqumensajessonspamy
culesno.

El funcionamiento normal de SpamAssassin es el de ir sometiendo los mensajes a


diferentes tests, los cuales van emitiendo una puntuacin en funcin de si consideran el
mensaje sospechoso de ser spam o no. Estas puntuaciones individuales de cada test se van
sumando, y si al finalizar todos el nmero obtenido supera el umbral que hayamos definido, el
mensajeseconsiderarspamyobienserrechazado(deformaqueeldestinatariojamsllegar
nisiquieraaverlo)obienseentregarasudestinatarionormalmente,peroaadiendounaserie
de cabeceras al email que lo identifiquen como spam para que sea el usuario el que determine
quhacerconl.

Ambosprogramas(ClamAVySpamAssassin)estnperfectamenteintegradosenAmavis,porlo
quelainstalacindetodoestoes(comodecostumbre)algotrivialenGNU/Linux:

EnDebian/Ubuntu:

$sudoaptgetinstallamavisdnewspamassassinclamavdaemonclamavfreshclam

EnRedHat/CentOS:

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 42/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

$sudoyuminstallamavisdnewclamavspamassassin

Losvirusenlosemailssuelenirenlosarchivosadjuntosquehayenellos...perodichosarchivos
a veces estn comprimidos, lo cual impide que el antivirus pueda analizarlos. Para evitar esto,
debemosinstalarlosdescompresoresdelosformatosmscomunes(zip,arj,rar,etc).

Paraello,instalamoslossiguientespaquetes:

EnDebian/Ubuntu:

$sudoaptgetinstallbzip2gzipxziprpmlzopunrarfreearjp7zipfullzooarccabextract

EnRedHat/CentOS:

$sudoyuminstallbzip2gziprpmlzoparjp7zipunzooarccabextract

ParaconfigurarAmavisdebemoseditaralgunosarchivos:

/etc/amavis/conf.d/05domain_id:Enstearchivodebemosindicareldominioprincipal
denuestroservidor.Haydosformasdehacerlo:obienasignandodirectamenteelnombre
deldominioalavariable$mydomain,obienindicandoendichavariablequeobtengael
valordelarchivo /etc/mailname ,conloqueindicaramoseldominioendichoarchivo.En
nuestrocasoutilizamos pornohardware.com .
/etc/amavis/conf.d/05node_id:Enstearchivodebemosindicar(delmismomodoque
enelanterior)elnombredelservidor.Ennuestrocasoutilizamos mail.pornohardware.com .
/etc/amavis/conf.d/15content_filter_mode:Descomentandolalineacorrespondiente
enstearchivohabilitaremoselusodelantivirus(enstecaso,ClamAV)ydelantispam
(Spamassassin).SiporalgnmotivonoquisiramosqueAmavisutilizaraalgunodelos
dos,bastaracondejarcomentadalalineacorrespondiente.
/etc/amavis/conf.d/20debian_defaults:Lamayoradelasopcionesdeconfiguracinse
encuentranaqu.Losnombresdelasvariablessonbastantedescriptivosyhaybastantes
comentariosenelarchivo.Lasprincipalesopcionesquedebemosconfigurarson:
$sa_spam_subject_tag :Aqudefinimoselprefijoqueseantepondralttulodelos

emailsqueAmavisconsiderecomospam.Yosueloutiliza [SPAM] (incluyendoun


espacioenblancoalfinal).
$final_banned_destiny :AqudefinimoslaaccinquequeremosqueAmavisllevea
cabocuandounmensajesea*baneadoporcontenerunvirus.Losposiblesvalores
son:
D_DISCARD :RechazaelmensajeSINinformaralremitente.

D_BOUNCE :Rechazaelmensajeinformandoalremitenteatravsdeamavisd
new(steeselvalorqueyosueloutilizar).
D_REJECT :RechazaelmensajeinformandoatravsdelMTA.
D_PASS :Aceptaelmensaje.
:Lomismoqueenelcasoanterior,peroparalosmensajesque
$final_spam_destiny
Amavishayamarcadocomospam.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 43/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Despus,debemosaadirelusuariosobreelqueseejecutaeldemoniodeClamAV( clamav )al


grupo amavis para que ste tenga los permisos necesarios. Para ello utilizamos el comando
vigr ,osiloprefieres,atravsdelcomando:

$sudousermodGamavisclamav

EncuantoaSpamassassin,porahoranicamenteeditamoselarchivo /etc/default/spamassassin
paraqueeldemonioseinicie,poniendoa 1 elvalordeladirectiva ENABLED :

#/etc/default/spamassassin
#DuncanFindlay

#WARNING:pleasereadREADME.spamdbeforeusing.
#Theremaybesecurityrisks.

#Changetoonetoenablespamd
ENABLED=1

ParaconectarAmavisanuestroSMTP,debemosindicarenlaconfiguracindePostfixelpuerto
enelqueAmavisescucha.Editamossuconfiguracin(archivo master.cf )yloindicamos:

#
#Otherexternaldeliverymethods.
#
ifmailunixnnpipe
flags=Fuser=ftnargv=/usr/lib/ifmail/ifmailr$nexthop($recipient)
bsmtpunixnnpipe
flags=Fq.user=bsmtpargv=/usr/lib/bsmtp/bsmtpt$nexthopf$sender$recipient
scalemailbackendunixnn2pipe
flags=Ruser=scalemailargv=/usr/lib/scalemail/bin/scalemailstore${nexthop}${user}${extension
mailmanunixnnpipe
flags=FRuser=listargv=/usr/lib/mailman/bin/postfixtomailman.py
${nexthop}${user}
smtpamavisunixy2smtp
osmtp_data_done_timeout=1200
odisable_dns_lookups=yes
#FiltroparaAmavis/Postfix
127.0.0.1:10025inetnysmtpd
ocontent_filter=
olocal_recipient_maps=
orelay_recipient_maps=
osmtpd_restriction_classes=
osmtpd_client_restrictions=
osmtpd_helo_restrictions=
osmtpd_sender_restrictions=
osmtpd_recipient_restrictions=permit_mynetworks,reject
omynetworks=127.0.0.0/8
ostrict_rfc821_envelopes=yes

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 44/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

AhorasolohayqueindicarenelotroarchivodeconfiguracindePostfix( main.cf )queelfiltrode


contenidosquevamosausarestendichopuerto:

virtual_mailbox_maps=mysql:/etc/postfix/mysql/mysql_virt.cf
virtual_maps=mysql:/etc/postfix/mysql/alias.cf
local_transport=virtual

#Amavis
content_filter=smtpamavis:[127.0.0.1]:10024

soft_bounce=no
unknown_local_recipient_reject_code=550

Ahoraqueesttodoconfigurado,iniciamoslosserviciosqueacabamosdeinstalaryconfigurar,y
reiniciamosPostfix:

$sudo/etc/init.d/clamavdaemonstart
$sudo/etc/init.d/clamavfreshclamstart
$sudo/etc/init.d/spamassassinstart
$sudo/etc/init.d/amavisstart
$sudo/etc/init.d/postfixrestart

Sihubieraalgnproblemaoalgunodelosdemoniosnoseiniciaracorrectamente,yasabesque
todalainformacindelosprocesosrelacionadosconelemailesten /var/log/mail.log (siusas
Debian/Ubuntu)oen /var/log/maillog (siusasRedhat/CentOS).

Pero contra el SPAM nunca se est completamente protegido... y obviamente Spamassasin nos
ayudar a frenarlo, pero no lo evitar al 100%. Por lo tanto, an hay ms cosas que podemos
hacerparacompletarnuestrosistema.
POSTGREY
LaprimeradeellassellamaPostGrey,yaunquehaygentequepiensaqueestanefectivacomo
molesta para el usuario, es una de las mejores medidas que podemos implantar para reducir la
cantidaddespamquellegueanuestrosbuzones.

Elprotocolodeenvodecorreoestablecequesiseintentaenviarunemailaunservidor,yste
responde con un cdigo de error 45x (error temporal), se debe intentar volver a enviar el email
pasadountiempo(normalmente5minutosdespus).

La mayora de los servidores de correo que utilizan los spamers no estn configurados
correctamente,yNOreintentanelenvodeunemailsistefalla.

Postgreyharquesiemprequenosllegueunemaildeundestinatariodesconocido,serechaceel
emailyserespondaconunerror45x.Sielservidorestcorrectamenteconfigurado,reintentar
denuevolaentregapasadosunosminutos...ycuandolohaga,Postgreyloaceptar.Adems,se
guardar dicho remitente en una base de datos propia de Postgrey, por lo que a partir de ese
momento se aceptarn los emails de ste remitente a la primera, sin necesidad de volver a
rechazarlos.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 45/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Puede que sea un poco molesto en alguna circunstancia (sobre todo si necesitamos recibir un
email urgente de alguien que no nos ha escrito antes) ya que tardaremos ms de lo normal en
recibirdichoemail,perograciasaestoevitaremosrecibirunmontndespam.

LainstalacindePostgreyesigualdesencillaqueelresto:

EnDebian/Ubuntu:

$sudoaptgetinstallpostgrey

EnRedHat/CentOS:

$sudoyuminstallpostgrey

Unavezinstalado,elpuertopordefectoenelqueestarescuchandoPostGreyesel10023,as
quetenemosqueaadirlocomounanuevarestriccinennuestroPostfix(enelmismositiodonde
anteriormentehabamosconfiguradolasblacklistsyelrestoderestricciones):

smtpd_recipient_restrictions=regexp:/etc/postfix/blacklist,
permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_serviceinet:127.0.0.1:10023,
regexp:/etc/postfix/blacklist,
permit

YapodemosiniciareldemoniodePostGrey:

$sudo/etc/init.d/postgreystart

YreiniciarPostfixparaquetengaencuentalanuevarestriccin:

$sudo/etc/init.d/postfixrestart

Apartirdestemomento,cadavezquenosllegueunemail,Postfixlorechazartemporalmente
paraqueelservidordecorreodelremitentelointentedenuevopasadosunosminutos.

Si transcurrido ese tiempo el servidor de correo de dicho remitente reintenta el envo de nuevo,
Postfixloaceptarnormalmente,ymarcarensubasededatosinternaqueyanosernecesario
volverarechazarcorreosdeesedestinatarioenelfuturo.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 46/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Sialgunavezmigraiselservidordecorreoaotroservidordiferente,yquereisconservarstabase
dedatosinternaconlosdatosquePostGreyhayaconseguidohastaesemomento,bastaconque
migreistambinelcontenidode /var/lib/postgrey/ alnuevoservidor.

Y por supuesto, podis especificar tambin excepciones (whitelists) para que PostGrey no
rechace los emails ni siquiera la primera vez editando los archivos
/etc/postgrey/whitelist_recipients y /etc/postgresy/whitelist_clients .

Noolvideisque~~podis~~debisrevisarellogdelservidordecorreoamenudoporsihubiera
algn problema o algn comportamiento no deseado, que como ya sabeis se encuentra en
/var/log/mail.log siusaisDebianosimilares,yen /var/log/maillog siusaisCentOS/RedHat.

Y para poder dar por terminadas las configuraciones relativas al spam, solo nos faltara
implementarelsistemaSPFennuestroservidor:
SPF(SENDERPOLICYFRAMEWORK)
El sistema SPF intenta disminuir el spam evitando la falsificacin de las direcciones de correo
electrnicodelosmensajes.YsuprincipalimplementacineselproyectoOpenSPF.

BajomipuntodevistaesunamedidadeseguridadMUYbuena,yrealmenteseratilsitodoslos
servidoresdecorreoloutilizarandeformapredeterminadayobligatoria...peropordesgracianolo
hacen,yloqueesanpeor,muchosdelosadministradoresdesistemasquegestionanservidores
decorreonisiquierasabendesuexistencia.

Sufuncionamientoesmuysimple:dadoqueladireccindelremitentedeunemailvieneindicada
nicamente en una de las cabeceras del email, cualquiera puede manipular dicha cabecera y
enviarunemailconunremitentefalso.

Nosenecesitangrandesconocimientosniherramientasavanzadas,cualquierlamerpuedeenviar
unemailacualquierpersonahacindosepasarporcualquiera.Ylosspamersutilizanestoadiario
parasimularemailsdepersonasconocidasodesitioswebsdeinters,deformaqueaumentan
lasposibilidadesdequealrecibiresosemails,caigamosenlatrampaylosleamos.

SPF intenta evitar esto, rechazando los emails que provengan de servidores de correo que NO
son los servidores de correo oficiales de dicho dominio. Es decir, si el servidor de correo
depornohardware.comtienelaIP1.2.3.4(porejemplo),siunservidordecorreorecibeunemail
deunadireccindeltipo@pornohardware.comqueprovienedelaIP5.6.7.8,automticamentelo
rechazar porque asumir que no se trata de un email legtimo. SPF da por sentado que para
enviar emails del dominio @pornoharware.com nicamente se van a utilizar unos servidores
determinados(losqueelTodopoderosoadministradordepornohardware.comhaya configurado),
porloquesiunemailprovienedeotrosevidordirente,muyseguramentesetratedeunemailNO
legtimo(spam).

ElsistemaSPFconstade2partes:

IncluirunregistroenelDNSdenuestrodominioquesirvaparaquelosdemsservidores
decorreosepancualessonnuestrosservidoreslegtimos,yrechacenemailsque
(aunqueparezcaqueproviniendenosotros)hayansidoenviadosdesdeotrosservidores.
Configurarnuestroservidordecorreoparaquecuandonosllegueunemail,
comprobemosenelDNSdeldominiodelremitentedelemailsiefectivamentedicho
mensajeprovienedeunservidorautorizadoono.

El paso 1 es tan sencillo como incluir un registro de tipo TXT que indique quines son los
servidoresquepuedenenviarnuestrosemails.
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 47/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

Lasintaxisdeestosregistrosesmuysencilla:

v:ConsteparmetroseindicalaversindeSPF(queactualmenteesla1).
mx:Consteparmetroseindicaquelosservidoresdecorreoconfiguradosenelregistro
detipoMXdenuestrodominioestnautorizadosaenviaremaildedichodominio.
ptr:Consteparmetroseindicaquelosservidorescorrespondientesasubdominiosde
nuestrodominioestnautorizadosaenviarnuestrosemails.Esdecir,cualquierservidor
cuyonombresea*.pornohardware.com.
all:Dependiendodelcdigoqueindiquemosaqu,losservidoressernmsomenos
estrictosalahoraderecibirnuestroscorreos.Losposiblesvaloresdesteparmetro
son:
all:NOsedebenaceptaremailsnuestrosqueprovengandeservidoresqueNO
sonlosespecificadosenelregistroSPFdenuestroDNS.
~all:SedebenaceptaremailsnuestrosaunqueprovengandeservidoresqueNO
sonlosespecificadosenelregistroSPFdenuestroDNS,peromarcandodichos
emailscomoposibleSPAM,deformaquesealosclientesdecorreodelosusuarios
finalesquienspuedanestablecerreglasparaaceptaronodichosemails.
?all:SedebenaceptaremailsnuestrosaunqueprovengandeservidoresqueNO
sonlosespecificadosenelregistroSPFdenuestroDNS.

Vistas stas opciones, un ejemplo de registro TXT para el SPF del


dominiopornohardware.comsera:

pornohardware.com.INTXT"v=spf1mxa:mail.ejemplo1.coma:mail.ejemplo2.comall"

ste registro especificara como vlidos para enviar emails de nuestro dominio a aquellos
servidores que estn definidos en los registros MX de nuestro dominio, y tambin los
servidores mail.ejemplo1.com y mail.ejemplo2.com. Y al haber especificado all , aquellos
servidores que reciban un email proveniente de un servidor diferente a los que acabamos de
mencionar,debenRECHAZARdichoemail.

ExistenmuchosserviciosenInternetqueospuedenayudaraconfiguraronlineelregistroSPFde
vuestrodominio,comoporejemploSPFWizard.

De sta forma hemos configurado nuestro DNS para que los dems servidores de correo del
mundo sepan cules son nuestros servidores... pero ahora tenemos que hacer que nuestro
servidorhagaesamismacomprobacincuandollegueunemaildelosdems,yrechazardichos
emails si hubieran sido enviados por servidores distintos a los que esos dominios
hayanautorizado.

Para eso necesitamos postfixpolicydspfpython o postfixpolicydspfperl , un programa


escrito en Python o Perl respectivamente, y que permite a Postfix consultar el registro SPF del
dominiodelosemailsquellegananuestroservidorparadeterminarlaaccinarealizarencada
caso.

En distribuciones basadas en Redhat/CentOS no existe una versin precompilada disponible en


losrepositoriosoficiales,porloquedebereisdescargarlodesdehttp://www.openspf.org/Softwaree
instalarlo de forma manual (nicamente hay que copiarlo en el directorio apropiado, como
/usr/bin oalgosimilar).

EndistribucionesbasadasenDebian/Ubuntu,comosiempreestanfcilcomoejecutar:

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 48/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

$sudoaptgetinstallpostfixpolicydspfpython

Despus,editamosdenuevoelarchivo master.cf dePostfix,yloincluimosjustodespusdela


configuracinquehabamoscreadoparaAmavis:

#FiltroparaAmavis/Postfix
127.0.0.1:10025inetnysmtpd
ocontent_filter=
olocal_recipient_maps=
orelay_recipient_maps=
osmtpd_restriction_classes=
osmtpd_client_restrictions=
osmtpd_helo_restrictions=
osmtpd_sender_restrictions=
osmtpd_recipient_restrictions=permit_mynetworks,reject
omynetworks=127.0.0.0/8
ostrict_rfc821_envelopes=yes

#postfixpolicydspfpython
policydspfunixnnspawn
user=nobodyargv=/usr/bin/policydspf

Y por ltimo, editamos tambin el archivo main.cf para indicar a Postfix que use el filtro que
acabamosdeconfigurar(justoenlaseccinderestriccionesquehabamosutilizadoparaaadirel
filtrodePostGrey):

smtpd_recipient_restrictions=regexp:/etc/postfix/blacklist,
permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_serviceinet:127.0.0.1:10023,
check_policy_serviceunix:private/policydspf,
regexp:/etc/postfix/blacklist,
permit

ReiniciamosPostfix,yyatenemosnuestroservidorpreparadoparahacerfrentealmalditospam!

$sudo/etc/init.d/postfixrestart

ESTADSTICASYMONITORIZACIN
Ahoraqueyatenemoselservidorcompletofuncionandoal100%nopodemosabandonarloasu
suerteyesperarquesigafuncionandoduranteelrestodenuestrasvidassinnisiquieradedicarle
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 49/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

unmnimodeatencin.Nomerefieroaquehayaqueestarpendientedelcadada,perosque
convienealmenostenermonitorizadosalgunosdesusvalores,sobretodoalahoradeidentificar
posiblescuellosdebotellaopicosdeactividadquepuedandarnosalgnindicativodequealgono
vabien,odequenecesitamosampliarelhardwarede nuestros sistemas para hacer frente a la
demanda...

Dejando al margen las recomendaciones obvias sobre monitorizacin propia de los servicios de
nuestro sistema (me refiero a algn software para detectar y avisar si alguno de ellos cae,
tipoNagiososimilar)loquepretendoexplicareslamonitorizacindelUSOqueseledaanuestro
sistema.

Los 3 principales programas que yo conozco y suelo utilizar para monitorizar el uso de mis
servidoresdecorreoson:

mailgraph:steprogramamuestragrficasentiemporealsobreelusodePostfix,tales
comoemailsrecibidos,emailsenviados,etc.ygeneragrficasconlainformacindiaria,
semanal,mensualyanual.
queuegraph:Lomismoqueelanterior,peroconinformacinacercadelacolade
mensajes(nmerodemensajesencolados,mensajesmensajesenviados,etc).
couriergraph:Lomismoquelosdosanteriores,peroconinformacinsobrelas
conexionesaCourier(conexionesIMAP,conexionesPOP,etc).

Los 3 programas son muy parecidos, y se basan en RDD para almacenar la informacin, por lo
que no necesitan servidores de base de datos a los que conectarse ni tienen apenas ninguna
dependencia. Simplemente se instalan en el mismo servidor donde estn los servicios que
queremos monitorizar, y desde un navegador accedemos a una URL concreta para ver las
grficasgeneradas.

La instalacin, como siempre, no puede ser ms sencilla en distribuciones basadas


enDebian/Ubuntu:

$sudoaptgetinstallmailgraphqueuegraphcouriergraph

YendistribucionesbasadasenRedhat/CentOS:

$sudoyuminstallmailgraphqueuegraphcouriergraph

En el caso de distribuciones basadas en Redhat/CentOS, quizs couriergraph no se encuentre


enlosrepositoriosoficiales(ahoramismonoloest,aunquejuraraquelohaestado)porloquesi
esvuestrocaso,debereisinstalarlomanualmenteenlugardeatravsde yum .

Unavezloshayaisinstalado,bastaconabrirunnavegadoryaccederadichosCGIstecleandoen
la barra de direcciones: http://localhost/cgibin/mailgraph.cgi, http://localhost/cgi
bin/queuegraph.cgi o http://localhost/cgibin/couriergraph.cgi (en lugar de localhost , quizs en
vuestrocasodebaisponerladireccindelservidordondeloshayaisinstalado).

Silohabeisinstaladobien,alaccederaesasURLsdeberasveralgoparecidoaesto:
MAILGRAPH:

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 50/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

QUEUEGRAPH:

COURIERGRAPH:

Yconrespectoateneruninformemsomenosdetalladadosobreelnmerodeemailsquese
hanenviado/recibido,destinatariosquemscorreohanenviado/recibido,diasquemsemailsse
hanenviado/recibido,etc.yorecomiendoelprogramaIsoqlog.

Con este software, y a base de la informacin que se obtiene del log del servidor (
/var/log/mail.log o /var/log/maillog ) se pueden generar informes bastante detallados y tiles
sobrelaactividadindividualdecadausuarioyobtenerasunavisinmuchomsampliadeluso
queseledaanuestroservidor.

DenuevolainstalacinestrivialenDebian/Ubuntu:

$sudoaptgetinstallisoqlog

Y para el resto de distribuciones, se puede descargar tanto el cdigo fuente como paquetes
RPMdesdelawebdelproyecto:http://www.enderunix.org/isoqlog/

Unavezinstalado,nicamentehayquedefiniruncronparaquegenerelosinformescadacierto
tiempo.Yolosuelohacercada12horas,astengolosinformesdetalladosactualizados2vecesal
da,perorealmentepuedesponerlocuandoquieras.

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 51/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

La configuracin es extremadamente simple: basta con indicar en el archivo de configuracin


(generalmente /etc/isoqlog/isoqlog.conf ) la ruta donde est el log del servidor de correo, el
directorio donde queremos que se guarden los informes que se irn generando, el idioma en el
que queremos dichos informes, etc. Y en el archivo /etc/isoqlog/isoqlog.domains nicamente
indicamoslalistadedominiosalosquenuestroservidordecorreoprestarservicio(esdecir,los
dominiosquehabamosconfiguradoenlasdirectivas mydestination y relay_domains delarchivo
/etc/postfix/main.cf )

/etc/isoqlog/isoqlog.conf

#isoqlog2.0Configurationfile

logtype="postfix"
logstore="/var/log/mail.log"
domainsfile="/etc/isoqlog/isoqlog.domains"
outputdir="/var/www/reports"
htmldir="/usr/share/isoqlog/htmltemp"
langfile="/usr/share/isoqlog/lang/english"
hostname="mail.pornohardware.com"

maxsender=100
maxreceiver=100
maxtotal=100

maxbyte=100

/etc/isoqlog/isoqlog.domains

pornohardware.com
pornosoftware.com

Paragenerarelinformedeformamanualbastaconejecutarelcomando:

$sudoisoqlog

Unavezgenerados,losinformessonalgoparecidoaesto:

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 52/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

ComoveislainformacinquemuestrantodosestossistemasdemonitorizacinesMUYtil,porlo
que sumado a la monitorizacin global del servidor (con Cacti, Zabbix o similar) nos permitirn
mantenernuestrorecininstaladoservidorenperfectofuncionamientoduranteeltiempoquehaga
falta.

Ydemomentoaquseacabasteartculo,queyavasiendohora!

Espero que toda sta chapa que he escrito os sirva de ayuda a la hora de configurar vuestro
propioservidordecorreo,yaseaporqueoslohanpedidoenvuestraempresaoporquehabeis
https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 53/54
2017529 InstalacinyconfiguracindeunservidordecorreocompletoenLinuxpornoHARDWARE.com

decididotenerelcontroldevuestropropiocorreopersonal,locualesunadelasmejorescosas
que podis hacer en la vida si de verdad os preocupa lo ms mnimo vuestra privacidad y la
seguridad de vuestros datos y conversaciones. Por favor, no hagais comola gran masa tonta y
delegueis la gestin de vuestro email a ladrones y estafadores con doble moralidad (como
Google/Gmailytodasesasgrandesempresas)quenodudarnenparsear,etiquetarycatalogar
incluso vuestros emails ms personales con la excusa de mostraros publicidad ms
relevante(comosiademsesofueraalgobueno).

He tenido especial cuidado a la hora de enumerar los comandos, configuraciones, etc. y he ido
contrastndolo paso a paso con mis actuales servidores de correo para verificar que toda la
informacinqueoshepuestoescorrecta...peroporsupuestohepodidocometeralgnfallo(jaja)
xDDDD.

Sisehadadosteremotoyextrasimocaso,porfavor,decrmelo(escribirloenloscomentarios
delartculo)ylocorregirloantesposible.

Yporsupuesto,nodudeisendistribuirycompartirstainformacincontodoelmundo...peropor
favor,citarsiemprelafuentedesteartculo,quedespusdelacantidaddehorasytrabajoque
mehacostadoescribirlo,almenosdarmeelreconocimientoapropiado!xDDD

Alaaaaaaaaaaaaaaaa

REFERENCIAS
http://www.postfix.org/documentation.html
http://www.couriermta.org/status.html
http://www.openspf.org/
http://whatismyipaddress.com/blacklistcheck
http://sopa.dis.ulpgc.es/iiaso/portal_aso/leclinux/seguridad/pam/pam_doc.pdf

https://pornohardware.com/2015/01/01/instalacionyconfiguraciondeunservidordecorreocompletoenlinux/ 54/54