viernes, 28 de junio de 2013

dbmail con PostgreSQL Debian (Wheezy)


Este manual sigue en la linea del escrito hace ya algunos años sobre dbmail y postgresql. Tras 5 años de escribir el primer manual de dbmail bajo postgresql, toca actulizarse. Así pues describo como instalar dbmail 3.0.2 y postfix 2.9.6-2, utilizando como base de datos postgresql 9.2.4 y todo corriendo sobre Debian 7.

Os dejo por aquí el enlace al manual anterior, por si alguien necesita tocar algún servidor antiguo y no sabe por donde comenzar. Encontrará algunas pautas de administración.

http://josemanuelruizbaena.blogspot.com.es/2008/09/dbmail-con-postgresql-debian-etch.html

Para el funcionamiento de dbmail es imprescindible tener instalado un sistema gestor de base de datos. He encontrado en internet muchos manuales que enseñan como montar dbmail bajo MySQL. Pero después de mi experiencia y tras probar las bondades de PostgreSQL, sin duda este manual de dbmail será para montarlo utilizando como motor de base de datos PostgreSQL.

Puesto que la instalación de PostgreSQL puede no ser trivial para algunos usuarios os dejo por aquí un manual para instalar PostgreSQL en Debian 7 desde código fuente. Si ya es robusto cuando se instala desde los repositorios de Debian, imaginad cuanto no lo será compilando tu código fuente directamente.

http://josemanuelruizbaena.blogspot.com/2013/06/compilar-postgresql-en-debian.html

Requisitos de dbmail:


Hay algunos requisitos que necesitas tener en el sistema para poder instalar dbmail desde la compilación de su código fuente. Si has seguido el manual de instalación de postgresql desde su código fuente o alguna vez has compilado no necesitarás in
aptitude install build-essential
aptitude install gcc libglib2.0-dev libmhash-dev libevent-dev libssl-dev flex automake

Es necesario también instalar libzdb y libgmime-2.4-dev, pero no están disponibles por ahora (27 de junio de 2013) en el repositorio de Debian 7. Así pues lo instalamos directamente desde el código fuente.
wget http://www.tildeslash.com/libzdb/dist/libzdb-2.10.2.tar.gz
tar xvzf libzdb-2.10.2.tar.gz
cd libzdb-2.10.2
 ./configure --with-postgresql=/opt/postgresql-9.2.4/bin/pg_config

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... none
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking whether gcc needs -traditional... no
checking for re2c... re2c_not_found
checking for flex... /usr/bin/flex
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking how to print strings... printf
checking for a sed that does not truncate output... /bin/sed
checking for fgrep... /bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking whether the shell understands some XSI constructs... yes
checking whether the shell understands "+="... yes
checking for /usr/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for ar... ar
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking for pthread_create in -lpthread... yes
checking for library containing crypt... -lcrypt
checking for mysql... yes
checking for mysql_config... no
configure: WARNING: mysql_config is required to build libzdb with mysql
checking for postgresql... yes
checking for /opt/postgresql-9.2.4/bin/pg_config... yes
checking libpq-fe.h usability... yes
checking libpq-fe.h presence... yes
checking for libpq-fe.h... yes
checking for SQLite3... yes
checking for sqlite3_open in -lsqlite3... no
checking for oracle... checking if Oracle support is enabled... no
checking for ANSI C header files... (cached) yes
checking for an ANSI C-conforming const... yes
checking whether byte ordering is bigendian... no
configure: creating ./config.status
config.status: creating Makefile
config.status: creating test/Makefile
config.status: creating zdb.pc
config.status: creating src/xconfig.h
config.status: executing libtool_patch commands
config.status: executing depfiles commands
config.status: executing libtool commands
+------------------------------------------------------------+
| License:                                                   |
| This is Open Source Software and use is subject to the GNU |
| GENERAL PUBLIC LICENSE, available in this distribution in  |
| the file COPYING.                                          |
|                                                            |
| By continuing this installation process, you are bound by  |
| the terms of this license agreement. If you do not agree   |
| with the terms of this license, you must abort the         |
| installation process at this point.                        |
+------------------------------------------------------------+
| Libzdb is configured as follows:                           |
|                                                            |
|   Optimized:                                    DISABLED   |
|   Protected:                                    DISABLED   |
|   Profiling:                                    DISABLED   |
|   Zild:                                         DISABLED   |
|   Sqlite3 unlock notification API:              DISABLED   |
|   Openssl:                                      DISABLED   |
|   Unit Tests Build:                             ENABLED    |
|------------------------------------------------------------|
|   SQLite3:                                      DISABLED   |
|   MySQL:                                        DISABLED   |
|   PostgreSQL:                                   ENABLED    |
|   Oracle:                                       DISABLED   |
+------------------------------------------------------------+


make
make install
Para instalar libgmime-2.4-dev lo descargamos de http://ftp.acc.umu.se/pub/GNOME/sources/gmime/2.4/.
wget http://ftp.acc.umu.se/pub/GNOME/sources/gmime/2.4/gmime-2.4.33.tar.xz
tar -Jxf gmime-2.4.33.tar.xz
cd gmime-2.4.33
./configure
make
make install

Instalar postfix

Ya hemos instalado todas las librerías y requisitos para dbmail, pero necesitamos un gestor SMTP que se comunique a la perfección con nuestro dbmail y orqueste todo el sistema.

Yo prefiero Postfix y por ahora instalaremos el del sistema, que va perfectamente. No sé si el día de mañana haré un nuevo manual con postfix compilado.

Cuando intentamos instalar Postfix nos advierte el sistema que ya existe un SMTP funcionando en el sistema, se trata de exim4. La solución que nos propone apt es la correcta, desinstalará exim4 (y los subpaquetes instalados) e instalará postfix.
aptitude install postfix
Se instalarán los siguiente paquetes NUEVOS:    
  postfix{b} ssl-cert{a}
0 paquetes actualizados, 2 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 1.566 kB de ficheros. Después de desempaquetar se usarán 3.380 kB.
No se satisfacen las dependencias de los siguientes paquetes:
 exim4-config : Entra en conflicto: postfix pero se va a instalar 2.9.6-2.
 postfix : Entra en conflicto: mail-transport-agent que es un paquete virtual.
 exim4-daemon-light : Entra en conflicto: mail-transport-agent que es un paquete virtual.
Las acciones siguientes resolverán estas dependencias

     Eliminar los paquetes siguientes:
1)     exim4                         
2)     exim4-base                    
3)     exim4-config                  
4)     exim4-daemon-light            

¿Acepta esta solución? [Y/n/q/?]
Al comenzar la instalación de Postfix veremos esta pantalla en el terminal, nos pregunta sobre el modo de funcionamiento de nuestra instancia de postfix. Seleccionamos "Sitio de Internet: El correo se envía y recibe directamente utilizando SMTP.".
También nos preguntará sobre el dominio (o subdominio, como es el caso de la captura) que queremos controlar con nuestro postfix.

Tras estos dos pasos terminará la instalación y configuración básica de postfix, más adelante continuaremos con configuración de postfix.

Crear base de datos (almacén de correos) 

Tras instalar todos los requisitos, creamos el usuarios dentro de PostgreSQL para que dbmail pueda almacenar los datos para la gestión del sistema de correos.
su postgres
echo "create user dbmail with password 'xxxx' " | /opt/postgresql-9.2.4/bin/psql template1
echo "create database dbmail owner dbmail encoding='UNICODE'" | /opt/postgresql-9.2.4/bin/psql template1

Instalar dbmail

Compilar dbmail


Ahora ya estamos preparados para compilar dbmail. Lo primero es descargar el paquete con el código fuente directamente de la web del proyecto http://www.dbmail.org/, en la sección download. Como comentamos al principio en este manual instalaremos la versión 3.0.2, es la última publicada (marzo de 2012) tiene más de un año, pero funciona perfectamente.

Descargamos, descomprimimos, configuramos, compilamos e instalamos con los siguientes comandos:
wget http://www.dbmail.org/download/3.0/dbmail-3.0.2.tar.gz
tar xvzf dbmail-3.0.2.tar.gz
cd dbmail-3.0.2
./configure --with-zdb=/usr/local
make
make install

Configurar dbmail


Tras instalar dbmail, lo primero que tenemos que hacer es crear la estructura de la base de datos con el fichero de inicialización. El fichero con la estructura de la base de datos se encuentra en el paquete que hemos descargado (dbmail-3.0.2.tar.gz) en "sql/postgresql/create_tables.pgsql".

Para cargar la estructura de la base de datos, necesitamos tener creada la base de datos. Esto lo hicimos en un paso anterior.
cat sql/postgresql/create_tables.pgsql | /opt/postgresql-9.2.4/bin/psql -U dbmail dbmail
Ahora procedemos a copiar el fichero de configuración en el directorio de configuración de nuestro sistema y configurar algunas parametrizaciones.
cp dbmail.conf /etc/
nano /etc/dbmail.conf
Parametrizamos la conexión a la base de datos.
driver               = postgresql
authdriver           = sql
host                 = localhost
sqlport              = 5432
pass                 = xxx
db                   = dbmail
Usuario del sistema que lanzará los procesos dbmail. Puede ser dbmail o el que creeis para este fin, si queréis crear el usuario dbmail basta con ejecutar "adduser dbmail", esto os pedirá las claves de acceso así como información descriptiva del usuario.
effective_user        = dbmail
effective_group       = dbmail
Definimos los ficheros de log, tanto para errores generales como para errores. Será necesario crear el directorio "/var/log/dbmail". Por defecto intentará crear los ficheros en "/var/log" directamente, pero a mi personalmente me gusta más tener un directorio para los ficheros de log de cada aplicación. Así será más rápido localizar los ficheros cuando sean necesarios.
logfile               = /var/log/dbmail/dbmail.log
errorlog              = /var/log/dbmail/dbmail.err

Hacemos igual para el fichero donde se guarda el pid del proceso en ejecución.
# cambiamos el directorio donde están los pidfile
pid_directory         = /var/run/dbmail
Es muy importante no olvidar asignar permisos a los directorios "/var/run/dbmail" y "/var/log/dbmail/" para el usuario "dbmail" para que el proceso pueda escribir en ellos. Puede asignar permisos ejecutando "chown -R dbmail:dbmail /var/log/dbmail/" y "chown -R dbmail:dbmail /var/run/dbmail".

Encontrarás también instrucciones para definir los certificados necesarios para tls. Si vas a utilizar tls será necesario definirlos.
tls_cafile            = /etc/ssl/certs/ssl-cert-*.pem
tls_cert              = /etc/ssl/certs/ssl-cert-*.pem
tls_key               = /etc/ssl/private/ssl-cert-*.key
Para realizar envíos de correos desde nuestro SMTP por parte de los clientes de nuestro servidor de correos, me gusta configurar estas opciónes: pop_before_smtp y imap_before_smtp, esto hace que el SMTP no requiera autenticación, simplemente verifica si el usuario ha realizado una lectura de una cuenta POP o IMAP, y si la ha realizado en los últimos 5 minutos, permitirá que realice el envío SMTP.

Para establecer esta configuración es necesario definir las siguientes instrucciones.
[POP]

pop_before_smtp       = yes

[IMAP]

imap_before_smtp      = yes

Configurar postfix

En un apartado anterior se ha descrito como instalar postfix.

/etc/postfix/main.cf

transport_maps = pgsql:/etc/postfix/sql-transport.cf
mydestination = localhost, $transport_maps


mynetworks = 127.0.0.0/8, pgsql:/etc/postfix/sql-pop-before-smtp.cf



receive_override_options = no_address_mappings

local_recipient_maps =

smtpd_recipient_restrictions =
    permit_mynetworks,
    reject_unauth_destination,
    permit

Otro enlaces de interés para dbmail

Clamav
Listas grises
MailGraph