1. Introduccion Esta guia provee las instrucciones de como configurar una solucion de corre integral usando Postfix, OpenLDAP, Courier, y phamm. Tambien se muestran algunas deciciones sobre el diseño que se tomo para configurar esto despues de un par de semanas de investigacion. Esta guia pretende documentar todo lo mas claro posible y que sea facil de entender, claro que para esto se require conocimientos basicos de Unix, conocimientos basicos de TCP/IP y sobre los servicios de correo electronico. La finalidad de el documento es ayudar a los administradores a configuracion una solucion donde se manejen dominios virtuales via web, se agreguen y eliminen cuentas de correo, alias, manejo de quotas de los buzones todo via web, al final esto sera facil de administrar con tan solo llenar las formas para agregar dominios y cuentas. 2. Requerimientos. Esta no es una lista de requerimientos del sistema, mas bien es la lista de lo que se requiere de una solucion de correo electronico, y lo que se obtendra con esta implementacion. * Soporte para envio a usaurios locales, usaurios que tienen una cuenta con shell. * usuarios locales seran capaces de usar procmail o maildrop ********* * Soporte de quotas de loz buzones de correo. * Soporte de redireccion de correo (forwarding). * Facil de integrar con sistemas de correo ya existentes. * Acceso a los correos via IMAP y POP3******* * Sporte de cuentas virtuales IMAP, por ejemplo. usuarios que tienen un login IMAP y password, pero no tienen cuenta con shell. * Acceso a a travez de directorios maildir para usuarios el sitema de archivos local a usuarios con shell. * Una interface para leer el correo via web. * La hablidad para hosperar multiples dominios en un solo servidor con una sola direccion IP. * Soporte para comunicacion cifrada de manera que las contraseñas nunca viajaran como texto plano sobre la red. 3. Arquitectura del sistema. Esta seccion describe como fueron usados los servidores y como se integran integran todos para la solucion. 3.1. Seleccion de el Software. El porque se llego a la desicion de escoger el softeare no se explicara, solo basta decir que depues de varias semanas de estar probando con varios, y con la experiencia de los años se llego a elegir el softare que acontinuacion de describira, cabe destacar que la solucion sera sobre LDAP y todo este software tiene completo soporte para usar LDAP. 3.1.1. Postfix TODO: Meter choro sobre postfix facil virtual users, facil integgracion con ldap, soporte a aplicaciones que usen el coamdno sendmail. bla bla bla. facil de configurar. 3.1.2. Courier-IMAP. facil virtual users, facil integgracion con ldap, uso demonio de autenticacion global para sus diverssos programas.. bla bla bla. facil de configurar. 3.1.3. OpenLDAP Bla bla bla, facil configurar, gran soporte en el software libre, varios metodo autenticacion, soprote ldap sobre ssl. 3.1.4. Phamm Se eligio phamm por facil, de usar, y buenos ejemplos para integrarlo con postfix. 3.1.5. SquirelMail Se elegio squirelmail por facil uso y configuracion. y soporte varios plugins. 3.2. The Big Picture La figura 1 mustra como Postfix, Courier, maildrop, OpenLDAP y phamm interactuan uno con otro. Postfix acepta correo entrante lo procesa en sus colas y lo entraga a maildrop (MDA) quien consultara el servidor LDAP por la existencia de las cuentas y si estan activas y buscara el directorio en el sistema de archivos donde guardara el mensaje (tambien puede hacer algun tipo de filtrado). Courier provee acceso remoto a los buzones maildir via los protocolos IMAP y POP3. necesita tener una lista de usuarios validos y alguna manera de autenticarlos de manera que los usaarios puedan iniciar sesion con su cuenta. Tambien necesita saber donde esta localizado el buzon de la cuenta en el sistema de archivos para que pueda leer los mensajes. La informacion de los usuarios es accesada de la base de datos estandar en unix. (/etc/passwd) este sistema usar PAM como modulos de autenticacion para los servicios SMTP, POP3 e IMAP, los cuales a su vez se autentican contra el servidor LDAP. la informacion de los usuarios virutales es almacenada en el directorio LDAP puesto que LDAP provee mecanismos para buscar usuarios validos, obtener informacion de los usuarios y autenticar usuarios. Esta es la informacion que usa postfix, courier, y maildrop, Phamm es la interfaz web, la cual guarda informacion en dicha base de datos en el directorio LDAP usando la API de LDAP. FIGURA 1. 3.3. Localizacion de los buzones de correo. La localizacion de los buzones de los usuarios locales se manajara dentro de el directorio $HOME de un usuario Unix llamado "vmail" Postfix y Courier tiene soporte para buscar la inforamcion de los suaurios virutal es en el directorio LDAP, Cada dominio virtual tiene un subdirectorio dentro del directorio /home/vmail/domains/. Por ejemplo, si hay un usuario , el correo seria almacenado en /home/vmail/domains/calcom.com.mx/jmedina/Maildir/ en formato Maildor. 4. Implementacion Esta seccion describe como implementar la solucion de correo virutal. No toodos los detalles con cubiertos, solo lo que es necesario, para mas infomacion ver al final del documento las referencias. 4.1. Prerequisitos Esta es la lista de software, con sus numeros de version, con la que se configuro este sistema: Software * Gento Linux 2005.1-r1 * Postfix 2.2.5 * OpenLDAP 2.2.28-r3 * courier-authlib 0.57-r2 * Courier-IMAP 4.0.1 * Maildrop maildrop-1.8.0-r3 * Phamm 0.4.7 4.2. Preparando el sistema Unix (Gentoo GNU/Linux) Se creara un usuario y grupo llamado vmail con su directorio $HOME en /home/vmail/ que es donde se almacenaran los buzones de los usuarios. Este usuario y grupo tendran el mismo UID y GID 5000 se uso un numero alto para no interferir con las cuentas locales. # groupadd -g 5000 vmail # useradd -g 5000 -u 5000 -m -d /home/vmail vmail # chmod 2775 /home/vmail Crear directorio donde estaran almacenados los correos de los dominios: # su - vmail $ mkdir domains Crear directorio para el dominio principal: $ mkdir -p /home/vmail/calcom.com.mx 4.3. OpenLDAP Con las USE flags que se definieron en el archivo /etc/make.conf por default se tiene soporte para LDAP, por lo que desde la instalacion ya se instalo OpenLDAP. 4.3.1. Configurando el servidor LDAP (slapd) En el archivo /etc/conf.d/slapd descomentar la linea: # vim /etc/conf.d/slapd OPTS="-h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'" :wq # vim /etc/openldap/slapd.conf ####################################################################### # Schemas ####################################################################### include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/phamm.schema include /etc/openldap/schema/ISPEnv2.schema include /etc/openldap/schema/amavis.schema include /etc/openldap/schema/dnsdomain2.schema include /etc/openldap/schema/pureftpd.schema ####################################################################### # ACL's ####################################################################### include /etc/openldap/phamm-mod.acl schemacheck on allow bind_v2 pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args ####################################################################### # Logging Options (disable when everything is working fine) ####################################################################### loglevel 256 ####################################################################### # LDBM database definitions ####################################################################### database ldbm directory "/var/lib/openldap-directory" lastmod on suffix "dc=calcom,dc=com,dc=mx" rootdn "cn=manager,dc=calcom,dc=com,dc=mx" password-hash {md5} ###password-crypt-salt-format "$1$%.8$" rootpw {MD5}JfnnlDI7RTiF9RgfG2JNCw== # Index specific for mail index objectClass eq index cn,mail eq,subinitial index vd,delete eq,pres index accountActive,forwardActive eq,pres index smtpAuth eq,pres index associatedDomain pres,eq,sub index aAAARecord pres,eq index aRecord pres,eq index sn,uid,displayName pres,eq,sub index uidNumber,gidNumber eq index default sub ####################################################################### # Other Options ####################################################################### ###idletimeout 120 :wq 4.3.1.1. Agregando los schemas Como vimos se agregaron varios schemas, los schemas son los archivos donde se definien los tipos de atributos que se usaran para los datos almacenados en el directorio. Estos schemas se obtubieron de las fuentes de phamm, bajarlas, por ejemplo: # cd # wget http://open.rhx.it/phamm/phamm-0.4.7.tar.gz # tar -zxvf phamm-0.4.7.tar.gz # cd phamm-0.4.7 # cd schema/ # cp -v ISPEnv2.schema amavis.schema phamm.schema pureftpd.schema samba.schema /etc/openldap/schema/ 4.3.1.2 Agregando la definicion de la base de datos Agregaremos las definiciones de la base de datos que usaremos, lo configuraremos asi: ####################################################################### # LDBM database definitions ####################################################################### database ldbm directory "/var/lib/openldap-directory" lastmod on suffix "dc=calcom,dc=com,dc=mx" rootdn "cn=manager,dc=calcom,dc=com,dc=mx" El tipo de base de datos que elegimos es ldbm, el directorio donde se guardaran los archivos de la base de datos sera: "/var/lib/openldap-directory", hay que notar que este directorio no existe, por lo que hay que crearlo y que dicho directorio tenga privilegios solo para el usuario y grupo ldap que es con el que corre el servicio slapd. # mkdir /var/lib/openldap-directory # chown ldap:ldap /var/lib/openldap-directory # chmod 700 /var/lib/openldap-directory El sufijo es la base de nuestro directorio LDAP, en este caso lo usaremos "dc=calcom,dc=com,dc=mx", el rootdn es es el usuario privilegioado de el directorio "cn=manager,dc=calcom,dc=com,dc=mx", es como root en un sistema Unix. 4.3.1.3 Creando el usuario manager El valor de rootpw, es obtenido con la herramienta slappasswd, el cual se pondra un formato hash con el algoritmo md5, de esta manera no sera almacenado en texto plano: # slappasswd -h {md5} New password: Re-enter new password: {MD5}JfnnlDI7RTiF9RgfG2JNCw== Toma la salida de este comando y pegalo en en el archivo /etc/openldap/slapd.conf en el valor de rootpw, por ejemplo: rootpw {MD5}JfnnlDI7RTiF9RgfG2JNCw== 4.3.1.4 Definiendo indices Para agilizar las busquedas, debes de crear indices para los atributos comunmente buscados, En OpenLDAP, no solo puedes elejir que atributox indexar, si no que tambien puedes elejir que tipo de busquedas indexar, por ejemplo, si indexas el campo "mail", tienes la opcion de crear indices para busquedas de "precense (press), equiality (eq), approximate, y/o substrings (sub)". Asi crearemos la siguiente politica para los indices: # Index specific for mail index objectClass eq index cn,mail eq,subinitial index vd,delete eq,pres index accountActive,forwardActive eq,pres index smtpAuth eq,pres index associatedDomain pres,eq,sub index aAAARecord pres,eq index aRecord pres,eq index sn,uid,displayName pres,eq,sub index uidNumber,gidNumber eq index default sub 4.3.1.5 Configurando la listas de control de acceso (ACL) El ultmo paso en la configuracion de el archivo /etc/openldap/slapd.conf es el control de accesos, Puedes definir tu propia politica, pero aqui se usa una que se adopte a el uso de Phamm. Copiar el archivo phamm.acl de el directorio examples de las fuentes de phamm a /etc/openldap/ # cp examples/phamm.acl /etc/openldap/phamm-mod.acl Este archivo define las siguientes politicas: Las cuentas pueden editar su contraseña, nivel de spam, forward, vacation, y su nombre. El postmaster con editAccounts=FALSE hace lo mismo para su dominio. El postmaster con editAccounts=TRUE puede agregar cuentas/alias y tambien editar amavisBypassVirusChecks, quota and smtpAuth vadmin puede hacer lo mismo que postmaster con editAccounts=TRUE para algunos dominios. Ya que el archivo recien copiado es de ejemplo y ahi usa como suffix a "dc=example,dc=tld" y el nuestro es "dc=calcom,dc=com,dc=mx" entonces ejecutaresmo un comando para remplazar esas cadenas, lo podemos hacer de manera segura con el siguiente comando: # sed -e "s:dc=example,dc=tld:dc=calcom,dc=com,dc=mx:" -i phamm-mod.acl 4.3.2 Creando el arbol del directorio Ahora que "slapd" esta configurado, es tiempo de empezar a agregar datos a nuestor directorio LDAP. usaremos los scripts de arranque provistos por Gentoo GNU/Linux. Antes que nada ejecutar lo siguiente: Ejecutar el comando "slaptest" para hacer una revision de la sintaxis en el archivo de configuracion /etc/openldap/slapd.conf # slaptest config file testing succeeded Si regresa algun error revisar la configuracion. Ahora es tiempo de ejecutar el servidor LDAP asi: # /etc/init.d/slapd start * Starting ldap-server ... [ ok ] Confirmar que el servicio esta corriendo: # netstat -plutn | grep slapd tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 15939/slapd tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN 15939/slapd Hacer consulta basica: # ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts # extended LDIF # # LDAPv3 # base <> with scope base # filter: (objectclass=*) # requesting: namingContexts # # dn: namingContexts: dc=calcom,dc=com,dc=mx # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1 Si sale algo asi significa que el servidor esta corriendo. Si quieres que el servidor slapd arranque al inicio del sistema, ejecutar el comando: # rc-update add slapd default * slapd added to runlevel default * rc-update complete. 4.3.2.1 Creando el directorio base NOTA: Cuando se edien los archivos ldif, asegurarse de que no haya espacios en blanco al final de la linea, siempre debe de haber una nueva linea, si no es asi puede causar problemas al agregarlos. El primer paso para crear la estructura base del directorio es crear el nodo raiz. Copiar el archivo sample-main.ldif de el directorio examples de las fuentes de Phamm: # cp sample-main.ldif /etc/openldap/Calcom-main.ldif Cambiar los datos de ejemplo de el suffix por los reales: $ sed -e "s:dc=example,dc=tld:dc=calcom,dc=com,dc=mx:" -i Calcom-main.ldif $ cat Calcom-main.ldif dn:dc=calcom,dc=com,dc=mx objectClass: top objectClass: domain dc: example dn:cn=manager,dc=calcom,dc=com,dc=mx objectClass: top objectClass: organizationalRole cn: manager Agregarlo al directorio con el comando ldapadd y usando a manager en este caso se usara como contraseña la que creamos para el rootpw al inicio de el documento. # ldapadd -v -x -D "cn=manager,dc=calcom,dc=com,dc=mx" -W -h localhost -f Calcom-main.ldif ldap_initialize( ldap://localhost ) Enter LDAP Password: ... ... modify complete Se agrego la base del directorio el cual esta organizado de esta manera: dc=calcom,dc=com,dc=mx <==== Raiz del directorio cn=manager <==== Administrador del directorio Copiar el archivo sample-mail.ldif de el directorio examples de las fuentes de phamm: # cp sample-mail.ldif /etc/openldap/Calcom-mail.ldif Sustituir el suffix: # sed -e "s:dc=example,dc=tld:dc=calcom,dc=com,dc=mx:" -i Calcom-mail.ldif Sustituir los nombres de dominio: # sed -e "s:example.tld:calcom.com.mx:" -i Calcom-mail.ldif Sustituir los nombres de las cuentas de correo: # sed -e "s:john.doe:jmedina:" -i Calcom-mail.ldif # sed -e "s:john.smith:testmail:" -i Calcom-mail.ldif En el archivo tambien se enceuntran definidas las rutas relativas a /home/vmail/domains de los buzones de las cuentas de correo: por ejemplo despues de las modificaciones anteriores se encuentra asi: mailbox: calcom.com.mx/jmedina/ mailbox: calcom.com.mx/testmail/ En nuestro caso usaremos la ruta asi: mailbox: calcom.com.mx/jmedina/Maildir/ Edita el archivo y cambia la ruta manualmente o haz esto: # sed -e "s:jmedina/:jmedina/Maildir/:" -i Calcom-mail.ldif y # sed -e "s:testmail/:testmail/Maildir/:" -i Calcom-mail.ldif Lo siguiente es crear los hash de las contraseñas de los siguientes usuarios y administradores: Uno para user phamm: # slappasswd -h {md5} New password: Re-enter new password: {MD5}br52yftBG+l7Ow1It5GnyQ== Entonces en el archivo Calcom-mail.ldif tenemos una seccion mas o menos asi: dn:cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx objectClass: top objectClass: organizationalRole objectClass: simpleSecurityObject cn: phamm userPassword: {SSHA}zCfpI3LEnzO0ZWJo8VeHes6TicnPJuME Sustituiremos el valor de userPassword: {SSHA}zCfpI3LEnzO0ZWJo8VeHes6TicnPJuME por: userPassword: {MD5}br52yftBG+l7Ow1It5GnyQ== Ahora para el user matrix: # slappasswd -h {md5} New password: Re-enter new password: {MD5}muK+c7WLVlvOPkdJOlbiag== Y tenemos la seccion: dn:cn=matrix,ou=admin,dc=calcom,dc=com,dc=mx objectClass: top objectClass: VirtualAdmin mail: matrix@notcalcom.com.mx maxDomain: 10 accountActive: TRUE lastChange: 1066742030 vd: calcom.com.mx vd: newcalcom.com.mx editAccounts: TRUE userPassword: {SSHA}zCfpI3LEnzO0ZWJo8VeHes6TicnPJuME sn: matrix cn: matrix cambiaremos: userPassword: {SSHA}zCfpI3LEnzO0ZWJo8VeHes6TicnPJuME por: userPassword: {MD5}muK+c7WLVlvOPkdJOlbiag== Ahora para el postmaster # slappasswd -h {md5} New password: Re-enter new password: {MD5}tk8ad7GzF9NH9ct5MyyG0g== Y tenemos la seccion: dn:cn=postmaster,vd=calcom.com.mx,o=hosting,dc=calcom,dc=com,dc=mx objectClass: top objectClass: VirtualMailAlias mail: postmaster@calcom.com.mx lastChange: 1066742031 maildrop: postmaster accountActive: TRUE cn: postmaster sn: postmaster userPassword: {SSHA}G7vRIKNRvDQg0T0qarcMgbYaQ+iOLEgq editAccounts: FALSE cambiaremos: userPassword: {SSHA}G7vRIKNRvDQg0T0qarcMgbYaQ+iOLEgq por: userPassword: {MD5}tk8ad7GzF9NH9ct5MyyG0g== Tambien se debera cambiar el valor de userPassword para las cuentas de correo: Crear las contraseñas tambien con: # slappasswd -h {md5} Y cambiarlos en las secciones de: dn:mail=jmedina@calcom.com.mx,vd=example.tld,o=hosting,dc=calcom,dc=com,dc=mx y dn:mail=testmail@calcom.com.mx,vd=example.tld,o=hosting,dc=calcom,dc=com,dc=mx Ahora si a agregar las entradas al directorio: Agregarlo al directorio con el comando ldapadd y usando a manager en este caso se usara como contraseña la que creamos para el rootpw al inicio de el documento. # ldapadd -v -x -D "cn=manager,dc=calcom,dc=com,dc=mx" -W -h localhost -f Calcom-mail.ldif ldap_initialize( ldap://localhost ) Enter LDAP Password: ... ... modify complete Se agrego la base del directorio el cual esta organizado de esta manera: dc=calcom,dc=com,dc=mx <==== Raiz del directorio cn=manager <==== Administrador del directorio <<<<<<<<<<<<<<<<< SE AGREGO A PARTIR DE AQUI >>>>>>>>>>>>>>>>>>>>>> o=hosting <==== Organizacional de loos dominios virtuales cn=pahmm <==== Administrador de los dominios virtuales vd=calcom.com.mx <==== Dominio virtual cn=postmaster <==== Administrador dominio virtual mail=abuse@calcom.com.mx (alias to postmaster) <==== Alias de postmaster maildrop= postmaster <==== Atributo de alias mail=jmedina@calcom.com.mx <==== Cuenta de correo vdHome= /home/vmail/domains <==== Ruta Base de almacenamiento de correos. mailbox=calcom.com.mx/jmedina/Maildir/ <==== ruta absoluta de el buzon de correo mail=testmail@calcom.com.mx <==== Cuenta de correo vdHome= /home/vmail/domains <==== Ruta Base de almacenamiento de correos. mailbox=calcom.com.mx/testmail/Maildir/ <==== ruta absoluta de el buzon de correo 4.4. Postfix La configuracion de postfix se enceuntra en el archivo de configuacion /etc/postfix/mail.cf Si esta instalado ssmtp este bloqueara a postfix, entonces hay que desinstalarlo: # emerge --pretend postfix [blocks B ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.5) # emerge unmerge ssmtp # emerge --pretend postfix These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild N ] sys-libs/db-4.2.52_p2-r1 [ebuild N ] dev-libs/libpcre-6.3 [ebuild N ] mail-mta/postfix-2.2.5 Ahora si isntalar postix y solo agregar soporte para sasl. # USE="sasl -postgres -mysql -ipv6" emerge postfix Configurar parametros basicos de Postfix, por ahora sin soporte para ldap: # vim /etc/postfix/main.cf # Configurar el hostname myhostname = mail.calcom.com.mx # Configurar el nombre del dominio principal: mydomain = mail.calcom.com.mx # Configurar el nombre de el dominio con el que salen los correos myorigin = $mydomain # Configurar las interfaces de red en la que escuchara peticiones inet_interfaces = all # Desactivar el uso de el comando SMTP Vrfy disable_vrfy_command = yes # Dominios en los cuales recibe correo: mydestination = localhost, $myhostname, localhost.$mydomain, $mydomain # donde estan almacenados los nombres de los usuarios: local_recipient_maps = unix:passwd.byname $alias_maps # A que redes se les permite hacer relay por este servidor: mynetworks = 10.0.0.0/24, 127.0.0.0/8 # A que dominios se les permite hacer relay relay_domains = $mydestination < DUDA!!!!!!!!! # lugar donde estan almacenados los alias de los correos alias_maps = hash:/etc/postfix/aliases # alias_database = hash:/etc/postfix/aliases # Opcional poner un banner para las conexiones SMTP smtpd_banner = $myhostname ESMTP $mail_name (Gentoo GNU/Linux) # Localizacion de los buzones home_mailbox = Maildir/ # Comentario ??? delay_warning_time = 3h # limite en tamaño de un mensaje aprox 15MB message_size_limit = 15000000 # tiempo maximo que puede estar un correo en una cola 8 horas. maximal_queue_lifetime = 8h $ Tiempo limite en el que este un correo y mandar un rebote. bounce_queue_lifetime = 4h :wq 4.4.2.1. Maildrop Instalaremos y configuraremos courier maildrop, este sera usado como MDA (Mail Delivery Agent) el cual es el encargado de llevar el correo a su localizacion final, puede hacer filtrado antes de entregar el correo y ademas maneja quotas de los buzones de correo (Maildir). # emerge =mail-filter/maildrop-1.8.0-r3 # vim /etc/maildrop/maildropldap.cf hostname localhost basedn o=hosting,dc=calcom,dc=com,dc=mx filter (&(&(objectclass=VirtualMailAccount)(mail=%s))(accountActive=TRUE)(delete=FALSE)) binddn cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx bindpw PASSWORD_PHAMM timeout 5 search_method mail default_uidnumber 5000 default_gidnumber 5000 mail_attr mail maildir_attr mailbox homedirectory_attr vdHome quota_attr quota :wq Editar mensaje de alerta de sobre quota. # vim /etc/quotawarnmsg X-Comment: Rename/Copy this file to quotawarnmsg, and make appropriate changes X-Comment: See deliverquota man page for more information From: Mail Delivery System Reply-To: postmaster@calcom.com.mx To: Valued Customer:; Subject: Mail quota warning Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Your mailbox on the server is now more than 90% full. So that you can continue to receive mail you need to remove some messages from your mailbox. :wq Configurar el uso de maildrop en postfix, primero en el archivo /etc/postfix/master.cf master es el proceso principal (maestro) de postfix. # vim /etc/postfix/master.cf maildrop unix - n n - - pipe flags=DRhu user=vmail argv=/usr/bin/maildrop -w 90 -d ${recipient} :wq Configurar parametros en /etc/postfix/main.cf maildrop_destination_concurrency_limit = 1 maildrop_destination_recipient_limit = 1 virtual_destination_concurrency_limit = 1 unknown_maildrop_mailbox_reject_code = 450 4.4.2.2. Configurando las fuentes LDAP Se pueden definir facilmente multiples fuentes LDAP. Los parametros de las fuentes LDAP estan documentados en el archivo README_FILES/LDAP_README[15]. Los nombres de los parametros siguen el patron de "ldapsource_parameter". El nombre nombre de la fuente LDAP es definido la primer vez que es usado. En el archivo /etc/postfix/main.cf, necesitaras una definicion de una fuente LDA para cada busqueda. 4.4.2.2.1. Globales En nuestro directorio se creo el usuario phamm el cual se usara para hacer los lookups en el directorio LDAP y no usar la cuenta manager, la cual tiene privilegios mas elevados. ldap_bind_dn = cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx ldap_bind_pw = PASSWORD_PHAMM ldap_search_base = o=hosting,dc=calcom,dc=com,dc=mx ldap_domain = dc=calcom,dc=com,dc=mx ldap_server_host = localhost ldap_server_port = 389 Los parametros que usamos son: ldap_bind_dn: El usuario que hace el la busqueda de la inforamacion en el directorio LDAP. ldap_bind_pw: La contraseña de el usuario phamm. ldap_search_base: Esta es la rama en la cual iniciaremos la busqueda en el directorio LDAP, esto es usado para agilizar la busqueda y no iniciar desde la raiz, ldap_domain: el suffijo de el dominio en el que buscaremos. ldap_server_host: La direccion IP o nombre DNS de el servidor al cual consultaremos. ldap_server_port: El puerto en el que recibe peticiones el servidor LDAP. 4.4.2.2.2. Transports La primer definicion de la fuente LDAP que usaremos es la de transport, la cual define el transporte para los dominios. Postfix usa el transporte para determinar que sigue hacer con los correos una vez recibidos. Para nuestro proposito siempre utilizaremos el MDA maildrop por las razones que se especificaron anteriormente. Sin embargo tambien podria ser usado el transporte "virtual". # Transports transport_server_host = $ldap_server_host transport_search_base = $ldap_search_base transport_query_filter = (&(&(vd=%s)(objectClass=VirtualDomain))(accountActive=TRUE)(delete=FALSE)) transport_result_attribute = postfixTransport transport_cache = no transport_bind = yes transport_scope = one transport_bind_dn = $ldap_bind_dn transport_bind_pw = $ldap_bind_pw En este caso se usa el filtro para buscar el nombre de el dominio, ver que este activo y que no tenga el valode delete a FALSE. el resultado que buscaremos es postfixTransport, que sera configurado para que siempre tenga el valor de maildrop. 4.4.2.2.3. Aliases # Aliases aliases_server_host = $ldap_server_host aliases_search_base = $ldap_search_base aliases_query_filter = (&(&(objectClass=VirtualMailAlias)(mail=%s))(accountActive=TRUE)) aliases_result_attribute = maildrop aliases_bind = yes aliases_cache = no aliases_bind_dn = $ldap_bind_dn aliases_bind_pw = $ldap_bind_pw En este caso se usa el filtro para buscar el nombre de el correo, ver que este activo . el resultado que buscaremos es maildrop, el cual se usa como un directorio alternativo en el cual tambien una cuenta puede recibir correos. 4.4.2.2.4. Forwards # VirtualForward virtualforward_server_host = $ldap_server_host virtualforward_search_base = $ldap_search_base virtualforward_query_filter = (&(&(objectClass=VirtualMailAccount)(mail=%s))(forwardActive=TRUE)(accountActive=TRUE)(delete=FALSE)) virtualforward_result_attribute = maildrop virtualforward_bind = yes virtualforward_cache = no virtualforward_bind_dn = $ldap_bind_dn virtualforward_bind_pw = $ldap_bind_pw En este caso se usa el filtro para buscar el nombre de el correo, que tenga el valor de el atributo forwardAvtive a TRUE y que detele sea FALSE. el resultado que buscaremos es maildrop, el cual se usa para redireccion el correo que llegue a una cuenta por ejemplo a el correo en otro dominio o usar el de otra persona, util cuando si el usuario sale de vacaciones, asi se desea que alguien mas pueda recibir el corrreo. 4.4.2.2.5. Cuentas de correo. # The mail_spool_directory parameter specifies the directory whereccounts accounts_server_host = $ldap_server_host accounts_search_base = $ldap_search_base accounts_query_filter = (&(&(objectClass=VirtualMailAccount)(mail=%s))(forwardActive=FALSE)(accountActive=TRUE)(delete=FALSE)) accounts_result_attribute = mailbox accounts_cache = no accounts_bind = yes accounts_bind_dn = $ldap_bind_dn accounts_bind_pw = $ldap_bind_pw En este caso se usa el filtro para buscar el nombre de el correo, que tenga el valor de el atributo forwardAvtive a FALSE y que delete sea FALSE. el resultado que buscaremos es mailbox, el cual es la ruta en el sistema de archivos de el buzon de correo. estas este es la fuente LDAP mas usada porque es aqui donde reciden las cuentas de correo. Uno de los "side effects" de la naturaleza modular de Postfix es que una segunda fuente ldap para las cuentas es necesitada para ayudar a Postfix a determinar si una direccion de correo es valida antes de que postfix intente recibir el correo. Entonces se usa la fuente LDAP accountsmap la cual el atributo que se busca es la direccion de el correo electronico. accountsmap_server_host = $ldap_server_host accountsmap_search_base = $ldap_search_base accountsmap_query_filter = (&(&(objectClass=VirtualMailAccount)(mail=%s))(forwardActive=FALSE)(accountActive=TRUE)(delete=FALSE)) accountsmap_result_attribute = mail accountsmap_cache = no accountsmap_bind = yes accountsmap_bind_dn = $ldap_bind_dn accountsmap_bind_pw = $ldap_bind_pw 4.4.2.3. El mapa de transportes Ahora que la fuente LDAP "transport" esta definida, necesitamos hacer que postfix este al tanto de ella. Esto usando los parametros "transport_maps" y "mydestination" en /etc/postfix/main.cf. En la configuracion previa ya se habia configurado "mydestination" asi que solo hay que modifcarla para que use la fuente LDAP "transport". mydestination = $transport_maps, localhost, $myhostname, localhost.$mydomain, $mydomain transport_maps = ldap:transport 4.4.2.4. Los alias virtuales (virtual_alias_maps) Ahora que la fuente LDAP "aliases, "virtualforward" y "accountsmap" se han definido, necesitamos hacer que postix sepa de ellos. Esto se hace usando el parametro "virtual_maps" en /etc/postfix/main.cf. virtual_maps = ldap:virtualforward, ldap:aliases, ldap:accountsmap 4.4.2.5. Las cuentas virtuales Decirle a Postfix acerca de las cuentas virtuales se hace de una manera diferente a como se hizo con los alias y los transportes. Para esto se definiran un poco mas de parametros, unos especificos para el almacenamiento de el correo virtual. Para este ejemplo asumimos que se creo el usuario y grupo Unix "vmail" con el UID de 5000 y GID de 5000, y su directorio HOME es /home/vmail. Usaremos el directorio home de el usuario vmail como el lugar donde almacenaremos nuestro repositorio de correo virtual. virtual_mailbox_base = /home/vmail/domains virtual_mailbox_maps = ldap:accounts virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_minimum_uid = 5000 virtual_mailbox_limit = 0 Los dos primeros parametros se usan para decirle donde esta la base de el repositorio de los correos virtuales. y la otra para decirle cual es la fuente LDAP donde buscaremos la ruta de el buzon de el correo, recordemos que en la fuente LDAP "accounts" se obtiene como parametro "mailbox". Las siguentes configuraciones se usan para definir el UID y GID de el usuario vmail, y el parametro "virtual_minimum_uid" especifica esto significa que uid minimos a el 5000 seran rechazados y el mensaje sera "deferred". Todos estos parametros estan completament documentados en los archivos README_FILES/VIRTUAL_README[16] que vienen con las fuentes de Postfix. Tambien necesitamos editar el parametro "local_recipient_maps" para que tambien busque en "virtual_mailbox_maps" de manera que Postfix sepa quien es un usuario en el servidor de correo y quien no. La razon por la que hacemos esto s para que Postfix rechace correo para usuarios desconocidos. Anteriormente se configuro asi: local_recipient_maps = unix:passwd.byname $alias_maps ahora se cambiara a: local_recipient_maps = proxy:unix:passwd.byname, $alias_maps, $virtual_mailbox_maps Tambien usaremos el parametro: show_user_unknown_table_name = no Con esto hacemos que postfix no muestre en el mensaje de rechazo en que tabla no encontro la cuenta de correo. Por ultimo hay que iniciar el servicio postfix asi: # /etc/init.d/postfix start Para que el servicio de postfix sea iniciado al arranque del sistema ejecutar el siguiente comando: # rc-update add postfix default * postfix added to runlevel default * rc-update complete. 4.4.2.6. SMTP Autenticado (SMTP-AUTH) Si requieres que los usuarios puedan enviar correo (RELAY) desde fuera de tu red local, por ejemplo de alguna sucursal, o agentes de ventas que estan constantemente viajando, y no sabes que direccion IP estan usando o cambia constantemente y ademas quieres tener mas control sobre quien envia correo por tu servidor, entonces la solucion es usar SMTP Autenticado (SMTP-AUTH). Con SMTP-AUTH se configura el MTA (Postfix) para que cuando se establezca una conexion con el servidor el usaurio primero se autentique con su usurio (email) y contraseña antes de que pueda enviar correos, si el usaurio se autentica satisfactoriamente, es decir, el usuario y la contraseña se son validas entonces el usaurio podra enviar correo por medio de el servidor. Basicamente esa es la funcion de SMTP-AUTH, Para configurar SMTP-AUTH en Postfix se usara la autenticacion buscando la informacion de el login (usuario/contraseña) en el directorio LDAP, para esto usaremos las librerias SASL de cyrus-sasl y usaremos el demonio de autenticacion saslauthd. Instalar y configurar cyrus-sasl con soporte de authdaemond (se instalar al mismo tiempo courier-imap-authlib y courier-imapd: # USE="-postgress authdaemond" emerge cyrus-sasl Configurar saslauthd: # vim /etc/conf.d/saslauthd SASLAUTHD_OPTS="" SASLAUTHD_OPTS="${SASLAUTH_MECH} -a ldap -O /etc/saslauthd.conf -n 5" :wq Con esto le decimos que use como mecanismo de autentificacion a LDAP y usando el archivo de configuracion /etc/saslauthd.conf y que solo pueda ejecutar 5 threads. Configurar /etc/saslauthd.conf # vim /etc/saslauthd.conf ldap-servers: ldap://localhost/ ldap_auth_method: bind ldap_bind_dn: cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx ldap_bind_pw: PASSWORD_PHAMM ldap_filter: (&(mail=%U@%d)(smtpAuth=TRUE)) ldap_search_base: o=hosting,dc=calcom,dc=com,dc=mx :wq Conectarse con el seridor ldap en el localhost. Usar como base de busqueda la unidad organizacional o=hosting,dc=calcom,dc=com,dc=mx usar el filtro para usuario que se traduciria a: usuario@dominio.tld y que tengan smtpAuth = TRUE Usar el metodo de autenticacion "bind". Iniciar el servicio saslauthd asi: # /etc/init.d/saslauthd start Para que el servicio de saslauthd sea iniciado al arranque del sistema ejecutar el siguiente comando: # rc-update add saslauthd default Configurar soporte de SMTP autenticado para postfix: # vim /etc/sasl2/smtpd.conf pwcheck_method:saslauthd mech_list: plain login :wq Aqui se usara a saslauthd el cual ya fue configuardo para usar la informacion de el directorio ldap. Configurar postfix: # vim /etc/postfix/main.cf # SMTP-AUTH smtpd_sasl_auth_enable = yes smtpd_sasl_application_name = smtpd smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination :wq Reiniciar postfix para que tome los cambios y soporte SMTP-AUTH: # /etc/init.d/postfix restart 4.5. Courier 4.5.1. Configuracion de el demonio de autenticacion (courier-authlib). Con las USE flags que se definieron en el archivo /etc/make.conf por default se tiene soporte para LDAP, por lo que los programas courier se instalaron con soporte para LDAP. Aun asi se reemergera courier-imap para que tenga soporte de FAM y asi se puedan usar shared folders. Reemerger courier-imap con soporte para FAM para shared folders: # USE="fam -ipv6" emerge courier-imap Los servicios de Courier como courier-imapd y courier-pop3d usan el demonio de autenticacion courier-authlib, su configuracion global esta en el archivo de configuracion /etc/courier/authlib/authdaemonrc En este archivo se definen parametros globales para el demonio de autenticacion, aqui se definen los modulos que podra usar para la autenticacion, en nueestro caso el primero sera para LDAP, esto se define en la variable, authmodulelist: authmodulelist="authldap authpam authuserdb authshadow authcustom authpipe" Este archivo no lo tocaremos solo fue un comentario, por default al instlar courier-authlib con soporte LDAP el ebuild preconfigura los modulos para LDAP. 4.5.2. Configuracion de la busqueda en el directorio LDAP. Los parametros LDAP para courier-authlib estan definidos en el archivo de configuracion: /etc/courier/authlib/authldaprc La mayoria de los parametros son por si solo explicados, lo que si tendremos que configurar es que use los datos de nuestro directorio ldap y que use los UID/GID de el usuario "vmail". Este es un resumen de los parametros que configuraremos: # vim /etc/courier/authlib/authldaprc LDAP_SERVER localhost LDAP_PORT 389 LDAP_PROTOCOL_VERSION 3 LDAP_BASEDN o=hosting,dc=calcom,dc=com,dc=mx LDAP_BINDDN cn=phamm,o=hosting,dc=calcom,dc=com,dc=mx LDAP_BINDPW PASSWORD_PHAMM LDAP_TIMEOUT 120 LDAP_AUTHBIND 1 LDAP_MAIL mail LDAP_FILTER (accountActive=TRUE) LDAP_GLOB_UID 5000 LDAP_GLOB_GID 5000 LDAP_HOMEDIR vdHome LDAP_MAILDIR mailbox LDAP_MAILDIRQUOTA quota LDAP_FULLNAME cn LDAP_CRYPTPW userPassword LDAP_DEREF never LDAP_TLS 0 :wq Para que el servicio de courier-authlib sea iniciado al arranque del sistema ejecutar el siguiente comando: # rc-update add courier-authlib default * courier-authlib added to runlevel default * rc-update complete. Iniciar el servicio courier-authlib asi: # /etc/init.d/courier-authlib start 4.5.3. Configurando los servicios de courier (IMAP, POP3) Ahora que el el servicio de autenticacion esta configurado e iniciado, entonces tendremos que configurar los servicios IMAP y POP3. Primero courier-imapd El archivo de configuracion de el servicio courier-imapd es: /etc/courier-imap/imapd La mayoria de los parametros por default son suficientes, nosotros solo cambiaremos algunos, por ejemplo: El maximo numero de conexiones que se aceptaran de una misma direccion IP, en nuestro caso como se manejan varias sucursales y en estas hay aproximadamente 20 cuentas de correo por sucursal, entonces subiremos este parametro de su valor predeterminado de 4 a 20 (cambialo segun tus necesidades). MAXPERIP=20 Tambien cambiaremos la variable de el directorio Maildir que usaremos: De manera predeterminada esta asi: ##NAME: MAILDIRPATH:0 # # MAILDIRPATH - directory name of the maildir directory. # ###MAILDIRPATH=Maildir #Hardwire a value for ${MAILDIR} MAILDIR=Maildir MAILDIRPATH=Maildir Guardar el archivo e iniciar el servicio asi: # /etc/init.d/courier-imapd start Para que el servicio de courier-imapd sea iniciado al arranque del sistema ejecutar el siguiente comando: # rc-update add courier-imapd default * courier-imapd added to runlevel default * rc-update complete. Ahora courier-pop3d El archivo de configuracion de el servicio courier-imapd es: /etc/courier-imap/pop3d La mayoria de los parametros por default son suficientes, nosotros solo cambiaremos algunos, por ejemplo: El maximo numero de conexiones que se aceptaran de una misma direccion IP, en nuestro caso como se manejan varias sucursales y en estas hay aproximadamente 20 cuentas de correo por sucursal, entonces subiremos este parametro de su valor predeterminado de 4 a 20 (cambialo segun tus necesidades). MAXPERIP=20 Tambien cambiaremos la variable de el directorio Maildir que usaremos: De manera predeterminada esta asi: ##NAME: MAILDIRPATH:0 # # MAILDIRPATH - directory name of the maildir directory. # ###MAILDIRPATH=Maildir #Hardwire a value for ${MAILDIR} MAILDIR=Maildir MAILDIRPATH=Maildir Guardar el archivo e iniciar el servicio asi: # /etc/init.d/courier-pop3d start Para que el servicio de courier-pop3d sea iniciado al arranque del sistema ejecutar el siguiente comando: # rc-update add courier-pop3d default * courier-pop3d added to runlevel default * rc-update complete. 4.5.3. Configurando IMAP sobre SSL TODO :D 4.6. Apache Necesitaremos instalar un servidor web el cual nos sirva para accesar a phamm via web, hemos elegido a httpd (apache2) lo instalaremos con soporte para PHP y SSL para conexiones seguras. # emerge -pv apache These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild R ] net-www/apache-2.0.54-r31 +apache2 -debug -doc +ldap -mpm-leader -mpm-peruser -mpm-prefork -mpm-threadpool -mpm-worker -no-suexec (-selinux) +ssl -static-modules -threads 0 kB Como vemos ya estan configuradas las USE flags con soporte para LDAP (+ldap), y SSL (+ssl). Entonces lo isntalaremos de manera normal: # emerge apache 4.6.1. Configuracion de apache para soporte PHP y SSL. Por default apache no tiene activados los modulos para SSL aunque fue inicialmente instalado con soporte SSL. antes que nada instalaremos el modulo de PHP para apache. # emerge -pv mod_php These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild R ] dev-php/mod_php-4.4.0-r9 -X +apache2 -berkdb +crypt -curl -debug -doc -fdftk -firebird -flash -freetds +gd -gd-external +gdbm -gmp +hardenedphp +imap -informix +ipv6 -java +jpeg -kerberos +ldap -mcal -memlimit -mssql -mysql +nls -oci8 -odbc +pam +png -postgres -snmp -spell +ssl -tiff +truetype +xml2 -yaz 0 kB Esas dependencias son suficientes, ahora lo isntalaremos: # emerge mod_php Ahora configuraremos los archivos para que sean cargados los modulos de PHP y SSL. El archivo donde se configura esto en Gentoo GNU/Linux es: /etc/conf.d/apache2 # vim /etc/conf.d/apache2 APACHE2_OPTS="-D DEFAULT_VHOST -D SSL -D SSL_DEFAULT_VHOST -D PHP4" Con esta linea agregamos soporte para el default virtual host, soporte SSL, soporte ssl para el default virtual host y soporte PHP4. Ahora iniciar el servicio apache2 asi: # /etc/init.d/apache2 start Para que el servicio de apache2 sea iniciado al arranque del sistema ejecutar el siguiente comando: # rc-update add apache2 default 4.6.2. Configuracion de un virtual host dedicado a phamm. TODO. 4.6.3. Configuracion de restricciones de acceso y comunicacion segura con (mod_ssl). TODO. 4.7. Phamm Intro: 4.7.1 Instalacion base de phamm. En el capituo 4.3. OpenLDAP ya descargamos las fuentes de phamm-0.4.7 y las descomprimimos en /root/phamm-0.4.7 Entonces copiaremos el directorio visible por apache. # cd # cp -r -v phamm-0.4.7 /var/www/localhost/htdocs/phamm # cd /var/www/localhost/htdocs/phamm 4.7.2. Configuracion de phamm. El archivo global de configuracion de Pahmm es: /var/www/localhost/htdocs/phamm/config.inc.php Podemos editar ese archivo libremente ya que esta el archivo config.inc.php.template que es exactamente igual y lo podemos usar como respaldo. # vim config.inc.php # Cambiar suffix a: define ('SUFFIX','dc=calcom,dc=com,dc=mx'); # Cambiar BINDDN a: define ('BINDDN','cn=manager,dc=calcom,dc=com,dc=mx'); # Cambiar LDAP_BASE a: $LDAP_BASE = 'o=hosting,dc=calcom,dc=com,dc=mx'; # Cambiar FORCE_SSL a 1 para obligar el acceso via SSL. define ('FORCE_SSL',1); # (OPCIONAL) Cambiar HIDE_VERSION para que no muestre la version de Phamm en la interfaz web define ('HIDE_VERSION',1); # Cambiar ORG_TITLE al nombre de tu compañia por ejemplo: define('ORG_TITLE','Calcom Hosting Admin'); # Cambiar ORG_URL a el url de tu pagina :D, por ejemplo: define('ORG_URL','http://www.calcom.com.mx'); # Ya que no usaremos el plugin de DNS comentaremos la linea para que no lo cargue: //// $plugins[] = "pdns"; # Ya que usamos el hash md5 para las contraseñas de los usuarios en OpenLDAP, tambien usaremos este algoritmo en Phamm: define ('ENC_TYPE','md5'); // Standard LDAP encryption type :wq 4.7.3. Configuracion de el plugin Mail. 4.7.4. Modifaciones extras a phamm para soporte de quotas con maildrop. 5. Administracion 5.1. Administracion del sitio. 5.2. Administracion de dominios. 5.3. Administracion de usuarios. 5.4. Notas sobre la creacion de cuentas. 5.5. Notas sobre eliminacion de cuentas. 6. Agradecimientos 7. Acerca de el author. Referencias. Bibliografia