viernes, 12 de septiembre de 2008

dbmail con PostgreSQL Debian (Etch)

Supongo instalado el servidor de base de datos PostgreSQL y me centraré más en la instalación y configuración de dbmail.

Una cosa si tendremos en cuenta, en el fichero /etc/postgresql/8.1/main/pg_hba.conf tenemos que modificar el modo de identificación de los usuario md5, para ello modificaremos la linea:
local all all ident sameuser

Por:
local all all md5

Una vez hecho esto simplemente reiniciaremos PostgreSQL (/etc/init.d/postgresql-8.1 restart) y empezaremos por crear la base de datos dbmail y el usuario dbmail dentro del servidor de base de datos PostgreSQL.
#su postgres
$psql template1
CREATE USER dbmail PASSWORD '123456789';
CREATE DATABASE dbmail OWNER dbmail ENCODING = 'UNICODE';
\q

Probamos el acceso a la base de datos dbmail, por si hay algún problema.
# psql -U dbmail dbmail
Contraseña para usuario dbmail:
Bienvenido a psql 8.1.11, la terminal interactiva de PostgreSQL.

Digite: \copyright para ver los términos de distribución
\h para ayuda de comandos SQL
\? para ayuda de comandos psql
\g o or termine con punto y coma para ejecutar una consulta
\q para salir

dbmail=> \q

Instalaremos postfix, postfix-pgsql, para ello:
aptitude install postfix postfix-pgsql

General type of configuration? Internet Site
Nombre de correo? miservidor.midominio

Vamos a comenzar a instalar dbmail, editaremos el fichero /etc/apt/sources.list y añadimos la linea:
deb http://debian.nfgd.net/debian stable main

Después de actualizar la lista de paquetes (aptitude update) instalaremos el paquete dbmail-pgsql, que instalará por dependencia el paquete dbmail.
aptitude install dbmail-pgsql

Tenemos que crear la estructura de la base de datos, para ello:
cp /usr/share/doc/dbmail-pgsql/examples/create_tables.pgsql.gz .
gunzip create_tables.pgsql.gz .
psql -U dbmail dbmail < create_tables.pgsql

Ya tenemos instalada la aplicación, ahora empezamos a configurar. Editamos el fichero /etc/default/dbmail (nano /etc/default/dbmail) y añadimos:
START_POP3D=1
START_IMAPD=1
START_LMTPD=1

Editamos el fichero /etc/dbmail/dbmail.conf y modificamos estas lineas:
driver = pgsql
authdriver = sql
host = localhost
pass = 123456789
[POP] POP_BEFORE_SMTP = yes,
[IMAP] IMAP_BEFORE_SMTP = yes

Reiniciamos dbmail y tendremos que ver algo parecido a esto:
/etc/init.d/dbmail restart
Starting dbmail servers: dbmail-imapd dbmail-pop3d dbmail-lmtpd.

Tenemos que instalar clamsmtp clamav-daemon postgrey.
aptitude install clamsmtp clamav-daemon postgrey

Es el fichero de configuración de postfix tendremos que tocar algunas cosas.
nano /etc/postfix/main.cf

Añadiremos en la primera línea sin comentario esta variable y la inicializaremos con el nombre del dominio del cual estemos montando el servidor de correo electrónico. Es muy importante que este dominio sea un dominio valido, es decir que tenga todas las características de un dominio, .com .es .net ... algunos servidores de anti-spam se basan en el nombre del servidor de correo para definirlo como spam y lo último que queremos que ocurra es que nuestro nuevo servidor de correo sea marcado como servidor de spam.
myhostname = www.midominio.com

# resuelve en /etc/hosts (no solo dns)
smtp_host_lookup = dns, native

Definimos que busque en el fichero /etc/postfix/sql-pop-before-smtp.cf las IPs que tienen permiso para enviar correos desde nuestro servidor, así no necesitamos tener autenticación en nuestro servidor SMPT, porque siempre que hagamos una lectura antes del intento de envío, el servidor POP o IMAP capturará nuestra IP y gracias a la conexión del fichero /etc/postfix/sql-pop-before-smtp.cf nuestra IP aparecerá en la lista de IPs permitidas.
# utilizo POP BEFORE SMTP para no actuar de OpenRelay
mynetworks = 127.0.0.0/8, pgsql:/etc/postfix/sql-pop-before-smtp.cf

Igualmente utilizaremos una conexión a la base de datos para sacar el listado de dominios de los que debemos aceptar correos electrónicos. En esta ocasión la guardamos en una variable y después lo añadimos a la variable mydestination.
# se pueden añadir dominios en la base de datos
transport_maps = pgsql:/etc/postfix/sql-transport.cf
mydestination = localhost, localhost.localdomain, $transport_maps
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:60000
content_filter = scan:localhost:10026
receive_override_options = no_address_mappings

Ahora editaremos el fichero /etc/postfix/master.cf y verificamos que estas tres instrucciones está activas.
dbmail-lmtp unix - - n - - lmtp
-o disable_dns_lookups=yes
# AV scan filter (used by content_filter)
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10025 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8,pgsql:/etc/postfix/sql-pop-before-smtp.cf

Aún nos quedan crear los ficheros /etc/postfix/sql-pop-before-smtp.cf y /etc/postfix/sql-transport.cf
El primero le indica a Postfix las IPs que tienen permiso para enviar (SMTP) por haber leído correo previamente (POP3 o IMAP). Es el archivo /etc/postfix/sql-pop-before-smtp.cf y su contenido es:
user=dbmail
password=123456789
dbname=dbmail
hosts=localhost
table=dbmail_pbsp
select_field=since
where_field=ipnumber

El segundo nos va a permitir agregar nuevos dominios desde la base de datos. Es el archivo /etc/postfix/sql-transport.cf y su contenido:
user=dbmail
password=123456789
dbname=dbmail
table=dbmail_transport
select_field=transport
where_field=domain
hosts=localhost

Ahora tendremos que crear la tabla dbmail_transport en la base de datos dbmail si no existe. No podemos olvidarnos de hacer el INSERT que agregará el/los dominio a los que escuchará nuestro servidor de correo.
psql -U dbmail dbmail
Contraseña para usuario dbmail:
Bienvenido a psql 8.1.11, la terminal interactiva de PostgreSQL.

Digite: \copyright para ver los términos de distribución
\h para ayuda de comandos SQL
\? para ayuda de comandos psql
\g o or termine con punto y coma para ejecutar una consulta
\q para salir

dbmail=> select * from dbmail_transport;
ERROR: no existe la relación «dbmail_transport»
dbmail=> CREATE TABLE dbmail_transport (domain VARCHAR(100) NOT NULL, transport VARCHAR(100) NOT NULL DEFAULT 'dbmail-lmtp:localhost:24');
CREATE TABLE
dbmail=> INSERT INTO dbmail_transport (domain) VALUES ('midominio.com');
INSERT 0 1

Una vez hecho todo, reiniciaremos Postfix.
/etc/init.d/postfix restart

Aún queda un problema con Dbmail y PostgreSQL. Existe un problema con ciertas codificaciones. Es necesario editar el archivo /etc/init.d/dbmail y agregar un par de lineas. Se deben poner al principio ya que se trata de una variable de entorno utilizada en la conexión con PostgreSQL.
# Codificación que se lebantará con la base de datos PostgreSQL
PGCLIENTENCODING=UNICODE
export PGCLIENTENCODING

Así podemos dar de alta al usuario jmruiz con password jmruiz y correo electrónico jmruiz@midominio.com.
dbmail-users -a jmruiz -w jmruiz -s jmruiz@midominio.com
Adding INBOX for new user... ok.
[jmruiz@midominio.com]
Done
jmruiz:x:4:0:0.00:0.00:jmruiz@midominio.com

Para probar el usuario podemos hacer telnet al puerto POP y acceder como el usuario jmruiz.
telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK DBMAIL pop3 server ready to rock
user jmruiz
+OK Password required for jmruiz
pass jmruiz
+OK jmruiz has 0 messages (0 octets)
quit
+OK see ya later
Connection closed by foreign host.


Si ves en el log /var/log/mail.log este error "fatal: pgsql:/etc/postfix/sql-pop-before-smtp.cf(0,lock|fold_fix): table lookup problem". Seguro que te será de mucha ayuda este enlace.