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.
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.
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
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
Instalamos courier-imap con soporte para quotas
HellFire# cd /usr/ports/mail/courier-imap HellFire# make WITH_TRASHQUOTA=yes install clean clean-depends
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
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
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
HellFire# cd /usr/ports/security/cyrrus-sasl2 HellFire# make WITH_MYSQL=yes install clean clean-depends
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
HellFire# cd /usr/ports/security/cyrrus-sasl2 HellFire# make WITH_PGSQL=yes install clean clean-depends
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
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).
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
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
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 *:*
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 *:*
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
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.