5. Servidor de correo electrónico

Como se explica en [AA_Linux] el servicio básico de correo empleado en Internet y en una red TCP/IP se basa en el protocolo SMTP (Simple Mail Transfer Protocol) descrito especialmente en los RFCs 821 y 1123, funcionando sobre TCP/IP. En una situación típica en la que un usuario pablo@amor.miescuela.edu.co envía un mensaje al usuario rodrigo@respeto.miescuela.edu.co sin computadores intermediarios, se requiere:

Si tanto pablo como rodrigo emplean como MUA mail, y ambos computadores tiene como MTA sendmail, el proceso sería:

  1. pablo emplea mail en su computador amor para redactar el mensaje cuyo destinatario es rodrigo.

  2. En amor, el programa mail ejecuta sendmail para enviar el mensaje. sendmail deja el mensaje en una cola de mensajes por enviar. Esa cola de mensajes es actualizada por sendmail a medida que envía o intenta enviar mensajes (si un mensaje no puede ser enviado sendmail puede reintentar el envio cierto número de veces, haciendo pausas entre un intento y otro).

    Enviar un mensaje significa crear una conexión TCP con el MTA destino o con otro MTA que actúe de intermediario, típicamente en el puerto TCP 25, y transmitir el mensaje siguiendo las reglas del protocolo SMTP [28]. Para establecer el computador con el cual conectarse sendmail revisa con el resolvedor DNS, registros MX asociados con el dominio de la dirección, si los hay intenta enviar a cada uno en orden de prioridad --los registros MX con menor número tienen mayor prioridad (ver Servicio DNS).

  3. En respeto debe estar corriendo un proceso que acepte la conexión en el puerto 25, i.e. sendmail o algún otro MTA que reciba el mensaje siguiendo el protocolo SMTP.

  4. sendmail en respeto agrega el mensaje que recibe en el archivo tipo texto /var/mail/rodrigo que está en formato mbox.

  5. Cuando rodrigo lo desee, podrá emplear mail para leer los correos que se hayan acumulado en /var/mail/rodrigo ---a medida que los lea saldrán de ese archivo para quedar en ~/mbox.

Este es el esquema básico, aunque hay muchas otras situaciones en las que se emplean otras posibilidades de SMTP, protocolos auxiliares y programas. Por ejemplo los usuarios de una organización suelen extraer sus correos del servidor desde otros computadores con MUAs gráficos empleando el protocolo inseguro POP3 o los protocolos seguros POP3S e IMAPS. También es posible configurar un cliente de correo web (webmail) para examinar correos desde el web. Otro servicio asociado al correo son las listas de correo que facilitan el envío de correo masivo.

OpenBSD incluye una versión auditada de sendmail por lo que además de detallar algunos aspectos de su configuración y uso, en esta sección se describe la configuración de protocolos auxiliares como POP3S e IMAPS, de clientes de correo web y de listas de correo.

5.1. sendmail

Para usarlo con una configuración por defecto que permite enviar y recibir correos a otras máquinas, agregue la siguiente línea a /etc/rc.conf.local:

sendmail_flags="-L sm-mta -C/etc/mail/sendmail.cf -bd -q30m"
    

Con esta configuración sendmail funcionará como MTA y esperará conexiones SMTP en el puerto 25 y en el puerto 587 (el segundo se espera que sea empleado por usuarios locales y que esté bloqueado al exterior, mientras que el primero por usuarios que deseen reenviar correo desde otros computadores).

La bitacora queda en /var/log/mailman, registra cada envio y recepción de correo. Aunque puede aumentarse el nivel de detalle en la depuración cambiando las opciones de arranque por:

sendmail_flags="-L sm-mta -C/etc/mail/sendmail.cf -bd -q30m -D /var/log/maildeb -X/var/log/maildeb2 -O LogLevel=10"
	  

que enviará el máximo de detalle de cada transmisión al archivo /var/log/maildeb2

A continuación se presenta una prueba a este servicio:

$ telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 amor.miescuela.edu.co ESMTP Sendmail 8.13.8/8.13.3; Mon, 16 Oct 2006 12:42:41 -0500 (COT)
HELO localhost
250 amor.miescuela.edu.co Hello pablo@localhost [IPv6:::1], pleased to meet you
MAIL FROM: <pablo@localhost>
250 2.1.0 <pablo@localhost>... Sender ok
RCPT TO: <pablo@localhost>
250 2.1.5 <pablo@localhost>... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
1 2 3
probando
.
250 2.0.0 k9GHgf1q019958 Message accepted for delivery
quit
221 2.0.0 amor.miescuela.edu.co closing connection
Connection closed by foreign host.
	  

Para facilitar reiniciar el servicio en caso de inconvenientes se sugiere agregar a /etc/rc.local:

pgrep sendmail > /dev/null
if [ "$?" != "0" -a X"$sendmail_flags" != X"NO" ]; then
        echo -n ' sendmail';
        /usr/sbin/sendmail ${sendmail_flags}
fi 
	  

Que detecta cuando no está corriendo sendmail y lo reinicia al ejecutar desde la línea de comandos:

sudo sh /etc/rc.local
	  

5.1.1. Relevo de Correo

Como se explica en el FAQ de OpenBSD, si planea emplear su servidor para hacer relevo de correo (relay), basta que agregue los dominios o IPs de las cuales recibir correo para reenviar en el archivo /etc/mail/relay-domains (o el que la siguiente instrucción indique: grep relay-domains /etc/mail/sendmail.cf ) Un ejemplo de tal archivo es:

miescuela.edu.co  # Acepta de todos los computadores del dominio
192.168.1  # Acepta de todos las IPs de la forma 192.168.1.x

5.1.2. SMTP-AUTH y TLS

El protocolo estándar para enviar correo a un servidor es SMTP, que no ofrece posibilidades de autenticación ni encripción. Una extensión a este protocolo es SMTP-AUTH (descrita en el RFCs 2554), la cual se basa en SASL (Simple Authentication and Security Layer, RFC 2222) y que permite autenticar antes de aceptar un correo por enviar.

LOGIN y PLAIN son dos de los diversos métodos que SMTP-AUTH puede emplear para recibir información de autenticación, como estos métodos transmiten identificaciones y claves en forma prácticamente plana, es necesario emplear bien una conexión sobre SSL o bien TLS que es otra extensión a SMTP.

Aunque sendmail soporta tanto TLS como SMTP-AUTH, la configuración por defecto de OpenBSD 5.0 no los incluye. En el caso de TLS lo incluido en el sistema base es suficiente y el procedimiento de configuración se documenta en man starttls. En cuanto a SMTP-AUTH se requiere una implementación de SASL, pero no hay ninguna incluida en el sistema base por lo que es necesario emplear el paquete cyrus-sasl.

5.1.2.1. SASL

Para contar con el servicio SASL en su servidor (que puede ser usado por diversos programas entre los que está sendmail), instale el paquete cyrus-sasl y cree el archivo /usr/local/lib/sasl2/Sendmail.conf para que contenga:

pwcheck_method: saslauthd

con lo que indica que desde sendmail, Cyrus-SASL debe emplear el servidor saslauthd. Para realizar la autenticación, Cyrus-SASL puede configurarse con diversas fuentes de información (e.g LDAP, bases de datos), puede iniciarlo indicando que desea emplear las funciones estándar de autenticación de OpenBSD con:

# mkdir /var/sasl2
# /usr/local/sbin/saslauthd -a getpwent

Para que este servicio se inicie en cada arranque agregue en /etc/rc.local antes del arranque de sendmail:

pgrep saslauthd > /dev/null
if [ "$?" != "0" -a X"$saslauthd_flags" != X"NO" -a -x /usr/local/sbin/saslauthd
 ]; then
	echo -n ' saslauthd';
       	mkdir -p /var/sasl2
       	/usr/local/sbin/saslauthd ${saslauthd_flags}
fi

y en /etc/rc.conf.local:

saslauthd_flags="-a getpwent"

Si lo requiere puede iniciar este servicio en modo de depuración (en primer plano y enviando a salida estándar bastante información) con:

# /usr/local/sbin/saslauthd -a getpwent -d

Una vez este funcionado este servicio (al examinarlo con ps se ve que inicia varios procesos) puede probar que esté autenticado usuarios con

$ testsaslauthd -u usuario -p clave

5.1.2.2. ESMTP

Al agregar a SMTP protocolos como TLS y AUTH-SMTP el nuevo protocolo toma el nombre ESMTP. Para extenderlo en OpenBSD debe recompilar sendmail y debe emplear su propio archivo de configuración.

Dado que TLS requiere un certificado SSL, si tiene uno ya firmado por una autoridad certificadora déjelo en /etc/mail/certs o genere uno autofirmado (como se explica en man starttls):

# mkdir /etc/mail/certs
# openssl dsaparam 1024 -out dsa1024.pem
# openssl req -x509 -nodes -days 3650 -newkey dsa:dsa1024.pem \
  -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem
# ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem
# rm dsa1024.pem
# chmod -R go-rwx /etc/mail/certs
	

Para recompilar sendmail, si aún no lo ha hecho, debe descargar y actualizar a las fuentes más recientes:

# cd /root/tmp
# ftp $PKG_PATH/../../src.tar.gz
# cd /usr
# mkdir src
# cd src
# tar xvfz /root/tmp/src.tar.gz
# for i in `find . -name CVS`; do echo $i; 
> echo "anoncvs@anoncvs1.ca.openbsd.org:/cvs" > $i/Root;
> done
# cvs -z3 update -Pd -rOPENBSD_5_0

Después indique que desea recompilar sendmail con soporte para autenticación creando o editando el archivo /etc/mk.conf para que incluya:

WANT_SMTPAUTH = yes

Recompile e instale sendmail con:

# cd /usr/src/gnu/usr.sbin/sendmail
# make clean
# make
# make install

Finalmente cree un nuevo archivo de configuración a partir del estándar:

# cd /usr/src/gnu/usr.sbin/sendmail/cf/cf
# cp openbsd-proto.mc openbsd-proto-local.mc

En el nuevo openbsd-proto-local.mc después de la línea OSTYPE(openbsd)dnl agregue:

	define(`CERT_DIR',        `MAIL_SETTINGS_DIR`'certs')
	define(`confCACERT_PATH', `CERT_DIR')
	define(`confCACERT',      `CERT_DIR/CAcert.pem')
	define(`confSERVER_CERT', `CERT_DIR/mycert.pem')
	define(`confSERVER_KEY',  `CERT_DIR/mykey.pem')
	define(`confCLIENT_CERT', `CERT_DIR/mycert.pem')
	define(`confCLIENT_KEY',  `CERT_DIR/mykey.pem')

y después de la línea FEATURE(`no_default_msa')dnl:

	define(`confAUTH_MECHANISMS',`PLAIN LOGIN CRAM-MD5 DIGEST-MD5')dnl
	TRUST_AUTH_MECH(`PLAIN LOGIN CRAM-MD5 DIGEST-MD5')dnl
	define(`confAUTH_OPTIONS',`p,y')dnl
	define(`confPRIVACY_FLAGS',`authwarnings,goaway')

Para realizar pruebas con los métodos PLAIN y LOGIN sin cifrar puede comentar la línea confAUTH_OPTIONS poniendo antes dnl).

Verifique también que estén las siguientes líneas:

DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0, Name=MTA')dnl
DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0, Port=465, Name=SSLMTA, M=s')dnl 
DAEMON_OPTIONS(`Family=inet6, Address=::, Name=MTA6, M=s')dnl
DAEMON_OPTIONS(`Family=inet6, Address=::, Port=465, Name=MTA6, M=s')dnl
	

Para habilitar el comando STARTTLS (que inicia encripción) en el servidor estándar del puerto 25 y otro servidor que sólo acepta conexiones encriptadas en el puerto 465.

Finalmente emplee el nuevo archivo de configuración y reinicie sendmail:

# make openbsd-proto-local.cf
# install -c -o root -g wheel -m 644 openbsd-proto-local.cf /etc/mail/sendmail.cf
# pkill sendmail
# . /etc/rc.conf
# sendmail $sendmail_flags
	

Dependiendo de su configuración para compilar fuentes la segunda línea podría ser:

# install -c -o root -g wheel -m 644 obj/openbsd-proto-local.cf /etc/mail/sendmail.cf

5.1.2.3. Pruebas

Inicie un diálogo con sendmail con:

# sendmail -O LogLevel=20 -bs -Am
220 correo.miescuela.edu.co ESMTP Sendmail 8.13.8/8.13.4; Wed, 13 Jul 2005 15:16:26 -0500 (COT)

EHLO LOCALHOST

250-correo.miescuela.edu.co Hello root@localhost, pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5
250-STARTTLS
250-DELIVERBY
250 HELP

	

Note que deben aparecer las líneas STARTTLS y AUTH. Para autenticarse debe dar una identificación y una clave válida en el sistema pero codificadas en base 64. Puede emplear la interfaz CGI disponible en http://www.motobit.com/util/base64-decoder-encoder.asp o eventualmente el programa disponible en http://www.sendmail.org/~ca/email/prgs/ed64.c que puede compilar y usar así:

# cd /root/tmp
# ftp http://www.sendmail.org/~ca/email/prgs/ed64.c
# cc -o ed64 ed64.c
# ./ed64 -e
MiUsuario
TWlVc3Vhcmlv
MiClave
TWlDbGF2ZQ==

Retomando la sesion con sendmail y usando estos datos:

AUTH LOGIN
334 VXNlcm5hbWU6
TWlVc3Vhcmlv
334 UGFzc3dvcmQ6
TWlDbGF2ZQ==
235 2.0.0 OK Authenticated

puede intentar el envío de un correo por ejemplo con:

MAIL FROM:<pablo@miescuela.edu.co>
250 OK                                                                          
RCPT TO:<rodrigo@miescuela.edu.co>
250 Accepted                                                                    
DATA                                                                            
354 Enter message, ending with "." on a line by itself                          
From: "pablo@miescuela.edu.co" <pablo@miescuela.edu.co>
To:  rodrigo@miescuela.edu.co
Subject: probando

1234                                                                            
.                                                                               
250 OK id=1GZXFP-000540-7J                                                      
QUIT                                                                            

De requerirlo puede rastrear problemas en /var/log/maillog y/o intentar el protocolo descrito de forma remota (o también local) con:

telnet correo.miescuela.edu.co 25
220 correo.miescuela.edu.co ESMTP Sendmail 8.13.8/8.13.4; Wed, 13 Jul 2005 15:16:26 -0500 (COT)

EHLO [200.21.23.4]

y remplazando 200.21.23.4 por la IP desde la que inicia la conexión.

Si desea probar el método PLAIN, con ed64 emplee:

MiUsuario\0MiUsuario@pasosdeJesus.org\0MiClave
TWlVc3VhcmlvAE1pVXN1YXJpb0BwYXNvc2RlamVzdXMub3JnAE1pQ2xhdmU=
	

y al dialogar en SMTP:

AUTH PLAIN TWlVc3VhcmlvAE1pVXN1YXJpb0BwYXNvc2RlamVzdXMub3JnAE1pQ2xhdmU= 
	

También puede probar el servicio del puerto 465 con la misma secuencia, pero iniciando con:

openssl s_client -connect localhost:465
	

5.1.2.4. Configuración del cliente de correo (MUA)

Dependiendo de su cliente de correo será posible emplear los nuevos protocolos. Por ejemplo mozilla-thunderbird lo soporta, basta que en la configuración del servidor SMTP indique que debe emplearse un usuario y que emplee TLS (puede usar tanto el puerto 25 como el 465). Tenga en cuenta que el nombre del usuario con el cual autenticarse debe incluir el dominio (e.g pablo@miescuela.edu.co).

5.1.3. Cambiar puerto SMTP

Si desea cambiar el puerto en el que sendmail espera conexiones SMTP, emplee las fuentes del sistema:

# cd /usr/share/sendmail/cf
# vi openbsd-proto.mc

Busque y modifique la línea:

DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0,  Name=MTA')dnl
DAEMON_OPTIONS(`Family=inet6, Address=::,  Name=MTA6, M=O')dnl

agregandoles un puerto no estándar:

DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0, Port=2000,  Name=MTA')dnl
DAEMON_OPTIONS(`Family=inet6, Address=::, Port=2000,  Name=MTA6, M=O')dnl

Después genere el archivo de configuración /etc/mail/sendmail.cf con:

# make
# make distribution
	

finalmente reinicie sendmail o envíele una señal para que lea nuevamente archivos de configuración:

# pkill -HUP sendmail
	

5.1.4. Dominios virtuales

Si un mismo servidor atiende diversos dominios DNS, puede lograr que se acepte correo para cada dominio. Para esto:

  • Asegurese de tener un registro MX para el dominio que indique que su servidor es el servidor de correo del dominio. i.e en el archivo maestro del dominio (digamos /var/named/master/miescuela.edu.co) algo como:

    	MX      5       correo.miescuela.edu.co.
    	correo          IN      A       65.167.89.169
    
    	

    ¡No omita el punto que va a continuación del nombre del servidor MX!

  • Agregue el dominio (e.g miescuela.edu.co) a los archivos /etc/local-host-names y /etc/mail/relay-domains

  • Reinicie sendmail con:

    pkill -HUP sendmail
    				

Con esta configuración todo correo a una dirección de la forma pablo@miescuela.edu.co será enviado a la cola de correos del usuario local pablo. Si lo requiere es posible agregar direcciones que se envíen a otro usuario local, agregando entradas al archivo /etc/mail/virtusertable, por ejemplo:

pablofelipe@miescuela.edu.co	pablo
		

reenviará todo correo dirigido a pablofelipe@miescuela.edu.co al usuario local pablo.

5.2. Protocolos para revisar correo

Para extraer correos de un servidor pueden emplearse los protocolos inseguros[29] POP3 e IMAP o bien sus análogos seguros sobre SSL: POP3S e IMAPS En esta sección se describe la configuración extra-rápida pero insegura de POP3, y la configuración segura pero que requiere configuración más delicada de POP3S e IMAPS con las implementaciones de Courier.

5.2.1. POP3

POP3 (Post Office Protocol) es un protocolo que permite sacar correos de un servidor para llevarlos a otro computador donde podrán examinarse con un MUA.

Para que los usuarios puedan emplear clientes de correo que soporten POP3, es necesario configurar un servidor de este protocolo. OpenBSD incluye entre sus componente básicos un servidor de POP3 (popa3d), que puede activar agregando la siguiente línea al archivo /etc/inetd.conf:

pop3           stream  tcp     nowait  root    /usr/sbin/popa3d        popa3d
      

y reinicie el servicio inetd con:

pkill -HUP inetd
      

[Aviso]Aviso

Tenga en cuenta que POP3 transmite claves y mensajes de correo como texto plano y estos podrían ser interceptadas. Para remediar la situación, si cuenta con un cliente de correo que soporte POP3 sobre SSL, es posible emplear el protocolo POP3S, que es el mismo POP3 pero encriptado con SSL (ver siguiente sección).

5.2.2. Implementación Courier de POP3S e IMAPS

Aunque hay otras implementaciones de POP3S (como dovecot), en esta sección se describe la de courier por ser completa. Sin embargo esta implementación requiere que se cambie la forma de almacenar correos recibidos por sendmail de formato mbox a formato maildir. Esto y la autenticación que requiere courier exigen una configuración especial que se describe a continuación.

5.2.2.1. Autenticación Courier

Insatale courier-authlib-0.63.0p3, paquete que se encarga de la autenticación. Para iniciarlo en cada arranque agregue a /etc/rc.local:

pgrep authdaemond > /dev/null
if (test "$?" != "0" ) then {
	echo -n ' authdaemond';
	mkdir -p /var/run/courier-auth/
	/usr/local/sbin/authdaemond start
} fi;

y en /etc/rc.shutdown:

if [ -f /var/run/courier-auth/pid ]; then
        authdaemond stop
	rm /var/run/courier-auth/pid
fi

Una vez en operación puede probar la autenticación con authtest usuario y authtest usuario clave

5.2.2.2. Sendmail almacenando correos en formato maildir

El formato mbox almacena todos los correos en un sólo archivo, uno tras otro. El formato maildir (propio del MTA qmail) almacena cada correo en un archivo separado en algún directorio, por defecto hay 3 directorios (cur, new y tmp) aunque el usuario puede crear otros.

Típicamente sendmail deja los correos que recibe en formato mbox en archivos del directorio /var/mail. En esta sección se explica como lograr que los almacene en el directorio Maildir de la cuenta de un usuario.

Una sencilla solución que no requiere mayores cambios es emplear procmail. Instale el paquete procmail-3.22p3 y en la cuenta de cada usuario que vaya a usar POP3S o IMAPS cree los archivos .forward y .procmailrc, análogos a los siguientes (suponemos que se trata del usuario pablo):

  • En /home/pablo/.forward

    "| exec /usr/local/bin/procmail"
          

    las comillas son indispensables así como el símbolo '|'.

  • En /home/pablo/.procmailrc

    LINEBUF=4096
    #VERBOSE=on
    PMDIR=/home/pablo/
    MAILDIR=$PMDIR/Maildir/
    FORMAIL=/usr/local/bin/formail
    SENDMAIL=/usr/sbin/sendmail
    #LOGFILE=$PMDIR/log
    
    :0
    * .*
    /home/pablo/Maildir/
          

    Note que el directorio de la variable MAILDIR termina con '/'. Esto es indispensable para indicar a procmail que debe guardar en esa ruta en formato Maildir.

  • Deje además listo un directorio en formato Maildir en /home/pablo/Maildir con:

    	      maildirmake /home/pablo/Maildir
    	      chown -R pablo:estudiante /home/pablo/Maildir
          

De esta forma cada vez que sendmail reciba un correo para el usuario local pablo en vez de almacenar en /var/mail/pablo ejecutará la línea del archivo /home/pablo/.forward, la cual a su vez ejecutará procmail para procesar el correo que llega por entrada estándar. procmail empleará la configuración de /home/pablo/.procmailrc que le indica guardar todo correo que llegue a la cuenta en /home/pablo/Maildir/ (como se trata de un directorio y termina con '/', procmail identifica que debe salvar en formato Maildir, si fuera un archivo agregaría en formato MBOX).

El usuario pablo podría probar su archivo de configuración de procmail modificando ~/.procmail para quitar el comentario de la línea

VERBOSE=on
      

y ejecutando:

$ cd /home/pablo
$ procmail 
Mensaje de prueba
Termínelo con Control-D
.
procmail: [21024] Fri Jul  1 18:32:30 2005
procmail: Assigning "PMDIR=/home/pablo/"
procmail: Assigning "MAILDIR=/home/pablo/Maildir/"
procmail: Assigning "FORMAIL=/usr/local/bin/formail"
procmail: Assigning "SENDMAIL=/usr/sbin/sendmail"
procmail: Assigning "LOGFILE=/home/pablo/log"

Tras lo cual debe encontrar un nuevo archivo en Maildir/new con el mensaje de prueba.

Puede verificar el funcionamiento de .forward enviando un correo a la cuenta del usuario y revisando la bitácora /var/log/maillog donde deben aparecer un par de líneas análogas a:

Dec 19 18:31:59 servidor sendmail[22209]: kBJNVwMt022209: to=test@localhost, ctladdr=pablo (1000/1000), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30061, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (kBJNVw3t021322 Message accepted for delivery)
Dec 19 18:31:59 servidor sm-mta[21454]: kBJNVw3t021322: to="| exec /usr/local/bin/procmail", ctladdr=<test@miescuela.edu.co> (1008/10), delay=00:00:00, xdelay=00:00:00, mailer=prog, pri=30756, dsn=2.0.0, stat=Sent
		

5.2.2.3. POP3S con Courier

Después de configurar autenticación y acople con sendmail como se explicó en secciones anteriores. Instale el paquete courier-pop3-4.8.0p4. Este paquete se configura en el directorio /etc/courier, donde deja varios archivos de configuración de ejemplo que debe editar (también podrá encontrar los archivos de ejemplo en /usr/local/share/examples/courier/).

En /etc/courier/pop3d cambie

POP3DSTART=YES
MAILDIRPATH=Maildir
      

y en /etc/courier/pop3d-ssl cambie

MAILDIRPATH=Maildir
      

Para emplear SSL requiere un certificado (por defecto en /etc/ssl/private/pop3d.pem) firmado por una Autoridad Certificadora, . Alternativamente puede generar certificados autofirmados, para esto modifique la información del archivo /etc/courier/pop3d.cnf y ejecute:

# mkpop3dcert
      

Script que creará un certificado válido por un año (si lo requiere por más tiempo puede editar el script y cambiar el número de días de validez en la opción -days de openssl).

En caso de que si tenga un certificado firmado digamos para su servidor web, puede emplearlo (ver [courier-cert]) así:

cd /etc/ssl/private
cat server.key ../server.crt > pop3d.pem
	      

Para iniciar POP3S ejecute:

sudo mkdir -p /var/run/courier
sudo /usr/local/libexec/pop3d-ssl.rc start
      

líneas que se recomienda agregar a /etc/rc.local si planea prestar servicio continuo (y abrir el puerto apropiado del cortafuegos, ver a continuación).

Para detener POP3S:

sudo /usr/local/libexec/pop3d-ssl.rc stop
      

POP3 usa por defecto el puerto 110, POP3S típicamente emplea el puerto 995. Para abrir ese puerto en un cortafuegos en /etc/pf.conf podría emplear una línea de la forma:

pass in on $ext_if proto tcp to ($ext_if) port pop3s keep state
      

Puede probar el funcionamiento del servidor con:

$ openssl s_client -connect localhost:995 
      

teniendo en cuenta que el correo debe estar en formato Maildir en el directorio Maildir del usuario que revisará. Una sesión típica sería:

+OK Hello there.
user pablo
+OK Password required.
pass ejem
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 17559
2 1128
3 2430
. 
      

Notará que la implementación Courier de POP3S intenta extraer correos del directorio Maildir/cur

5.2.2.4. IMAP-SSL con Courier

IMAP es un protocolo que permite a un MUA examinar y administrar correos que llegan a un servidor, tipicamente sin sacar los correos del servidor (a diferencia de POP) y con la posibilidad de manejar directorios/carpetas.

Después de configurar autenticación y acople con sendmail como se explicó en secciones anteriores. Instale el paquete courier-imap-4.8.0p4 y edite /etc/courier/imapd para cambiar por lo menos:

IMAPDSTART=YES
MAILDIRPATH=Maildir
      

y /etc/courier/imapd-ssl para dejar

MAILDIRPATH=Maildir
      

y eventualmente dependiendo de los clientes para el IMAPS (por ejemplo roundcube-0.5) también puede requerir:

TLS_PROTOCOL=SSL23
	

Para generar un certificado autofirmado edite imapd.cnf para personalizar sus datos y ejecute

# mkimapdcert
      

o si desea emplear el mismo certificado de su servidor web:

cd /etc/ssl/private
cat server.key ../server.crt > imapd.pem
      

Para iniciar IMAPS ejecute:

sudo mkdir -p /var/run/courier
sudo /usr/local/libexec/imapd-ssl.rc start
      

y para detenerlo:

sudo /usr/local/libexec/imapd-ssl.rc stop
      

Para iniciar el servicio cada vez que arranque el sistema agregue a /etc/rc.local:

pgrep couriertcpd > /dev/null
if [ "$?" != 0 -a -x /usr/local/libexec/imapd-ssl.rc ]; then
	echo -n ' imapd-ssl '
	mkdir -p /var/run/courier/
	/usr/local/libexec/imapd-ssl.rc start
fi
		

Cuando ejecute tanto authdaemond como imapd-ssl deben quedar corriendo varios procesos: authdaemond (o el método de autenticación que haya configurado), couriertcpd, courierlogger. Si desea ver mensajes de depuración en /var/log/maillog, cambie en /etc/courier/imapd:

DEBUG_LOGIN=1
		

podrá detener los servicios con:

sudo /usr/local/libexec/imapd-ssl.rc stop
rm /var/run/courier/imapd-ssl.pid
		

Si tiene cortafuegos activo asegurese también de abrir el puerto 993 agregando a /etc/pf.conf algo como:

pass in on $ext_if proto tcp to ($ext_if) port 993 keep state
		

Una vez en ejecución puede hacer una prueba como:

$ openssl s_client -connect localhost:993
...
AB LOGIN pablo MiClave
AB OK LOGIN Ok.
BC SELECT "Inbox"
BC NO Unable to open this mailbox.
ZZZZ LOGOUT
* BYE Courier-IMAP server shutting down
ZZZZ OK LOGOUT completed

5.2.2.5. Facilitar uso de implementación Courier

Una vez se use procmail para recibir en formato Maildir los correos de un usuario, ese usuario no podrá seguir usando mail para ver los correos recibidos, pero si podrá emplear mutt agregando al archivo de configuración ~/.muttrc:

set spoolfile=imaps://localhost/INBOX
set folder=imaps://localhost/
		

Como administrador del sistema podrá automatizar más la configuración de cuentas nuevas así:

  1. Crear archivos en /etc/skel que se copiarán a cada cuenta nueva, (el contenido de cada uno debe ser como el descrito en secciones anteriores):

    maildirmake /etc/skel
    /etc/skel/.forward
    /etc/skel/.muttrc
    /etc/skel/.procmailrc
    					

  2. Como será procmail y no sendmail quien manejará correos, cada vez que cree una cuenta ejecute:

    touch /var/mail/usuario
    chown usuario:usuario /var/mail/usuario
    chmod go-r /var/mail/usuario
    

    y ajuste el archivo .procmailrc. Es recomendable que haga esto en un script que primero ejecute adduser, y que sería el nuevo comando para crear cuentas en el sistema.

Esta configuración se aplicará a nuevas cuentas que cree, pero debe replicarla en cuentas ya creadas:

cd /etc/skel
cp -rf Maildir .forward .procmailrc .muttrc /home/cuenta/ 
chown -R cuenta:cuenta /home/cuenta/{.forward,.procmailrc,.muttrc,Maildir}
touch /var/mail/cuenta
chown -R cuenta:cuenta /var/mail/cuenta
chmod og-r /var/mail/cuenta

5.3. Combatiendo correo no solicitado con SpamAssassin

OpenBSD incluye el programa spamd que maneja listas negras (o grises) de IPs de las cuales no recibe correo alguno. Tal aproximación es bastante radical y en ocasiones puede listar o evitar recepción de servidores válidos como gmail, yahoo o hotmail o de servidores que no reintentan el envío como lo espera spamd. Tal comportamiento puede no resultar aceptable en algunas organizaciones.

SpamAssassin (paquete p5-Mail-SpamAssassin-3.3.1p6) junto con procmail (paquete procmail-3.22p3) son una solución intermedia que permiten recibir todo correo pero intentan clasificar automáticamente (y con buena precisión) los que son no solicitados en carpetas separadas por usuario que configure el servicio.

5.3.1. Configuración de spamd

Para iniciar el servicio ejecute:

	/usr/local/bin/spamd -u _spamdaemon -d      

y para que inicie automáticamente en cada arranque, incluya las siguientes líneas al archivo /etc/rc.local

ps ax | grep "[s]pamd child" > /dev/null 2>&1
if [ "$?" != "0" ]; then
	echo -n " spamd (SpamAssassin)";
	/usr/local/bin/spamd -u _spamdaemon -d      
fi
			  

La configuración por defecto de SpamAssassin es bastante buena, pero puede personalizarse en el archivo /etc/mail/spamassassin/local.cf.

5.3.2. Configuración de procmail por usuario

Cada usuario que requiera el uso de SpamAssassin para clasificar automáticamente los no solicitados en el buzón spamagarrado, debe tener configurado procmail, esto puede hacerse modificando o creando el archivo ~/.procmailrc para que incluya líneas como las siguientes (en caso de que el usuario maneje su correo en formato mbox como ocurre por defecto en OpenBSD):

:0fw                                                                            
* < 256000
| spamc                                                                         

:0e                                                                             
{
	EXITCODE=$?
}

:0:                                                                             
* ^X-Spam-Status: Yes
spamagarrado # buzón donde va todo el spam

O como las siguientes que suponen que el usuario pablo maneja su correo en formato maildir (para permitir consulta con IMAPS --ver Sección 5.2.2, “Implementación Courier de POP3S e IMAPS”):

:0fw: spamassassin.lock
* < 512000
| spamc

# Los correos con puntaje de 15 o superior casi que con seguridad son spam (con
# 0.05% de falsos positivos de acuerdo a rules/STATISTICS.txt). Pongamolos
# en un mbox diferente llamado .Spam.
:0:
* ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
/home/pablo/Maildir/.Spam/

# Todo correo marcado como spam (eg. con puntaje mayor que el umbral puesto)
# se mueve a "PosibleSpam".
:0:
* ^X-Spam-Status: Yes
/home/pablo/Maildir/.PosibleSpam/

:0
* .*
/home/pablo/Maildir/

5.3.3. Pruebas

Envíe al usuario al cual le configuró procmail un archivo cuyo cuerpo sea el mensaje del archivo /usr/local/share/doc/SpamAssassin/sample-spam.txt. Debe quedar en la carpeta de correos no solicitados.

5.3.4. Referencias y lecturas recomendadas

/usr/local/share/doc/SpamAssassin/OpenBSD-SpamAssassin-mini-howto.html

5.4. Correo desde el web (webmail)

5.4.1. Roundcubemail

Este cliente de correo para el web tiene una interfaz bastante agradable para el usuario final, con buen rango de posibilidades (libreta de direcciones LDAP, búsquedas, corrección ortográfica) y facilidad de configuración e instalación.

Requiere una base de datos para almacenar parte de la información, puede obtener correo de servidores IMAP e IMAPS.

Basta instalar el paquete roundcubemail o descargar ls fuentes más recientes de http://sourceforge.net/projects/roundcubemail/ e instalarlas en /var/www/roundcubemail, y seguir instrucciones del archivo INSTALL que resumimos a continuación junto con instrucciones de módulos, suponiendo que en el mismo servidor (correo.miescuela.edu.co) están los servicios IMAPS y SMTP y que se empleará el motor de bases de datos PostgreSQL:

  1. Tras instalar, el cliente quedará en /var/www/roundcubemail por lo que es necesario configurar el servidor web. Por ejemplo si el correo de la organización se consultará en correo.miescuela.edu.co (IP interna 192.168.60.1 y externa 200.200.200.200) con protocolo HTTPS, el archivo /var/www/conf/httpd.conf debe incluir:

    <VirtualHost 127.0.0.1:443 192.168.60.1:443 200.200.200.200:443>
    DocumentRoot "/var/www/roundcubemail/"
    ServerName correo.miescuela.edu.co
    
    <Directory /var/www/roundcubemail/>
    	AllowOverride All
    </Directory>
    
    ServerAdmin admin@miescuela.edu.co
    ErrorLog logs/round-error_log
    TransferLog logs/round-access_log
    
    SSLEngine on
    SSLCertificateFile    /etc/ssl/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
    </VirtualHost>                                  
    

    [Aviso]Aviso

    Es importante que en la configuración de Apache, como se presenta en el ejemplo incluya

    <Directory /var/www/roundcubemail/>
    	AllowOverride All
    </Directory>
    

    para que se tomen las opciones de configuración del archivo .htaccess especialmente del directorio logs donde se almacenan bitácoras y en particular si se activa puede mantenerse la bitacora imap donde quedan claves planas.

  2. Para configurar una base de datos en PostgreSQL con socket en /var/www/tmp (ver Sección 3, “Motor de bases de datos PostgreSQL”) ejecutar:

    sudo su - _postgresql
    createuser -h /var/www/tmp -Upostgres roundcube
    createdb -h /var/www/tmp -Upostgres -E UNICODE roundcubemail -T template0
    psql -h /var/www/tmp -Upostgres template1
    

    y desde la interfaz administrativa de PostgreSQL establezcla una clave para el usuario roundcube con:

    ALTER USER roundcube WITH PASSWORD 'nueva_clave';
    

    Salir con '\q' y desde la línea de comandos ingresar a la nueva base con:

    psql -h /var/www/tmp -Uroundcube roundcubemail
    	

    le solicitará la clave que estableció para el usuario roundcube, a continuación desde la interfaz de PostgreSQL ejecute el script de inicialización con:

    \i /var/www/roundcubemail/SQL/postgres.initial.sql
    			

  3. Salga de la interfaz de PostgreSQL con \q y de la cuenta _postgresql con exit. Después debe configurar roundcubemail, editando los archivos del directorio /var/www/roundcubemail/config. Si al examinar con

    ls /var/www/roundcubemail/config
    

    le faltan los archivos main.inc.php y db.inc.php inicie con plantillas así:

    cp /var/www/roundcubemail/config/main.inc.php.dist \
    	/var/www/roundcubemail/config/main.inc.php
    cp /var/www/roundcubemail/config/db.inc.php.dist \
    	/var/www/roundcubemail/config/db.inc.php
    

    Editelos para que se adapten a su caso. Por ejemplo en config/main.inc.php basta modificar las líneas:

    $rcmail_config['force_https'] = TRUE;
    
    $rcmail_config['auto_create_user'] = TRUE;
    
    $rcmail_config['default_host'] = 'ssl://correo.miescuela.edu.co:993';
    
    $rcmail_config['default_port'] = 993;
    
    $rcmail_config['smtp_server'] = '127.0.0.1';
    
    $rcmail_config['mail_domain'] = 'miescuela.edu.co';
    

    y en el archivo config/db.inc.php la línea:

    $rcmail_config['db_dsn'] = 'pgsql://roundcube:nueva_clave@127.0.0.1/roundcubemail';
    

  4. Edite el archivo de configuración de Apache /var/www/conf/php.ini para deshabilitar encripción de sesiones y establecer zona horaria en la líneas:

    suhosin.session.encrypt = Off
    date.timezone = America/Bogota
    		  

    y reinicie Apache.

  5. De permiso para completar instalación y pruebas desde el web, editando el archivo config/main.inc.php y cambiando la línea:

    $rcmail_config['enable_installer'] = true;
    

    y ejecutando:

    sudo chmod -R a+rx /var/www/roundcubemail/installer
    

  6. Con un navegador examine el URL https://correo.miescuela.edu.co/installer/ compruebe las dependencias solicitadas y realice las pruebas disponibles. Una vez concluya evite el uso de ese directorio ejecutando:

    sudo chmod -R a-rx /var/www/roundcubemail/installer
    

    y cambiando en config/main.inc.php la línea:

    $rcmail_config['enable_installer'] = false;
    

Roundcubemail incluye plugins para diversas labores, por ejemplo si desea añadir la posibilidad de cambiar la clave a los usuarios desde este programa debe activar el plugin passwords, para esto:

  1. En el archivo config/main.php.inc agregue password en el ar

Si además desea permitir que los usuarios puedan cambiar su clave desde este webmail active el plugin password como se presenta a continuación:

  1. Edite el archivo config/main.inc.php y añada password al arreglo rcmail_config['plugins'], por ejemplo si no hay otros plugins cambiando

    $rcmail_config['plugins'] = array();
    

    por

    $rcmail_config['plugins'] = array('password');
    

  2. Si no existe el archivo plugins/password/config.inc.php inicie uno con:

    cp plugins/password/config.inc.php.dist plugins/password/config.inc.php
    				  

  3. Modifique el archivo plugins/password/config.inc.php de acuerdo a su configuración, por lo menos los siguientes 3 valores deben cambiarse:

    $rcmail_config['password_driver'] = 'poppassd';
    $rcmail_config['password_pop_host'] = '127.0.0.1';
    $rcmail_config['password_pop_port'] = 106;
    				  

  4. Instale el paquete openpoppassd disponible en ftp://ftp.pasosdeJesus.org/pub/AprendiendoDeJesus/ (tiene una falla corregida con respecto al paquete oficial por lo cual le sugerimos emplear ese) y configurelo para que inicie durante el arranque por ejemplo agregando a /etc/rc.local:

    pgrep poppassd > /dev/null 2>&1
    if (test "$?" != "0") then {
            echo -n ' poppassd'
            /usr/local/libexec/openpoppassd
    } fi;
    				  

    Una vez lo haya iniciado puede probarlo con:

    telnet localhost 106
    				  

    que debe responder con:

    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    200 openpoppassd v1.1 hello, who are you?
    				  

5.5. Listas de correo

5.5.1. Instalación de Mailman (sin chroot)

Instalar paquete de mailman pkg_add $PKG_PATH/mailman.tgz que requiere python-2.5.4p7 se crean automáticamente el grupo _mailman y el usuario _mailman

Leer /usr/local/share/doc/mailman/README.OpenBSD

Editar /var/www/conf/httpd.conf agregando la linea:

ScriptAlias /mailman/ "$mailmandir/cgi-bin/"

donde $mailmandir es /usr/local/lib/mailman/ agregar también:

<Directory "/usr/local/lib/mailman/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

además agregar las lineas:

Alias /pipermail/ "/var/spool/mailman/archives/public/"

<Directory "/var/spool/mailman/archives/public/">
        Options FollowSymLinks
        AddDefaultCharset Off
</Directory>

al mismo archivo.

Copiar los iconos: cp /usr/local/lib/mailman/icons/* /var/www/icons/ Reiniciar el apache para que cargue los cambios.

apachectl stop
. /etc/rc.conf.local
httpd $httpd_flags

editar el archivo /usr/local/lib/mailman/Mailman/mm_cfg.py agregando las lineas

DEFAULT_EMAIL_HOST = 'dominio.net'
DEFAULT_URL_HOST = 'www.dominio.net'
DEFAULT_URL_PATTERN = 'http://%s/mailman/'
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)

Crear primera lista llamada mailman

/usr/local/lib/mailman/bin/newlist mailman

agregar a /etc/mail/aliases las lineas:

## mailman mailing list
mailman:              "|/usr/local/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/usr/local/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/usr/local/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/usr/local/lib/mailman/mail/mailman confirm mailman"
mailman-join:         "|/usr/local/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/usr/local/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/usr/local/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/usr/local/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/usr/local/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/usr/local/lib/mailman/mail/mailman unsubscribe mailman"

Regenerar alias con newaliases

Poner en el crontab algunas lineas:

crontab -u _mailman  /usr/local/lib/mailman/cron/crontab.in

Reiniciar mailman:

/usr/local/lib/mailman/bin/mailmanctl start

Hacer que cada vez que se inicie el equipo corra mailman, agregando al archivo /etc/rc.local las lineas:

if [ X"$mailmanctl_flags" != X"NO" -a  \
	-x /usr/local/lib/mailman/bin/mailmanctl ]; then
          echo -n ' mailman'
          /usr/local/lib/mailman/bin/mailmanctl $mailmanctl_flags
fi

y en /etc/rc.conf.local:

mailmanctl_flags="-s -q start"

Asignar password al sitio de mailman con

	/usr/local/lib/mailman/bin/mmsitepass

5.5.1.1. Lecturas recomendadas

/usr/local/share/doc/mailman/README.OpenBSD



[27] De acuerdo al RFC 1123 los nombre MUA y MTA son propios del protocolo X.400.

[28] De acuerdo al protocolo SMTP, sendmail de amor se conectaría por el puerto 25 a sendmail en respeto y enviaría los mensajes EHLO, MAIL FROM: pablo@amor.miescuela.edu.co, después enviaría RCPT TO: rodrigo@respeto.miescuela.edu.co, después DATA y a continuación el cuerpo del correo comenzando con el encabezado de acuerdo al RFC 822, con un cuerpo de mensaje que emplee 7 bits y terminando con una línea que sólo tenga un punto. Por ejemplo

From: pablo@amor.miescuela.edu.co
To: rodrigo@respeto.miescuela.edu.co
Subject: Saludo

Un cortisimo saludo para bendición de nuestro Creador.
.  

Si lo desea puede experimentar con este protocolo, empleando telnet y el MTA de su computador: telnet localhost 25. Claro resulta más transparente empleando directamente sendmail :

 sendmail -bm
rodrigo@respeto.miescuela.edu.co -f
pablo@amor.miescuela.edu.co 

(para emplear -f con sendmail debe ser usuario autorizado).

[29] Son inseguros porque transmiten claves y el contenido de los mensajes planos por la red