Autentificación de usuários com sendmail em FreeBSD

Autor: Emilio Florido
Data: 07/11/2002.


O ponto de partida

Em meu trabalho temos uma máquina FreeBSD conectada de forma permanente a Internet mediante uma linha ADSL. Entre outros, esta máquina dá serviço de correio eletrônico (tanto de entrada como de saída) para o domínio que temos contratado. Dito de outra forma, o "router" ADSL redirige qualquer petição de correio que lhe chega de Internet -a sua direção de rede pública- para a direção de rede privada da máquina FreeBSD para que esta a resolva.

O problema

Ainda que enquanto um usuário dado de alta na máquina FreeBSD que está em seu posto de trabalho e conectado a ela pode tanto enviar como receber correio eletrônico desde ou para qualquer outra máquina (já seja de Internet ou do resto de nossa rede privada), quando esses mesmos usuários estão em suas casas e desejam usar como "servo de correio saliente" a máquina FreeBSD (conectando-se a ela com qualquer dos provedores habituais de Internet) esta sempre lhes contesta que Relay denied, algo bem como Reenvío denegado.

Mais concretamente, os usuários que pertencem à mesma rede que aquela na que está a máquina FreeBSD não têm problemas com o correio saliente e os que pertencem a qualquer outra rede não podem usá-lo.

Que se conta aqui

Neste documento o que pretendo é contar como em meu caso concreto resolvi este problema. É dizer, como permitir o reenvío de correio saliente desde uma máquina externa à rede à que pertence a máquina FreeBSD. Insisto novamente, só me referirei ao correio saliente, pois o correio entrante não deveria dar nenhum problema deste tipo.

Também me gostaria deixar claro que isto é o que eu fiz e que ao menos até agora funciona perfeitamente. Logicamente não posso garantir que funcione em outras situações ou com outras configurações, mas se estou aberto a perguntas ou sugestões de qualquer tipo.

Por outra parte, este método exige poder conectar-se como administrador à máquina FreeBSD para retocar vários ficheros "importantes", exige recompilar vários programas e por suposto leva um risco de estragá-lo todo e ter que reinstalar de novo… assim que já estás avisado. Não me posso considerar responsável de qualquer problema que te surja se segues adiante, mas também não tem por que ocorrer nada disto, assim que você decides.

A configuração de partida

Ainda que FreeBSD instala sendmail para a gestão do correio eletrônico, ao menos com a RELEASE 4.7 a compilação que vem por defeito NÃO inclui a possibilidade de realizar autenticación de usuários. Se queres comprovar se em teu caso concreto teu sendmail dispões ou não de autenticación basta apenas que faças um "telnet" ao porto 25 de tua máquina (algo bem como telnet tumaquina.com 25). Quando sendmail te saúde você lhe dizes ehlo usuário e fixa-te no que te contesta. Deveria ser algo como isto:

 
220 tumaquina.com ESMTP Sendmail 8.12.3/8.12.6; Thu, 7 Nov 2002 17:18:25 +0100
(CET)
ehlo usuário
250-tumaquina.com Hello %[192.168.1.10], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP

A linha importante é a que põe AUTH LOGIN PLAIN. Se NÃO a tens, segue lendo pois este documento te pode interessar. Se já a tens, enhorabuena, teu sendmail já dispõe de autenticación , mesmo assim, podes ler o resto para fazer que sendmail faça uso da autenticación.

Antes de seguir

Se ojeas um momento por Internet verás que para resolver este mesmo problema do correio saliente há algumas outras formas. Uma muito socorrida é pop-before-smtp (basta apenas que escrevas isto em google e verás que há milhares de referências a ela).

A groso modo, pop-before-smtp consiste em aproveitar que para receber o correio (não para enviá-lo) é necessário identificar-se (é dizer, proporcionar o usuário e a contraseña). Baseando-se em isto e fazendo "malabarismos" com os ficheros /var/log/maillog, /etc/mail/access e imagino que com algum outro, incorpora-se à lista de máquinas às que se permite fazer "reenvío" de correio, a máquina desde a que acede um determinado usuário, isso se, sempre que sua validação na recepção de correio tenha sido correta.

Esta inserção da nova máquina na lista de "reenvío" é só durante um determinado tempo (por exemplo durante 10 minutos) e enquanto dure, o usuário em questão poderá usar o correio saliente. Passado o tempo estipulado (usando por exemplo cron para controlá-lo) se "saca" a máquina adicionada da lista de máquinas autorizadas para o "reenvío" e a situação fica como ao princípio.

Ainda que pode parecer boa idéia, tentei instalá-lo e me deu muitos problemas em FreeBSD pois a versão que encontrei em sourceforge de pop-before-smtp devia ser para Linux (ainda que punha que era independente da plataforma) e não consegui que funcionasse. Também li que como muitos programas de correio (por exemplo Outlook) primeiro enviam o correio e logo o recebem, a primeira vez que se usa dá erro (pois ainda não estará incluída a máquina na lista de máquinas autorizadas), ainda que a verdade é que não o provei, mas se te animas, não me importaria ler tuas experiências…

Preparando-se para o processo

Bueno, pois mãos à obra. O primeiro será obter os fontes de sendmail para poder compilá-los. Eu recomendo, aproveitando de que temos um FreeBSD entre mãos, usar Internet e recorrer a cvs para fazer-nos com eles. Se não sabes como fazê-lo, podes passar-te por http ://www.eldemonio.org/docs/freebsd/make.html e, ou bem ler inteiro o documento (coisa que recomendo encarecidamente pois não tem desperdício), ou bem ir diretamente ao apartado 5 em onde se fala concretamente de como atualizar os ports. Neste caso concreto precisamos ao menos os ports relativos a mail.

Compilando sendmail

Situa-te no diretório /usr/ports/mail/sendmail (se deixaste todo por defeito, e se não o ajusta a teu caso concreto) e edita o fichero Makefile que ali encontrarás.

Procura uma linha que põe: SENDMAIL_WITH_SASL=yes e se está comentada (que é o normal) descoméntala, de forma que quando se compile se inclua o suporte para SASL, pois o precisaremos.

Agora é o momento de escrever:

# make 

Isto fará que comece o processo de compilação. É normal que para poder realizá-lo devam obter-se alguns ports mais, mas a máquina só se encarregará de obtê-los.

Uma vez terminada a compilação e se não teve erros, bastará com que escrevas:

# make install 

Isto instalará o novo sendmail. Isso se, ao menos em meu caso concreto a localização do novo sendmail não era a mesma que tinha o que vinha por defeito. Ainda que num princípio pensei em mover a mão o novo e eliminar o antigo, logo pensei que quiçá não estaria demais deixar o antigo por se talvez, e retocando o fichero /etc/mail/mailer.conf corrigi a nova rota para sendmail. Eu te recomendaria fazer o mesmo, pois não custa apenas trabalho. Para ser mais concretos, em meu fichero mailer.conf dizia que sendmail (e todos os "alias" que tem) estavam em usr //libexec/sendmail/sendmail enquanto o recém compilado estava em usr //local/sbin/sendmail  (sobre este detalhe podes ler ao final algumas aportações que recebi).

Retocando a configuração de sendmail

Bueno, pois feito o mais difícil, agora fica a parte mais singela. Assegura-te de que no fichero /etc/access não tens nenhuma linha de RELAY . Isto é fácil, se queres, basta apenas que não tenhas nenhuma linha em etc //access (só com que exista o fichero já é suficiente).

Agora é o turno do fichero tumaquina.mc. Como?, Que não tens um fichero como esse?. Pois não importa, por defeito FreeBSD usará o fichero freebsd.mc que seguro que tens em etc //mail. Se queres ter um fichero mc próprio, refiro-me a que se chame tumaquina.mc basta apenas que o crês -copiando por exemplo o ffreebsd.mc - e que logo em etc //make.conf adiciones a seguinte linha (por certo, se não existe /etc/make.conf não duvides em criá-lo):

SENDMAIL_MC=/etc/mail/tumaquina.mc

É mais, se lês a documentação verás que há outro fichero chamado freebsd.submit.mc com o que se pode fazer o mesmo, ainda que por agora não nos fará defeituosa. Bueno, ao que íamos, no fichero tumáquina.mc (ou freebsd.mc) adiciona as seguintes linhas:

define(`confAUTH_OPTIONS', `A')dnl
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

Fixa-te bem no sentido das comillas. As primeiras se obtêm pulsando a tecla que há à direita da P (no teclado espanhol, claro) e as segundas estão justo à direita da tecla 0

Outros ficheros que retocar

Ainda faltam um par de ficheros mais onde "retocar". Um é /etc/pam.conf e nele deves adicionar o seguinte:

smtp   auth     required    pam_unix.so   try_first_pass
smtp   account  required    pam_unix.so   try_first_pass

e o outro é /usr/local/lib/sasl/Sendmail.conf (olho! a S em maiúscula) e basta apenas que tenha uma única linha como esta:

pwcheck_method: pam

Agora a pôr todo em marcha

Bueno, pois por fim está todo. É o momento de situar-se em etc //mail e teclear:

# make all 

Isto regenerará todos os ficheros necessários para sendmail (sendmail usa, em lugar de ficheros de texto simplones como os que retocámos, outros mais estranhos -dá um vistazo a qualquer fichero terrminado em cf e saberás ao que me refiro- ).

Se todo tem ido bem é o momento de fazer:

# make install
# make stop 
# make start 

e deveria parar-se teu antigo sendmail sem suporte para autenticación e arrancar o novo com o suporte para autenticación. Podes comprovar que é assim fazendo o telnet tumaquina.com 25 que te dizia ao princípio e comprovar agora o que te contesta.

A prova de fogo

Já só fica tentar por exemplo, desde uma máquina Windows com Outlook e conectado a Internet por meio de um provedor qualquer, configurar como servo de correio saliente a máquina FreeBSD e isso se, sem esquecer ativar a casinha Meu servo requer autenticación ao configurar a conta de correio, ver que tal funciona.

Agradecimientos

Ainda que já se o disse a ele em "direto", crio que o trabalho de koji @ciberteca.com ao criar o documento http://www.eldemonio.org/docs/freebsd/make.html é singelamente extraordinário. Insisto em recomendar sua leitura para atualizar FreeBSD por Internet automaticamente e não só para os ports como eu comentava mais arriba.

Também é muito recomendável a página http://www.linux-sxs.org/smailauth.html pois quase todo o que aqui conto, já o contou [email protected] , ainda que a meu me parece que está mais enfocado a Linux…

Aportações

Raúl Romero do grupo BOSC me fez chegar o seguinte comentário que me parece interessante incluir. Justo após compilar sendmail eu dizia mais arriba do que era necessário "retocar" o fichero /etc/mail/mailer.conf para fazer que "assinalasse" para o novo sendmail, pois o antigo estava em outra localização. Raúl me comenta que se não se quer fazer esta operação "a mão" como eu propunha, ele comprovou que é possível teclear desde /usr/ports/sendmail

# make mailer.conf

para que não seja necessário "editar" as rotas e que seja o próprio make o que o faça automaticamente. Ainda que pessoalmente não o comprovei, esta idéia de Raúl me parece que poderia simplificar algo o processo e evitar possíveis erros de tecleo. Obrigado Raúl.

 


Emilio Florido ([email protected])
Hosted by www.Geocities.ws

1