
Calma lá! Eu concordo que colocar que algo é depreciado já no título é um tanto quanto bizarro, mas acreditem, este artigo é.
Escrevi este artigo em 2004 e após um crash no servidor onde estava hospedado, este artigo ficou perdido por um bom tempo. Poisé, e hoje, buscando por este artigo, o encontrei na íntegra no site Extmail.org. Fiquei bastante feliz, mas ao reler, vi que uma série de coisas não se compatibilizam com o que penso hoje.
Apesar disso, acho importante que esteja no ar pois muitas coisas deste artigo ainda se aplicam na prática, lógico que com algumas atualizações de software.
Acho importante também que eu esclareça as coisas que não acredito mais em relação a implementação que descrevi no artigo, e caberá a você pensar se vale a pena utilizá-lo.
1. Não acredito no uso de banco de dados relacionais como consulta para o Postfix. Bancos de dados relacionais são mais lentos, criam uma dependência perigosa e desnecessária externa e de forma mais clara, foram concebidos com outro propósito, não este. Use LDAP no lugar. É simples, rápido e existe para justamente este fim.
2. Apesar de ainda considerar o Courier-IMAP uma boa solução, hoje prefiro utilizar o Dovecot como servidor de POP3 e IMAP. É extremamente mais rápido, muito mais flexível e trabalha tanto com MBOX quanto com MAILDIR, fora a questão dos plugins disponíveis (LDA e Sieve, por exemplo) e sua implementação de autenticação SASL que é facilmente integrada com o Postfix, sem necessidades de Patches.
3. SASL. Expliquei em poucas palavras no tópico 2. Creio que a explicação seja suficiente.
4. Sobre a questão da Quota, não sou a favor de adicionar Patches de terceiros no Postfix. Hoje já existem diversas opções para implementar este comportamento. Novamente, o dovecot LDA te fornece esta funcionalidade.
Por ora, acredito que estes ítens já são claro o suficiente e mostram exatamente minha opinião hoje, mas muitos por algum motivo precisam utilizar o conjunto que entitula este Post. Sendo assim, boa leitura!
— Artigo publicado em 26/04/2004, linkado em http://www.postfix.org/non-english.html (quebrado) —
Postfix + SASL2 + Courier-IMAP + QUOTA + PostgreSQL HOW-TO
Este HOW-TO Foi escrito para auxiliar os Administradores que necessitam instalar um mailserver com suporte a domínios virtuais. Decidi usar o PostgreSQL como Banco de dados, pois este agrega uma série de funções mais complexas, e pensando que a instalação do servidor não é a única parte do processo. Talvez o administrador não queira usar somente um gerenciador de Domínios virtuais, e sim, fazer o controle do seu provedor inteiro dentro do PostgreSQL, via seu próprio “ISP Manager”. Lógicamente, é necessário uma máquina bem parruda para faze-lo, mas acredito que seja uma boa solução no que diz respeito à domínios virtuais.
Infelizmente, ainda não pude adicionar ao HOW-TO, nada relacionado à filtragem de mensagens, pois o maildrop não dá suporte ao PostgreSQL.
Consta também neste HOW-TO a implementação de soft quota para controle das caixas postais. O controle é feito pelo próprio postfix, mas necessita a aplicação de um patch.
Para Administração simples dos domínios, iniciei o desenvolvimento do Post-MailAdmin, que é baseado no ótimo PostfixAdmin, que gerencia os domínios virtuais no MySQL.
Iniciando o Processo
Instale o PostgreSQL (Faça download da ultima versão, ou baixe para sua distribuição)
Mais informações sobre o PostgreSQL aqui:
Baixe o cyrus-sasl e o patch para Crypt passwords.
O programa:
ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
O patch
http://frost.ath.cx/software/cyrus-sasl-patches/
Descompacte o software, aplique o Patch, compile e instale o programa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | [ root@server/~] # tar xvzf cyrus-sasl-2.*.*.tar.gz [ root@server/~] # cd cyrus-sasl-2.*.*/ [ root@server/~] # patch -p0 <../cyrus-sasl-2.1.17-checkpw.c.patch [ root@server/~] # ./configure --enable-login --enable-plain --enable-sql --with-pgsql=PATH-PARA-O-PGSQL [ root@server/~] # make [ root@server/~] # make install [ root@server/~] # ln -s /usr/local/lib/sasl2 /usr/lib/sasl2 # *** Não deixe de fazer isto, pois o cyrus-sasl não dá suporte à passwords crypt . Se está usando o sasl da sua distribuição, remova-o e instale a partir dos fontes*** # Crie o arquivo /usr/lib/sasl2/smtpd.conf com o seguinte conteúdo: pwcheck_method: auxprop auxprop_plugin: sql allowanonymouslogin: no allowplaintext: yes mech_list: PLAIN LOGIN srp_mda: md5 srvtab: /dev/null opiekeys: /dev/null password_format: crypt sql_engine: pgsql sql_user: postfix sql_passwd: postfix sql_hostnames: localhost sql_database: postfix sql_select: SELECT password FROM mailbox WHERE username = '%u@%r' AND domain = '%r'; # Baixe a ultima versão estável do Postfix: [ root@server/~ ]# wget ftp://ftp.matrix.com.br/pub/postfix/official/postfix-*.tar.gz [ root@server/~ ]# tar xvjf postfix-*.tar.gz |
Baixe o patch para controle de quotas referente a versão que você baixou do postfix:
http://web.onda.com.br/nadal/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 | [ root@server/~ ]# gunzip postfix-*-trash.patch.gz [ root@server/~ ]# patch -p0 <postfix-*-trash.patch [ root@server/~ ]# cd postfix-*/ [ root@server/~ ]# make tidy [ root@server/~ ]# make -f Makefile.init makefiles 'CCARGS=-DHAS_PGSQL -I/usr/local/pgsql/include -DUSE_SASL_AUTH -I/usr/local/include' 'AUXLIBS=-L/usr/local/pgsql/lib -lpq -L/usr/local/lib/sasl2 -lsasl2' # (Altere o caminho dos headers e das libs conforme a sua instalação do postgre e sasl2) [ root@server/~ ]# make [ root@server/~ ]# make install #Se houver algum erro relacionado à sasl2, coloque o path "/usr/lib" em /etc/ld.so.conf # Inicie o PostgreSQL: # Se for baseado no Red Hat: [ root@server/~ ]# service postgresql start [ root@server/~ ]# su - postgres # Caso contrário: [ root@server/~ ]# su - postgres [ postgres@server/~ ]$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data [ postgres@server/~ ]$ postmaster -D /usr/local/pgsql/data >postgresql.log 2>&1 & # Crie o usuário a database e o user postfix: [ postgres@server/~ ]$ createdb postfix [ postgres@server/~ ]$ createuser postfix #Tabelas no PostgreSQL [ postgres@server/~ ] $ psql postfix -U postfix # Caso não logar, descomente no /usr/local/pgsql/data/pg_hba.conf a linha abaixo (use isto, somente se o BD postfix, for para uso exclusivo do usuário postfix, e só para localhost), pois assim localmente, o usuário postfix do PostgreSQL não precisa de senha: # TYPE DATABASE IP_ADDRESS MASK AUTH_TYPE AUTH_ARGUMENT # local postfix seu_ip sua_mascara trust # Outro detalhe, é habilitar o PostgreSQL a escutar os pedidos de conexão. # Edite o postgresql.conf e habilite as linhas: tcpip_socket = true port = 5432 # Logue no Postgre, crie as tabelas e dê permissão. [ postgres@server/~ ] $ psql postfix -U postfix CREATE TABLE "admin" ( "username" character varying(255) NOT NULL, "password" character varying(255) NOT NULL, "created" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "modified" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "active" boolean default true, Constraint "admin_key" Primary Key ("username") ); GRANT ALL ON admin TO postfix; CREATE TABLE "alias" ( "address" character varying(255) NOT NULL, "goto" text NOT NULL, "domain" character varying(255) NOT NULL, "created" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "modified" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "active" boolean default true, Constraint "alias_key" Primary Key ("address") ); GRANT ALL ON alias TO postfix; CREATE TABLE "domain" ( "domain" character varying(255) NOT NULL, "description" character varying(255) NOT NULL, "aliases" numeric(10,0) DEFAULT '0' NOT NULL, "mailboxes" numeric(10,0) DEFAULT '0' NOT NULL, "maxquota" numeric(10,0) DEFAULT '0' NOT NULL, "created" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "modified" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "active" boolean default true, Constraint "domain_key" Primary Key ("domain") ); GRANT ALL ON domain TO postfix; CREATE TABLE "domain_admins" ( "username" character varying(255) NOT NULL, "domains" character varying(255) NOT NULL, "created" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "active" boolean default true, Constraint "domain_admins_key" Primary Key ("username") ); GRANT ALL ON domain_admins TO postfix; CREATE TABLE "mailbox" ( "username" character varying(255) NOT NULL, "password" character varying(255) NOT NULL, "name" character varying(255) NOT NULL, "maildir" character varying(255) NOT NULL, "quota" numeric(10,0) DEFAULT '0' NOT NULL, "domain" character varying(255) NOT NULL, "created" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "modified" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "active" boolean DEFAULT 't'::bool, "home" character varying(255) DEFAULT '/var/spool/virtual/', "uid" numeric(3,0) DEFAULT 200, "gid" numeric(3,0) DEFAULT 200, Constraint "mailbox_key" Primary Key ("username") ); GRANT ALL ON mailbox TO postfix; CREATE TABLE "vacation" ( "email" character varying(255) NOT NULL, "subject" character varying(255) NOT NULL, "body" text, "cache" text NOT NULL, "domain" character varying(255) NOT NULL, "created" timestamp(13) with time zone DEFAULT '1999-04-23 01:05:06', "active" boolean default true, Constraint "vacation_key" Primary Key ("email") ); GRANT ALL ON vacation TO postfix; # De "q" para sair do psql # Configuração do Postfix para utilizar usuários Virtuais. # Lembre-se que esta configuração é para os usuários virtuais, seu postfix já tem que possuir as configurações default! # Adicione ao /etc/passwd: vuser:x:200:200::/var/spool/virtual:/bin/false # Adicione ao /etc/group: vgroup:x:200: # Crie o diretório e dê permissão: [ root@server/~ ]# mkdir /var/spool/virtual [ root@server/~ ]# chown 200:200 /var/spool/virtual # Crie os seguintes arquivos com os seguintes conteúdos: # /etc/postfix/pgsql_virtual_domains_maps.cf user = postfix password = postfix dbname = postfix table = domain select_field = domain where_field = domain additional_conditions = and active = true # ========================== # /etc/postfix/pgsql_virtual_mailbox_maps.cf user = postfix password = postfix dbname = postfix table = mailbox select_field = maildir where_field = username additional_conditions = and active = true # ========================== # /etc/postfix/pgsql_virtual_mailbox_size.cf user = postfix password = postfix dbname = postfix table = mailbox select_field = quota where_field = username additional_conditions = and active = true # ========================== # /etc/postfix/pgsql_virtual_alias_maps.cf user = postfix password = postfix dbname = postfix table = alias select_field = goto where_field = address additional_conditions = and active = true # Edite o arquivo /etc/postfix/main.cf e adicione as seguintes configurações: # Lembrando novamente que estou supondo que você já fez a configuração básica do mesmo. # PGSQL virtual_uid_maps = static:200 virtual_gid_maps = static:200 virtual_mailbox_base = /var/spool/virtual virtual_mailbox_domains = pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf virtual_mailbox_maps = pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf virtual_alias_maps = pgsql:/etc/postfix/pgsql_virtual_alias_maps.cf virtual_mailbox_limit = 51200000 virtual_transport = virtual # SASL2 smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_sasl_authenticated reject_unauth_destination, permit_mynetworks smtpd_sasl_application_name = smtpd broken_sasl_auth_clients = yes # QUOTA virtual_mailbox_limit_inbox = no virtual_mailbox_limit_maps = pgsql:/etc/postfix/pgsql_virtual_mailbox_size.cf virtual_mailbox_limit_override = yes virtual_maildir_extended = yes virtual_create_maildirsize = yes virtual_mailbox_limit = 100000000 |
Simples teste:
Primeiro insira alguma coisa nas tabelas
1 | INSERT INTO mailbox (username,password,name,maildir,quota,domain) values ('teste@dominio.com.br','$1$Fi8IP53B$3yeGqD1Cnax.f.yAkLiAd1','name','teste@dominio.com.br/',1048576,'dominio.com.br'); |
Insira a senha criptografada!
A SENHA NESTE CASO É a palavra teste e quota é de 1MB
1 | INSERT INTO domain (domain,description,aliases,mailboxes,maxquota) values ('dominio.com.br','Domínio Virtual',1,1,1); |
Reinicie o Postfix:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | [ root@server/~ ]# postfix stop; postfix start # Dê um telnet no host: [root@server~/]# telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 server.domain.com.br ESMTP Postfix (2.1.0) MAIL FROM: teste@dominio.com.br 250 Ok RCPT TO: teste@dominio.com.br 250 Ok DATA 354 End data with <CR><LF>.<CR><LF> teste . 250 Ok: queued as 7B41F4665A quit 221 Bye Connection closed by foreign host. [root@server~/]# cd /var/spool/virtual;ls -la drwxr-xr-x 3 vuser vgroup 4096 Abr 26 11:18 . drwxr-xr-x 11 root root 4096 Abr 26 10:44 .. drwx------ 5 vuser vgroup 4096 Abr 26 11:18 teste@dominio.com.br [root@server~/]# |
Quando a mensagem chegar, será criado um arquivo chamado maildirsize dentro do diretório do usuário, que controlará a cota deste usuário virtual.
Courier-IMAP
Baixe o Courier-IMAP em http://www.courier-mta.org/download.php
Descompacte-o como usuário normal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | [ tanga_frouxa@server/~ ]$ tar xfjv courier-imap-3.0.3.20040424.tar.bz2 # Antes de iniciar o processo, certifique-se que existem os diretórios ou links /usr/include/pgsql e /usr/lib/pgsql, pois, se não existirem, pode acontecer de o courier-imap não ser compilado com suporte à PostgreSQL. [ tanga_frouxa@server/~ ]$ ./configure --with-redhat --enable-workarounds-for-imap-client-bugs # O --with-redhat somente se vc está usando Red Hat linux. [ tanga_frouxa@server/~ ]$ make # E como root: [ root@server/~ ]# make install [ root@server/~ ]# make install-configure #Configuração: # /usr/lib/courier-imap/etc/authdaemonrc authmodulelist="authpgsql authpam" authmodulelistorig="authpgsql authpam" daemons=5 # Aumente este valor caso tiver muitos "clientes IMAP" version="" authdaemonvar=/usr/lib/courier-imap/var/authdaemon # /usr/lib/courier-imap/etc/authpgsqlrc # É provável que ele exista com o nome de authpgsqlrc.dist. PGSQL_HOST localhost PGSQL_PORT 5432 PGSQL_USERNAME postfix PGSQL_PASSWORD postfix PGSQL_DATABASE postfix PGSQL_USER_TABLE mailbox PGSQL_CRYPT_PWFIELD password PGSQL_UID_FIELD uid PGSQL_GID_FIELD gid PGSQL_LOGIN_FIELD username PGSQL_HOME_FIELD home PGSQL_NAME_FIELD name PGSQL_MAILDIR_FIELD maildir # Inicie o Courier-IMAP: /usr/lib/courier-imap/libexec/imapd.rc start # Dê um telnet no host: [root@server~/]# telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Hello there. user teste@dominio.com.br +OK Password required. pass teste +OK logged in. list +OK POP3 clients that break here, they violate STD53. 1 1051 2 442 3 505 4 13516 5 27389 . quit +OK Bye-bye. Connection closed by foreign host. [root@server~/]# |
Pronto agora é só Instalar o Post-MailAdmin para adicionar e remover os usuários. Assim que possível, coloco a parte de anti-vírus no Postfix.
——————————————————————————–
Bibliografia
Postfix Website: http://www.postfix.org
Pelas quotas, agradeço à Marco Máximo pelo seu HOW-TO no Link http://www.linuxit.com.br/section-viewarticle-78.html
SASL2: http://www.gfxcafe.com/Mail%20Howto.htm / http://frost.ath.cx/software/cyrus-sasl-patches/
Autor Leandro Mendes - 26/04/2004
Atualizado em: 12/07/2004