Solução completa de serviço de correio baseado em software livre (Debian GNU/Linux)
Recompilação do artigo "Postfix-2 + domínios virtuais + MySQL + SASL + PostfixAdmin", de autoria do Sr. Marco A. S. Máximo. Nesse novo artigo os passos foram tomados levando em consideração os recursos do Debian e usando (sempre que possível) os pacotes dos repositórios oficiais.
Parte 9: Instalando o SASL
O SASL permite que um usuário consiga enviar email pelo servidor SMTP (relay) sem que o seu IP esteja na lista de IP's liberados para relay. No Postfix é configurado na linha "mynetworks", no arquivo main.cf.
O requisito para enviar email, é que o usuário exista no sistema. Isso é um ótimo recurso, pois o usuário onde estiver pode enviar email pelo seu servidor, sem que você precise liberar o "Relay" para todo mundo.
Nessa versão do tutorial, configurei o SASL para autenticação de usuários LOCAIS (do sistema) e VIRTUAIS (MySQL).
Instalando o SASL
Nessa configuração, irei basear-me nos pacotes RPM. O Mandrake já vem com o Cyrus-SASL compilado, sendo que a instalação é muito simples.
Passei 2 dias tentando fazer o SASL 2, instalado a partir do código fonte funcionar com o Postfix+MySQL, mas sem sucesso. Não descobri porque, mas se alguém conseguiu, por favor entre em contato. :-)
# apt-get install sasl2-bin libsasl2 libsasl2-dev libsasl2-modules libsasl2-modules-sql
Instalando o PAM-MYSQL
Para permitir a autenticação SASL usando o MySQL, vamos usar o módulo "pam_mysql".
# apt-get install libpam-mysql metamail
Se existir o arquivo /usr/lib/sasl2/smtpd.conf, apague-o:
# rm -f /usr/lib/sasl2/smtpd.conf
Crie os seguintes arquivos com o respectivo conteúdo:
# vim /etc/postfix/sasl/smtpd.conf
#smtpd.conf
#-----------
pwcheck_method: saslauthd
mech_list: plain login
log_level: 7
#smtp
#----------------------------------------------
#%PAM-1.0
auth required pam_mysql.so user=postfix passwd=xxxxx host=localhost
db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1
account required pam_mysql.so user=postfix passwd=xxxxx host=localhost
db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1
#-----------------------------------------------
#-----------
pwcheck_method: saslauthd
mech_list: plain login
log_level: 7
#smtp
#----------------------------------------------
#%PAM-1.0
auth required pam_mysql.so user=postfix passwd=xxxxx host=localhost
db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1
account required pam_mysql.so user=postfix passwd=xxxxx host=localhost
db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1
#-----------------------------------------------
Habilitando o SASL no Postfix
Descomente as seguintes linhas no arquivo /etc/postfix/main.cf:
#====== SASL ================
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
check_relay_domains
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
check_relay_domains
Reinicie o Postfix:
# /etc/init.d/postfix restart
Edite o arquivo /etc/default/saslauthd e troque a linha:
# START=yes
por:
START=yes
e adicione a linha:
PARAMS=" -r"
Após isso edite os grupos com vigr:
# vigr
Localize a linha:
sasl:x:45:
e adicione a palavra postfix ao final dessa linha:
sasl:x:45:postfix
Inicie (ou reinicie) o serviço de autenticação do SASL:
# /etc/init.d/saslauthd start
# ps ax |grep sasl
30101 ? Ss 0:00 /usr/sbin/saslauthd -r -a pam
30102 ? S 0:00 /usr/sbin/saslauthd -r -a pam
30103 ? S 0:00 /usr/sbin/saslauthd -r -a pam
30104 ? S 0:00 /usr/sbin/saslauthd -r -a pam
30105 ? S 0:00 /usr/sbin/saslauthd -r -a pam
Testes
Você pode testar se o SASL esta usando o módulo pam-mysql corretamente digitando o comando:
# testsaslauthd -u "fulano@dominio1.com.br" -p "xxxxx" -s smtp
e veja se o resultado é:
0: OK "Success."
Então Ok!
Para testar a autenticação SASL com o Postfix é necessário a criação de uma senha para teste. Execute o seguinte comando:
Usuário VIRTUAL:
# printf 'fulano@dominio1.com.br\0fulano@dominio1.com.br\0xxxxx' | mimencode
bWFyY28ubWF4aW1vQGRvbWluaW8xLmNvbS5icgBtYXJjby5tYXh pbW9AZG9taW5pbzEuY29tLmJyAHJkcm1heC0zNTA=
Usuário LOCAL:
# printf 'usuario\0usuario\0xxxxx' | mimencode
bWFyY28AbWFyY28AcmRybWF4
OBS: Esse comando irá gerar uma senha criptografada e essa deve ser fornecida toda na mesma linha durante o teste.
Agora faça:
Usuário VIRTUAL:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 postfix.dominio.com.br ESMTP MEU DOMINIO
ehlo postfix
250-postfix.dominio.com.br
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
(na mesma linha faça:)
AUTH PLAIN bWFyY28ubWF4aW1vQGRvbWluaW8xLmNvbS5icgBtYXJjb...
235 Authentication successful
quit
221 Bye
******************** LOG DO MYSQL *******************
031110 14:38:37 7 Connect postfix@localhost on postfix
7 Init DB postfix
7 Query SELECT password FROM mailbox WHERE username='fulano@dominio1.com.br'
7 Quit
******************************************************
Usuário LOCAL:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 postfix.dominio.com.br ESMTP MEU DOMINIO
ehlo postfix
250-postfix.dominio.com.br
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
(na mesma linha faça:)
AUTH PLAIN bWFyY28AbWFyY28AcmRybWF4
235 Authentication successful
quit
221 Bye
Funcionou! Agora quando você for enviar e-mail, habilite a opção de autenticação no seu cliente de e-mail.
Configurações bem detalhadas... Com certeza vai facilitar a vida de muita gente.
Fica a sugestão para implementar um webmail...