Postfix + LDAP + Courier IMAP Luciano Linhares Martins - lmartins@matrix.com.br Introdução ---------- Esse artigo tem como objetivo auxiliar a configuração do postfix e courier POP/IMAP com a base LDAP de usuários. Através dessa solução não é necessária a criação de usuários locais no seu sistema. É possível compartilhar a base LDAP de usuários com outros servidores, utilizando-a para um cluster de servidores de e-mail. As mensagens vão ficar armazenadas no formato Maildir, que apresenta um desempenho superior em relação ao formato tradicional mailbox. Com o formato Maildir as mensagens podem ficar armazenadas em um servidor NFS, permitindo um cluster de servidores de e-mail. Requisitos ---------- - Conhecimento básico de LDAP e servidores de E-mail - Servidor LDAP configurado corretamente - Libraries do openldap - Schema no servidor LDAP que contenha atributos necessários para o endereçamento dos e-mails - Postfix compilado com suporte a LDAP - Courier POP/IMAP com suporte a LDAP O schema utilizado nesse artigo vai ser o mesmo utilizado pelo Qmail-LDAP. Você pode criar o seu próprio schema ou alterar o seu schema atual para funcionar de acordo com essa solução. * Download do qmail.schema http://www.uni.torun.pl/LDAP/archiwum/ftp/schema/qmail.schema Instalação ---------- É possível instalar o Postfix-Ldap a partir de pacotes da sua distribuição ou através da compilação dos fontes. Quem utiliza a distribuição Debian basta digitar: # apt-get install postfix-ldap Para outras distribuições procure o pacote correspondente e prossiga a instalação. As distribuições que não acompanham o pacote do postfix com suporte a LDAP ou quem desejar utilizar uma versão customizada do postfix pode prosseguir com a compilação. O download dos fontes do Postfix está disponível em http://www.postfix.org. Compilação ---------- # make tidy # make makefiles CCARGS="-I/usr/include -DHAS_LDAP" \ AUXLIBS="-L/usr/lib -lldap -L/usr/lib -llber" # make install LDAP ---- Exemplo de um usuário de e-mail na base LDAP: dn: uid=usuario,ou=People,dc=dominio,dc=com,dc=br uid: usuario cn: usuario sn: usuario mailAlternateAddress: usuario@dominio.com.br mailAlternateAddress: outro-email@dominio.com.br mailAlternateAddress: usuario@outrodominio.com.br mail: usuario@mx.dominio.com.br mailHost: mx.dominio.com.br mailMessageStore: /home/vmail/usuario/Maildir/ objectClass: qmailUser objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword: {crypt}$1$dlxdTIRc$Iz4tq1UCme59UZXSSWWSS shadowLastChange: 11890 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 507 gidNumber: 507 homeDirectory: /home/usuario Funcionamento do sistema ------------------------ 1. E-mail enviado para usuario@dominio.com.br 2. Servidor de e-mail consulta base LDAP o atributo "mailAlternateAddress" que contenha o dado usuario@dominio.com.br 3. Através do atributo "mailAlternateAddress" é retornado o endereço de e-mail para roteamento atributo "mail" que é o endereço: usuario@mx.dominio.com.br 4. A partir do endereço de "roteamento" de e-mail usuario@mx.dominio.com.br é feita outra pesquisa e é retornado o atributo "mailMessageStore", que corresponde ao Maildir do usuário onde as mensagens vão ficar armazenadas. 5. A mensagem é armazenada no diretório retornado pelo "mailMessageStore", no meu caso, /home/vmail/usuario/MailDir 6. O cliente obtém as mensagens através do servidor Courier POP/IMAP. O Courier IMAP pode buscar o login do usuário a partir do atributo uid ou mail da base LDAP. Utiliza o atributo "mailMessageStore" para localizar as mensagens do usuário armazenadas no formato MailDir. * Para esse sistema funcionar, é necessário a criação de um usuário local no sistema, para o servidor de e-mail armazenar as mensagens com o uid/gid desse usuário. No meu caso utilizei o usuário vmail com o grupo vmail, uid 240, gid 240. Obs: Você pode configurar o Postfix de uma forma mais simples, eliminando o endereço de roteamento local. Utilizando apenas o endereço de e-mail retornando como resposta o local onde as mensagens vão ficar armazenadas. A solução acima foi adotada para manter a compatibilidade com outros MTAs que utilizam essa configuração. Configuração do Postfix ----------------------- Arquivo: /etc/postfix/main.cf # MAPS # Configura o formato das caixas postais para Maildir home_mailbox = Maildir/ # Define o método de transporte das caixas postais mailbox_transport = virtual: mailbox_command = /usr/bin/procmail mailbox_command_maps = ldap:accounts # Mapa de usuarios locais local_recipient_maps = $alias_maps $virtual_mailbox_maps # Configuração Virtual # Mapeia as contas de e-mail virtual_maps = ldap:accountsmap # Mailbox das contas de e-mail virtual_mailbox_base = / virtual_mailbox_maps = ldap:accounts # Uid/gid do usuario vmail que as mensagens vão estar armazenadas virtual_uid_maps = static:240 virtual_gid_maps = static:240 virtual_maildir_extended = yes # LDAP # Pesquisa nos endereços de e-mails dos usuários e retorna o endereço de # e-mail de roteamento accountsmap_server_host = ldap.dominio.com.br accountsmap_bind_dn = cn=Postfix,dc=dominio,dc=com,dc=br accountsmap_bind_pw = senha accountsmap_search_base = dc=dominio,dc=com,dc=br accountsmap_query_filter = (&(objectClass=qmailUser)(mailAlternateAddress=%s)) accountsmap_result_attribute = mail accountsmap_bind = yes # Pesquisa o endereço de e-mail de roteamento # e o retorno do valor mailMessageStore, onde as mensagems # vão ficar armazenadas. accounts_server_host = ldap.dominio.com.br accounts_bind_dn = cn=Postfix,dc=dominio,dc=com,dc=br accounts_bind_pw = senha accounts_search_base = dc=dominio,dc=com,dc=br accounts_query_filter = (&(objectClass=qmailUser)(mail=%s)) accounts_result_attribute = mailMessageStore accounts_bind = yes * Valores acccountsmap_bind, acccountsmap_bind_dn , acccountsmap_bind_pw são opcionais, você pode ativá-los, caso deseje conectar-se a base LDAP com um determinado usuário. Courier POP/IMAP ---------------- Fazer o download do pacote courier-imap em: http://www.courier-mta.org/download.php Descompactar os fontes $ tar xvjf courier-imap-1.6.1.20021124.tar.bz2 Como um usuário comum rodar os seguintes comandos $./configure $ make Como super usuário(root) proceder a instalação # make install O courier, por padrão é instalado no diretório /usr/lib/courier-imap, os arquivos de configuração ficam no diretório /usr/lib/courier-imap/etc Copiar os arquivos de configuração padrão # cd /usr/lib/courier-imap/etc # for foo in *.dist; do cp $foo `basename $foo .dist`; done Editar as configurações do courier Arquivo: authdaemonrc authmodulelistorig="authldap" authmodulelist="authldap" version="authdaemond.ldap" Arquivo: imapd IMAPDSTART=YES Arquivo: pop3d POP3DSTART=YES Arquivo: authldaprc # Definições do servidor LDAP e usuário p/ conexão ao servidor LDAP_SERVER localhost LDAP_PORT 389 LDAP_BASEDN dc=dominio,dc=com,dc=br LDAP_BINDDN cn=courier,dc=dominio,dc=com,dc=br LDAP_BINDPW senha-ldap # UID/GID dos e-mails virtuals (Usuário vmail) LDAP_GLOB_UID 240 LDAP_GLOB_GID 240 # Filtro da pesquisa ldap LDAP_FILTER (objectClass=qmailUser) # Atributo utilizado para as pesquisas de login LDAP_MAIL mailAlternateAddress # Dominio padrão LDAP_DOMAIN dominio.com.br # Atributo da localização do maildir LDAP_MAILDIR mailMessageStore # Atributo da senha do usuário LDAP_CRYPTPW userPassword * Através da configuração acima o usuário que tem conta joao@dominio.com.br pode logar no servidor POP/IMAP, informando apenas joao como nome do usuário, usuários de outros domínios logam como usuario@outrodominio.com.br. A opção LDAP_DOMAIN serve para completar o domínio de e-mail padrão dos usuários. Para logar com outro atributo como UID, basta mudar a opção da seguinte forma "LDAP_MAIL uid" e comentar a linha referente ao LDAP_DOMAIN. Inicialização dos serviços do courier: #!/bin/bash case "$1" in start) echo "$0 Inicializando" /usr/lib/courier-imap/libexec/imapd.rc start /usr/lib/courier-imap/libexec/pop3d.rc start ;; stop) echo "$0 Finalizando" /usr/lib/courier-imap/libexec/imapd.rc stop /usr/lib/courier-imap/libexec/pop3d.rc stop ;; *) echo "$0 start/stop" ;; esac Opcionais --------- 1. Usuários para Postfix e Courier na base LDAP. Você pode criar usuários na Base LDAP para o Postfix e courier fazerem as consultas: Arquivo: users.ldif dn: dc=dominio,dc=com,dc=br objectclass: dcObject objectclass: organization o: Dominio dc: dominio dn: cn=courier,dc=dominio,dc=com,dc=br objectclass: organizationalRole cn: courier dn: cn=postfix,dc=dominio,dc=com,dc=br objectclass: organizationalRole cn: postfix Configurando as senhas desses usuários: Arquivo: userspass.sh #!/bin/bash # Senha do usuário Manager senham="senha" # Senha para o usuario courier cpass="senha-courier" # Senha para o usuario postfix ppass="senha-postfix" # Seu DN dc="dc=dominio,dc=com,dc=br" # Configurar os acessos no servidor LDAP ldappasswd -x -v -w $senha -S -D "cn=Manager,$dc" \ "cn=courier,$dc" -s $cpass ldappasswd -x -v -w $senha -S -D "cn=Manager,$dc" \ "cn=postfix,$dc" -s $ppass * Substituir as senhas e os usuários de acordo com a sua configuração. 2. Convertendo mensagens no formato MailBox para Maildir É bem provável que você já possua uma estrutura de e-mail armazenando as mensagens no formato MailBox. Para facilitar a migração das mensagens de um formato para o outro existem diversos utilitários. Um deles é o programa mbox2maildir, que pode ser encontrado no seguinte endereço: http://qmail.matrix.com.br/mbox2maildir esse programa “pega” variáveis do sistema, como MAILDIR, MAIL e MAILTMP para converter as mensagens. Para você não ter que definir essas variáveis manualmente para cada conta de e-mail eu criei um script em Shell, que lista as Mailboxs do seu spool de mensagens e partir delas seta as variáveis MAILDIR, MAIL e cria o Maildir do usuário com as mensagens que estavam armazenadas no formato Mailbox. Como o programa mbox2maildir apaga as mensagens originais após a conversão, esse script gera uma cópia da Mailbox original e utiliza essa cópia para fazer a conversão das mensagens, preservando as suas mensagens originais. Para rodar o script você precisa definir apenas o local onde o programa mbox2maildir está localizado, o diretório das suas mensagens armazenadas no formato mailbox e o diretório base onde o Maildir dos usuários vão estar armazenados. #!/bin/bash # 2002 - Luciano Linhares Martins # Patch do programa para converter as mensagens prog="/usr/local/bin/mbox2maildir" # SPOOL - Diretório onde os e-mais vão estar armazenados spool=/var/spool/mail # Diretório base onde as mensagens no formato Maildir vão ficar maild=/home/vmail # Loop que pega as mboxs do spool e gera o Maildir for user in `ls $spool` do # Maildir BASE - Diretório base do Maildir do usuário mbase=$maild/$user # Maildir do Usuário mdir=$mbase/Maildir # Arquivo onde os e-mails dos usuários ficam armazenados no spool email=$spool/$user tmail=$spool/$user.bk export MAILDIR=$mdir export MAIL=$tmail export MAILTMP=/tmp/tmp mkdir -p $mbase cp $email $tmail perl $prog done Notas ----- A configuração demonstrada acima é uma das formas de se implementar Postfix+LDAP+Courier, você pode implementá-la de acordo com a sua necessidade. Para administração dos usuários pode ser desenvolvida um ferramenta em php, perl ou a linguagem de sua preferência. Existem programas como o ISPMAN e JAMM, que trabalham com Postfix e LDAP porém de uma forma diferente da solução apresentada acima. Existem, também, ferramentas para você acessar a base LDAP e administrá-la, como o GQ e directory administrator. Referências ----------- http://jamm.sourceforge.net/howto/html/implementation.html http://mirror.hzqbbc.com/postfix.collections/postfix-courier-howto.txt http://www.oav.net/~kiwi/postfix/VIRTUAL_README.txt http://www.inter7.com/courierimap/ http://www.openldap.org/