Herramientas de usuario

Herramientas del sitio


doc:freebsd:servicios005

Servidor de Correo con Postfix en FreeBSD

Autor: acardenas

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 cyrrus-sasl2 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 'PasswordPostfixadmin' por las que gusten
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', 'postfix', 'postfixadmin', 'Y', 'Y', 'Y', 'Y');
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 defecto el virtual al campo transport 
#
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 del dominio especificado
#
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 valores 125 (postfix)  y 6 (nobody) a los campos uid y gid, tambien especificamos el campo home para indicar la ruta base dode estaran los mailbox .
#
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 para evitar un error de postfixadim tambien podemos obtar por modificar el postfixadmin
#
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                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          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 defecto el virtual al campo transport 
--
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 del dominio especificado
--
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 valores 125 (postfix)  y 6 (nobody) a los campos uid y gid, tambien especificamos el campo home para indicar la ruta base dode estaran los mailbox .
--
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 para evitar un error de postfixadim tambien podemos obtar por modificar el postfixadmin
--
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,postfix;

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
emailAddress=acardenas@bsd-peru.org

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
emailAddress=acardenas@bsd-peru.org

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 cuentas de correo
MYSQL_UID_FIELD         uid
# Campo de la tabla mailbox que contiene la informacion de que grupo del sistema manejara los mailbox de las cuentas de correo
MYSQL_GID_FIELD         gid
# Campo de la tabla mailbox que contiene el nombre del usuario de una cuenta de la forma usuario@dominio.com
MYSQL_LOGIN_FIELD       username
# Campo de la tabla mailbox que indica la ruta base donde se guardaran los mailbox de las cuentas en nuestro caso /home/postfix
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 de la cuenta del usuario
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 cuentas de correo
PGSQL_UID_FIELD         uid
# Campo de la tabla mailbox que contiene la informacion de que grupo del sistema manejara los mailbox de las cuentas de correo
PGSQL_GID_FIELD         gid
# Campo de la tabla mailbox que contiene el nombre del usuario de una cuenta de la forma usuario@dominio.com
PGSQL_LOGIN_FIELD       username
# Campo de la tabla mailbox que indica la ruta base donde se guardaran los mailbox de las cuentas en nuestro caso /home/postfix
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 de la cuenta del usuario
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  LOCAL ADDRESS         FOREIGN ADDRESS      
root     couriertcp 18489 6  tcp4   *:110                 *:*
root     couriertcp 18473 6  tcp4   *:143                 *:*

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  LOCAL ADDRESS         FOREIGN ADDRESS      
root     couriertcp 18514 6  tcp4   *:993                 *:*
root     couriertcp 18501 6  tcp4   *:995                 *:*

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 = ye
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
# soporte para sasl2
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
# algunas restricciones para el servidor
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   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
root     master     4864  11 tcp4   *:25                  *:*

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'] = 'postmaster@hellfire.no-ip.org';
/* 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.

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 y Albert Rodriguez, por las observaciones al documento, y a DarNightRider que con sus problema configurando postfix+postgresql motivo a complementar este documento.

doc/freebsd/servicios005.txt · Última modificación: 2022/03/02 08:18 (editor externo)