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.