Servidor de Correo con Postfix en FreeBSD - Redes

Anuncio
Servidor de Correo con Postfix en FreeBSD
Autor: ACMhUnTeR
Actualizado: 17/02/2005
Plataforma: FreeBSD 5.3-STABLE
El documento puede ser copiado, modificado, redistribuido, con la unica condicion de hacer mencion al autor y la url original del documento
(eldemonio.org y bsdperu.org) como de las personas que colaboraron en el mismo.
INTRODUCCIÓN
En este documento explicare como configurar un Servidor de Correo utilizando Postfix para ser utilizado para multiples dominios utilizando MySQL o
PostgreSQL, para el acceso a nuestro correo mediante imap y pop3 utilizaremos courier-imap y courier-authlib, para la autentificacion de
nuestros usuarios utilizaremos cyrrus-sasl2, con lo cual podremos controlar el RELAY de nuestro servidor, para ayudarnos en la administración de
postfix utilizaremos una herramienta desarrollada en php llamada postfixadmin.
INSTALANDO NUESTROS PAQUETES
Instalando MySQL(Primera opcion de base de datos)
Instalamos MySQL donde tendremos la información de las cuentas, dominios entre otras cosas de nuestro servidor de correo.
HellFire# cd /usr/ports/databases/mysql40-server
HellFire# make install clean clean-depends
Instalando PostgreSQL(Segunda opcion de base de datos)
Instalamos PostgreSQL donde tendremos la información de las cuentas, dominios entre otras cosas de nuestro servidor de correo.
HellFire# cd /usr/ports/databases/postgresql80-server
HellFire# make install clean clean-depends
Instalando courier-imap
Instalamos courier-imap con soporte para quotas
HellFire# cd /usr/ports/mail/courier-imap
HellFire# make WITH_TRASHQUOTA=yes install clean clean-depends
Instalando courier-authlib con soporte MySQL
Instalamos courier-authlib con soporte para MySQL para la autentificacion con imap y pop3
HellFire# cd /usr/ports/mail/courier-authlib
HellFire# make WITH_MYSQL=yes install clean clean-depends
Instalando courier-authlib con soporte PostgreSQL
Instalamos courier-authlib con soporte para PostgreSQL para la autentificacion con imap y pop3
HellFire# cd /usr/ports/mail/courier-authlib
HellFire# make WITH_POSTGRESQL=yes install clean clean-depends
Instalando cyrrus-sasl2 con soporte MySQL
Descargaremos los parches para cyrrus-sasl2 el cual nos permitira trabajar usando contraseñas md5 en MySQL, los parches podemos bajarlos desde
http://frost.ath.cx/software/cyrus-sasl-patches/dist/, la version de parche de cyrrus-sasl2 que yo utilice fue la 2.1.19 pero estos mismos parches tambien
funcionan para la version 2.2.20, una vez descargados los parches para FreeBSD copiaremos los archivos a la carpeta files de nuestro port de cyrrussasl2 para que sean aplicados en el momento de la compilación.
HellFire# cp patch* /usr/ports/security/cyrrus-sasl2/files
Instalamos cyrrus-sasl2 con soporte para MySQL.
HellFire# cd /usr/ports/security/cyrrus-sasl2
HellFire# make WITH_MYSQL=yes install clean clean-depends
Instalando cyrrus-sasl2 con soporte PostgreSQL
Los parches descargados tambien los aplicamos a cyrrus-sasl2 para el soporte de contraseñas md5 utilizadas en las cuentas de correo.
HellFire# cp patch* /usr/ports/security/cyrrus-sasl2/files
Instalamos cyrrus-sasl2 con soporte para PostgreSQL.
HellFire# cd /usr/ports/security/cyrrus-sasl2
HellFire# make WITH_PGSQL=yes install clean clean-depends
Instalando Apache, PHP y postfixadmin
Instalamos apache desde nuestro arbol de ports.
HellFire# cd /usr/ports/www/apache13
HellFire# make install clean clean-depends
Instalamos php4, php4-mysql o php4-pgsql para el soporte de php con MySQL o PostgreSQL y php4-pear utilizado por postfixadmin.
HellFire# cd /usr/ports/lang/php4
HellFire# make install clean clean-depends
HellFire# cd /usr/ports/devel/php4-pear
HellFire# make install clean clean-depends
HellFire# cd /usr/ports/databases/php4-mysql
HellFire# make install clean clean-depends
HellFire# cd /usr/ports/databases/php4-pgsql
HellFire# make install clean clean-depends
HellFire# cd /usr/ports/mail/postfixadmin
HellFire# make install clean clean-depends
Instalando Postfix
En la instalacion de postfix no centraremos en marcar el soporte para SASL2, MySQL o PostgreSQL, TLS y VDA en la ventana generada en la instalacion
del port.
HellFire# cd /usr/ports/mail/postfix
HellFire# make install clean clean-depends
En el transcurso de la instalacion nos preguntara para agregar el grupo maildrop y el usuario postfix a nuestro sistema le indicamos que si (y).
Al finalizar la instalación aparecera una pregunta si queremos reemplazar la configuración del archivo /etc/mail/mailer.conf para poder controlar el inicio de
postfix desde el rc.conf contestamos que si (y).
CONFIGURANDO EL SERVIDOR DE CORREO
Configurando MySQL
Iniciamos MySQL
HellFire# mysql_safe --user=mysql --datadir=/var/db/mysql --err-log=/var/log/mysqld.log &
Asigamos una contraseña al usuario root cuando nos pida el ingreso de una contraseña solo presionamos enter.
HellFire# mysqladmin -u root -p password nuevopassword
Necesitaremos crear la base de datos, tablas y usuarios que utilizara nuestro servidor de correo para esto haremos unos cambios al archivo DATABASE.TXT
disponible en la carpeta de /usr/local/www/postfixadmin.
HellFire# cp /usr/local/www/postfixadmin/DATABASE_MYSQL.txt /root/postfix-mysql.sql
Editamos el archivo para adaptarlo a nuestras configuración y tendremos como resultado:
HellFire# ee /root/postfix-mysql.sql
# Postfix / MySQL
#
USE mysql;
# Creando y dando privilegios a los usuarios postfix y postfixadmin , no olviden cambiar 'PasswordPostfix' y '
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('PasswordPostix'));
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','postfix','Y');
# Postfix Admin user & password
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixadmin',password('PasswordPostfixadmin'));
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) VALUES ('localhost', 'post
FLUSH PRIVILEGES;
GRANT USAGE ON postfix.* TO postfix@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfix@localhost;
GRANT USAGE ON postfix.* TO postfixadmin@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfixadmin@localhost;
CREATE DATABASE postfix;
USE postfix;
#
# Estructura tabla admin utilizada por postfixadmin
#
CREATE TABLE admin (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Admins';
#
# Estructura tabla alias utilizada para guardar informacion de los alias de cuentas
#
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (address),
KEY address (address)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';
#
# Estructura tabla domain contiene informacion de los dominios que administra el servidor, agregamos por defec
#
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '-1',
mailboxes int(10) NOT NULL default '-1',
maxquota int(10) NOT NULL default '-1',
transport varchar(255) default 'virtual',
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (domain),
KEY domain (domain)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains';
#
# Estructura tabla domain_admins contiene informacion acerca del usuario encargado de administrar las cuentas
#
CREATE TABLE domain_admins (
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins';
#
# Estructura tabla log contiene informacion de los cambios realizados usando postfixadmin
#
CREATE TABLE log (
timestamp datetime NOT NULL default '0000-00-00 00:00:00',
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
action varchar(255) NOT NULL default '',
data varchar(255) NOT NULL default '',
KEY timestamp (timestamp)
) TYPE=MyISAM COMMENT='Postfix Admin - Log';
#
# Estructura tabla mailbox mantiene informacion referente a las cuentas de correo, agregamos por defecto los v
#
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
home char(255) default '/home/postfix/',
maildir varchar(255) NOT NULL default '',
quota int(10) NOT NULL default '-1',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
uid int(10) unsigned default '125',
gid int(10) unsigned default '6',
PRIMARY KEY (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';#
#
# Estructura dela tabla vacation usado para el servicio de vacation no lo usaremos pero crearemos las tablas p
#
CREATE TABLE vacation (
email varchar(255) NOT NULL default '',
subject varchar(255) NOT NULL default '',
body text NOT NULL,
cache text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (email),
KEY email (email)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation';
Grabamos los cambios y ejecutamos
HellFire# mysql -u root -pcontraseña_de_root_mysql < /root/postfix.sql
Tambien podemos probar que nuestro usuario postfix de MySQL tenga acceso a las tablas.
mysql -u postfix -p postfix
Configurando PostgreSQL
Inicializamos la base de datosPostgreSQL por defecto ecuchando peticiones localmente 127.0.0.1
HellFire# echo 'postgresql_enable="YES"' >> /etc/rc.conf
HellFire# sh /usr/local/etc/rc.d/010.pgsql.sh initdb
Configuramos permisos de acceso local a PostgreSQL utilizando contraseñas md5.
HellFire# ee /usr/local/pgsql/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local
all
all
# IPv4 local connections:
host
all
all
127.0.0.1/32
md5
md5
Iniciamos PostgreSQL
HellFire# sh /usr/local/etc/rc.d/010.pgsql.sh start
Copiamos el archivo con las sentencias SQL de nuestro postfixadmin para PostgreSQL.
HellFire# cp /usr/local/www/postfixadmin/DATABASE_PGSQL.txt /root/postfix-pgsql.sql
Editamos el archivo y los adaptamos a nuestra configuracion
HellFire# cd /root/
HellFire# ee postfix-pgsql.sql
--- Postfix / PostgreSQL
---- Estructura tabla admin utilizada por postfixadmin
-CREATE TABLE "admin" (
"username" character varying(255) NOT NULL default '',
"password" character varying(255) NOT NULL default '',
"created" timestamp with time zone default now(),
"modified" timestamp with time zone default now(),
"active" boolean NOT NULL default true,
Constraint "admin_key" Primary Key ("username")
);
COMMENT ON TABLE admin IS 'Postfix Admin - Virtual Admins';
--- Estructura tabla alias utilizada para guardar informacion de los alias de cuentas
-CREATE TABLE alias (
address character varying(255) NOT NULL default '',
goto text NOT NULL,
domain character varying(255) NOT NULL default '',
created timestamp with time zone default now(),
modified timestamp with time zone default now(),
active boolean NOT NULL default true,
-- PRIMARY KEY ("address"),
-- KEY address ("address"),
Constraint "alias_key" Primary Key ("address")
);
COMMENT ON TABLE alias IS 'Postfix Admin - Virtual Aliases';
--- Estructura tabla domain contiene informacion de los dominios que administra el servidor, agregamos por defe
-CREATE TABLE domain (
domain character varying(255) NOT NULL default '',
description character varying(255) NOT NULL default '',
aliases integer NOT NULL default 0,
mailboxes integer NOT NULL default 0,
maxquota integer NOT NULL default 0,
transport character varying(255) default 'virtual',
backupmx smallint NOT NULL default 0,
created timestamp with time zone default now(),
modified timestamp with time zone default now(),
active boolean NOT NULL default true,
-- PRIMARY KEY ("domain"),
-- KEY domain ("domain"),
Constraint "domain_key" Primary Key ("domain")
);
COMMENT ON TABLE domain IS 'Postfix Admin - Virtual Domains';
--- Estructura tabla domain_admins contiene informacion acerca del usuario encargado de administrar las cuentas
-CREATE TABLE domain_admins (
username character varying(255) NOT NULL default '',
domain character varying(255) NOT NULL default '',
created timestamp with time zone default now(),
active boolean NOT NULL default true
-- KEY username ("username")
);
COMMENT ON TABLE domain_admins IS 'Postfix Admin - Domain Admins';
--- Estructura tabla log contiene informacion de los cambios realizados usando postfixadmin
-CREATE TABLE log (
timestamp timestamp with time zone default now(),
username character varying(255) NOT NULL default '',
domain character varying(255) NOT NULL default '',
action character varying(255) NOT NULL default '',
data character varying(255) NOT NULL default ''
-- KEY timestamp ("timestamp")
);
COMMENT ON TABLE log IS 'Postfix Admin - Log';
--- Estructura tabla mailbox mantiene informacion referente a las cuentas de correo, agregamos por defecto los
-CREATE TABLE mailbox (
username character varying(255) NOT NULL default '',
password character varying(255) NOT NULL default '',
name character varying(255) NOT NULL default '',
home character varying(255) NOT NULL default '/home/postfix/',
maildir character varying(255) NOT NULL default '',
quota integer NOT NULL default 0,
domain character varying(255) NOT NULL default '',
created timestamp with time zone default now(),
modified timestamp with time zone default now(),
active boolean NOT NULL default true,
uid integer NOT NULL default 125,
gid integer NOT NULL default 6,
-- PRIMARY KEY ("username"),
-- KEY username ("username"),
Constraint "mailbox_key" Primary Key ("username")
);
COMMENT ON TABLE mailbox IS 'Postfix Admin - Virtual Mailboxes';
--- Estructura dela tabla vacation usado para el servicio de vacation no lo usaremos pero crearemos las tablas
-CREATE TABLE vacation (
email character varying(255) NOT NULL default '',
subject character varying(255) NOT NULL default '',
body text NOT NULL,
cache text NOT NULL,
domain character varying(255) NOT NULL default '',
created timestamp with time zone default now(),
active boolean NOT NULL default true,
-- PRIMARY KEY ("email"),
-- KEY email ("email")
Constraint "vacation_key" Primary Key ("email")
);
COMMENT ON TABLE vacation IS 'Postfix Admin - Virtual Vacation';
--- Asignamos privilegios para la base de datos
-GRANT SELECT,INSERT,UPDATE,DELETE ON admin,alias,domain,domain_admins,log,mailbox,vacation TO postfixadmin,pos
Creamos los usuarios postfix y postfixadmin en nuestro servidor PostgreSQL ,que utilizaremos en nuestro servidor de correo y panel de administracion de
cuentas postfixadmin
HellFire# su pgsql
$ createuser postfix -P
$ createuser postfixadmin -P
Ejecutamos las sentencias sql de nuestro archivo postfix-pgsql.sql
$ psql postfix
Bienvenido a psql 8.0.1, el terminal interactivo de PostgreSQL.
Digite:
\copyright para ver los términos de distribución
\h para obtener ayuda sobre comandos SQL
\? para obtener ayuda sobre comandos internos
\g o punto y coma (;) para ejecutar consulta
\q para salir
postfix=# \i postfix-pgsql.sql
postfix=# \q
Configurando Courier-IMAP
Todos los archivos de configuración de courier-imap podemos encontrarlos en /usr/local/etc/courier-imap, procedemos a copiar quitando las
extensiones .dist los archivos de configuración.
HellFire# cd /usr/local/etc/courier-imap
HellFire# ls | awk '{system("cat " $0 " > `echo " $0 "|sed s/.dist//`")}'
Una vez quitadas las extensiones , empezaremos editando el archivo imapd.cnf, poner los datos propios en la seccion [ req_dn ] para la generacion del
certificado usado para conexiones seguras, las otras secciones [req] y [cert_type] los dejaremos con los datos que trae por defecto.
[ req_dn ]
C=PE
ST=AQP
L=Arequipa
O=HellFire Server
OU=Automatically-generated IMAP SSL key
CN=localhost
[email protected]
Lo mismo hacemos con el archivo pop3d.cnf
[ req_dn ]
C=PE
ST=AQP
L=Arequipa
O=HellFire Server
OU=Automatically-generated POP3 SSL key
CN=localhost
[email protected]
Generamos los certificados
HellFire# /usr/local/share/courier-imap/mkpop3dcert
HellFire# /usr/local/share/courier-imap/mkimapdcert
Configuramos el archivo /usr/local/etc/authlib/authmysqlrc o /usr/local/etc/authlib/authpgsqlrc segun el caso, el cual contiene informacion necesaria para
realizar la conexion con MySQL o PostgreSQL para procesar las peticiones imap o pop3.
#######################
# Configuracion MySQL #
#######################
# hostname del servidor MySQL
MYSQL_SERVER
localhost
# Usuario de acceso al MySQL
MYSQL_USERNAME
postfix
# Password de acceso al MySQL
MYSQL_PASSWORD
PasswordPostfix
# Ubicacion del archivo socket creado por MySQL al iniciar
MYSQL_SOCKET
/tmp/mysql.sock
# Puerto utilizado por MySQL
MYSQL_PORT
3306
# Dejar esta opcion en 0
MYSQL_OPT
0
# Nombre de la base de datos usada por nuestro servidor de correo
MYSQL_DATABASE
postfix
# Nombre de la tabla que usaremos para capturar los datos necesarios
MYSQL_USER_TABLE
mailbox
# Campo de la tabla mailbox que contiene el password encryptado de las cuentas
MYSQL_CRYPT_PWFIELD
password
# Campo de la tabla mailbox que contiene la informacion de que usuario del sistema manejara los mailbox de las
MYSQL_UID_FIELD
uid
# Campo de la tabla mailbox que contiene la informacion de que grupo del sistema manejara los mailbox de las c
MYSQL_GID_FIELD
gid
# Campo de la tabla mailbox que contiene el nombre del usuario de una cuenta de la forma [email protected]
MYSQL_LOGIN_FIELD
username
# Campo de la tabla mailbox que indica la ruta base donde se guardaran los mailbox de las cuentas en nuestro c
MYSQL_HOME_FIELD
home
# Campo de la tabla mailbox que indica el nombre del dueño de la cuenta de correo
MYSQL_NAME_FIELD
name
# Campo de la tabla mailbox que indica la ruta donde esta ubicado el directorio donde se alojara los correos d
MYSQL_MAILDIR_FIELD
maildir
# Campo de la tabla mailbox que indica la quota o tamaño maximo de almacenamiento de los buzones de correo
MYSQL_QUOTA_FIELD
quota
# Condicion que se utilizara en la sentencia WHERE de la consulta a la tabla mailbox
MYSQL_WHERE_CLAUSE
active=1
############################
# Configuracion PostgreSQL #
############################
# hostname del servidor MySQL
PGSQL_HOST
localhost
# Usuario de acceso al MySQL
PGSQL_USERNAME
postfix
# Password de acceso al MySQL
PGSQL_PASSWORD
PasswordPostfix
# Puerto utilizado por MySQL
PGSQL_PORT
5432
# Nombre de la base de datos usada por nuestro servidor de correo
PGSQL_DATABASE
postfix
# Nombre de la tabla que usaremos para capturar los datos necesarios
PGSQL_USER_TABLE
mailbox
# Campo de la tabla mailbox que contiene el password encryptado de las cuentas
PGSQL_CRYPT_PWFIELD
password
# Campo de la tabla mailbox que contiene la informacion de que usuario del sistema manejara los mailbox de las
PGSQL_UID_FIELD
uid
# Campo de la tabla mailbox que contiene la informacion de que grupo del sistema manejara los mailbox de las c
PGSQL_GID_FIELD
gid
# Campo de la tabla mailbox que contiene el nombre del usuario de una cuenta de la forma [email protected]
PGSQL_LOGIN_FIELD
username
# Campo de la tabla mailbox que indica la ruta base donde se guardaran los mailbox de las cuentas en nuestro c
PGSQL_HOME_FIELD
home
# Campo de la tabla mailbox que indica el nombre del dueño de la cuenta de correo
PGSQL_NAME_FIELD
name
# Campo de la tabla mailbox que indica la ruta donde esta ubicado el directorio donde se alojara los correos d
PGSQL_MAILDIR_FIELD
maildir
# Campo de la tabla mailbox que indica la quota o tamaño maximo de almacenamiento de los buzones de correo
PGSQL_QUOTA_FIELD
quota
# Condicion que se utilizara en la sentencia WHERE de la consulta a la tabla mailbox
PGSQL_WHERE_CLAUSE
active='t'
Grabamos los cambios e iniciamos imapd y pop3d
HellFire# sh /usr/local/libexec/courier-imap/imapd.rc start
HellFire# sh /usr/local/libexec/courier-imap/pop3d.rc start
Podemos comprobar el inicio de ambos servicios y a la espera de peticiones usando el comando sockstat
HellFire# sockstat -4
USER
COMMAND
PID
FD PROTO
root
couriertcp 18489 6 tcp4
root
couriertcp 18473 6 tcp4
LOCAL ADDRESS
*:110
*:143
FOREIGN ADDRESS
*:*
*:*
Si buscamos tambien conexiones seguras con imap y pop3 podemos iniciar los servicios con soporte para ssl
HellFire# sh /usr/local/libexec/courier-imap/imapd-ssl.rc start
HellFire# sh /usr/local/libexec/courier-imap/pop3d-ssl.rc start
Verificamos los servicios con sockstat
HellFire# sockstat -4
USER
COMMAND
PID
FD PROTO
root
couriertcp 18514 6 tcp4
root
couriertcp 18501 6 tcp4
LOCAL ADDRESS
*:993
*:995
FOREIGN ADDRESS
*:*
*:*
Configurando cyrrus-sasl2
Creamos el archivo de configuración utilizado por cyrrus-sasl2 y agregaremos la informacion que necesita para realizar la conexion a MySQL o
PostgreSQL y autentificar los usuarios cuando enviemos correos.
HellFire# ee /usr/local/lib/sasl2/smtpd.conf
# Metodo de verificacion de password
pwcheck_method: auxprop
# Utilizar metodos plain y login por los clientes
mech_list: plain login
# Especifica en sql_engine que usaremos mysql o pgsql para las autentificaciones
sql_engine: mysql
# Plugin de autentificacion que usaremos
auxprop_plugin: sql
# Cifrado usado para la autentificacion
srp_mda: md5
# Formato de password con el que trabajaremos gracias al parche aplicado :)
password_format: crypt
# hostname del servidor MySQL o PostgreSQL
sql_hostnames: localhost
# Usuario para acceder a las tablas de MySQL o PostgreSQL usadas por nuestro servidor de correo
sql_user: postfix
# Password del usuario de MySQL o PostgreSQL
sql_passwd: PasswordPostfix
# Base de datos a usar
sql_database: postfix
# SQL a utilizar para obtener el password del usuario autentificar
sql_select: select password from mailbox where username = '%u@%r'
Todas las opciones que se pueden especificar para sasl2 pueden encontrarlo en el archivo doc/options.html de las fuentes de cyrrus-sasl2
Configurando Postfix
Antes de empezar verificamos el soporte de postfix con MySQL o PostgreSQL
HellFire# postconf -m
static
sdbm
cidr
pcre
regexp
environ
mysql # soporte mysql
pgsql # soporte postgresql
proxy
btree
unix
hash
Podemos observar que en la lista tenemos la palabra mysql con lo cual confirma el soporte, ahora procedemos a crear los archivos virtual_alias_maps.cnf,
virtual_mailbox_maps.cnf, virtual_uid_maps.cnf, virtual_gid_maps.cnf, transport_maps.cnf, virtual_mailbox_limit_maps.cnf en el directorio de configuración
de postfix /usr/local/etc/postfix , crearemos ahi el directorio cnf.
HellFire# cd /usr/local/etc/postfix/ && mkdir cnf && cd cnf
HellFire# ee virtual_alias_maps.cnf
user = postfix
password= PasswordPostfix
dbname = postfix
table = alias
select_field = goto
where_field = address
hosts = localhost
HellFire# ee virtual_mailbox_maps.cnf
user = postfix
password= PasswordPostfix
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
hosts = localhost
HellFire# ee virtual_uid_maps.cnf
user=postfix
password = PasswordPostfix
dbname = postfix
table = mailbox
select_field = uid
where_field = username
hosts = localhost
HellFire# ee virtual_gid_maps.cnf
user=postfix
password = PasswordPostfix
dbname = postfix
table = mailbox
select_field = gid
where_field = username
hosts = localhost
HellFire# ee transport_maps.cnf
user = postfix
password = PasswordPostfix
dbname = postfix
table = domain
select_field = transport
where_field = domain
hosts = localhost
HellFire# ee virtual_mailbox_limit_maps.cnf
user = postfix
password = PasswordPostfix
dbname = postfix
table = mailbox
select_field = quota
where_field = username
hosts = localhost
Como se puede ver la configuración de estos archivos es muy similar y podemos ver claramente sobre que informacion tomara nuestro postfix de cada
uno de ellos sino fijarse en la opcion select_field. Ahora editaremos el archivo main.cf y verificamos tener la siguiente configuración.
HellFire# ee /usr/local/etc/postfix/main.cf
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
mail_owner = postfix
default_privs = nobody
default_transport = smtp
alias_maps = hash:/usr/local/etc/postfix/aliases
alias_database = hash:/usr/local/etc/postfix/aliases
readme_directory = no
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
setgid_group = maildrop
manpage_directory = /usr/local/man
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
smtpd_banner = $myhostname ESMTP "Version no disponible"
disable_vrfy_command = yes
myhostname=HellFire.BSD.org.pe
mydomain=hellfire.no-ip.org
myorigin= $mydomain
mydestination= $mydomain, $transport_maps
# cambiar mysql por pgsql segun la base de datos que utilicemos en virtual_alias_maps, virtual_mailbox_maps,
virtual_uid_maps, virtual_gid_maps, transport_maps.
virtual_alias_maps = mysql:/usr/local/etc/postfix/cnf/virtual_alias_maps.cnf
virtual_mailbox_base = /home/postfix
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/cnf/virtual_mailbox_maps.cnf
virtual_uid_maps = mysql:/usr/local/etc/postfix/cnf/virtual_uid_maps.cnf
virtual_gid_maps = mysql:/usr/local/etc/postfix/cnf/virtual_gid_maps.cnf
transport_maps = mysql:/usr/local/etc/postfix/cnf/transport_maps.cnf
local_transport = virtual
local_recipient_maps = $virtual_mailbox_maps
# cambiar mysql por pgsql segun la base de datos que utilicemos virtual_mailbox_limit_maps
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_maps= mysql:/usr/local/etc/postfix/cnf/virtual_mailbox_limit_maps.cnf
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_mailbox_limit = 100000000
virtual_maildir_limit_message = Mensaje a sobrepasado la quota de disco de esta cuenta
virtual_overquota_bounce = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Guardamos los cambios e iniciamos el demonio de postix
HellFire# postfix start
Verificamos que este esperando por peticiones con el comando sockstat fijarse en el demonio master
HellFire# sockstat -4
USER
COMMAND
PID
root
master
4864
FD PROTO
11 tcp4
LOCAL ADDRESS
*:25
FOREIGN ADDRESS
*:*
Configurando postfixadmin
Por defecto la instalación de postfixadmin instala la carpeta de los scripts de php en /usr/local/www/ , podemos crear un alias o un enlace de esta
carpeta al DirectoryRoot de Apache por defecto /usr/local/www/data/
HellFire# ln -s /usr/local/www/postfixadmin /usr/local/www/data/postfixadmin
Modificamos el archivo de configuracion de postfixadmin /usr/local/www/postfixadmin/config.inc.php y verificamos la configuración
/* Definimos el idioma de la interfaz */
$CONF['default_language'] = 'es';
/* Informacion para la conexion con MySQL o PostgreSQL cambiar mysql por pgsql segun la db que usemos */
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'PasswordPostfixadmin';
$CONF['database_name'] = 'postfix';
/* Correo del administrador */
$CONF['admin_email'] = '[email protected]';
/* hostname y puerto del servidor smtp */
$CONF['smtp_server'] = "localhost";
$CONF['smtp_port'] = "25";
/* Metodo de cifrado usado para las contraseñas
$CONF['encrypt'] = 'md5crypt';
*/
/* Deshabilitamos que postfixadmin autogenere las contraseñas cuando creamos cuentas */
$CONF['generate_password'] = 'NO';
/* Resultado por paginas que nos mostrara
$CONF['page_size'] = '10';
*/
/* Al setear domain_path a YES tomara la estructura /home/postfix/dominio.com/usuario
domain_in_mailbox debe estar en NO */
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
/* Se asigan el tamaño en megabytes de el tamaño maximo asignadas para las cuentas */
$CONF['aliases'] = '10';
$CONF['mailboxes'] = '10';
$CONF['maxquota'] = '10';
/* Habilita quotas en postfixadmin */
$CONF['quota'] = 'YES';
$CONF['quota_multiplier'] = '102400';
/* Deshabilitamos el servicio de vacation ya que no lo tenemos instalado */
$CONF['vacation'] = 'NO';
/* Deshabilitamos crear un alias por cada cuenta que creamos */
$CONF['alias_control'] = 'NO';
/* Habilitamos que registre las acciones realizadas en el postfixadmin */
$CONF['logging'] = 'YES';
/* Habilitamos mostrar una cabecera y logo */
$CONF['logo'] = 'YES';
$CONF['header_text'] = ':: Welcome to Postfix Admin ::';
/* Habilitamos el pie de pagina del entorno */
$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Regresar a postfixadmin';
$CONF['footer_link'] = 'http://hellfire.no-ip.org/postfixadmin/';
Para finalizar debemos asegurarnos que se tenga un control de acceso con apache a la carpeta admin de nuestro postfixadmin veremos que contamos
con dos archivos .htpasswd y .htaccess nos centraremos en .htpasswd que por defecto contiene al usuario admin con la contraseña cifrada admin. Borraremos
el contenido de .htpasswd y crearemos un nuevo usuario con su respectiva contraseña.
htpasswd /usr/local/www/data/postfixadmin/admin/.htpasswd postfixadmin
New password:
Re-type new password:
Adding password for user postfixadmin
Ahora agregamos unas lineas al final de nuestro archivo /usr/local/etc/apache/httpd.conf para que verifique la existencia de estos archivos al acceder al
directorio admin.
<Directory "/usr/local/www/data/postfixadmin">
Options Indexes
AllowOverride AuthConfig
</Directory>
Reiniciamos nuestro apache para que tome el cambio realizado, solo queda comentar que nuestro postfixadmin cuenta con tres carpetas que nos llevara a
diferentes paneles de administración.
http://nuestro.dominio.o.ip/postfixadmin/ - Acceso administracion segun usuario y dominio asignado
http://nuestro.dominio.o.ip/postfixadmin/admin - Acceso administracion total de postfixadmin
http://nuestro.dominio.o.ip/postfixadmin/users - Cambiar contraseña de correo
Llegado a este punto ya tenemos nuestro servidor de correo en linea, a la fecha la mayoria de paquetes instalados en este documento soportan ser iniciados
en el arranque de nuestro FreeBSD utilizando rc.conf, editamos nuestro /etc/rc.conf y agregamos.
mysql_enable="YES"
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
courier_authdaemond_enable="YES"
courier_imap_imapd_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_ssl_enable="YES"
courier_imap_pop3d_ssl_enable="YES"
apache_enable="YES"
apache_flags="-DSSL"
apache_pidfile="/var/run/httpd.pid"
Para comprobar el correcto funcionamiento de nuestro servidor podemos crear utilizando nuestro postfixadmin utilzando la url
http://tudominio_o_ip/postfixadmin/admin/ , un dominio, y una cuenta respectiva para el dominio creado, una vez creado ambos podemos probar
configurando un cliente de correo, o haciendo telnet a los respectivos puertos de los servicios imap(143), pop3(110), master(25) pueden buscar en google
informacion sobre los comandos a utilizar para cada servicio utilizando telnet, no olviden si quieren hacer una prueba localmente tener el host o dominio que
esten usando en el archivo /etc/hosts
FINALES
Espero que sea de utilidad este documento donde trate de mostrar una configuracion basica para levantar un servicio de correo con postfix, realmente se
puede entrar a pulir mucho el documento pero hubiera salido mas largo de lo que ya esta, ademas eso ya queda de tarea para ustedes ;), no entre en detalle
de la configuración de PHP ya que al instalarlo junto con apache nos pondran una configuracion por defecto que sirve para nuestro proposito. Cualquier
duda, comentario, sugerencia puden hacerlo llegar en la misma pagina, en el canal de #eldemonio en freenode o a mi correo. Algo mas para tener preente el
soporte de pgsql para postfixadmin esta disponible en la ultima version 2.1.0.
Gracias a Oliver Torres Delgado, Albert Rodriguez por las observaciones al documento y a DarNightRider que con su problema configurando
postfix+postgresql motivo para complementar el documento.
Descargar