[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Postfix



Olá,

Antes de mais nada, por favor, não envie cópias para mim de suas
postagens na lista. Estou inscrito na lista, por isso respondi sua
mensagem inicial :-)

On Sat, Dec 27, 2003 at 09:01:35AM -0200, Ricardo Castanheira wrote:
> Andre obrigado pela ajuda, mas na verdade eu queira por exemplo bloquear
> somente um endereço especifico e não todo mundo.

É possível fazer sim, mas de uma maneira que envolve uma configuração um
pouco mais complicada. Eu consegui fazer isso usando classes de
restrição do Postfix. Trata-se de um recurso avançado bastante útil que
lhe permite criar seus próprios parâmetros de configuração e atribuir
valores aos mesmos.

Logicamente, podem existir inúmeras outras maneiras de fazer isso, mas
vou dizer como fiz.

A coisa toda gira em torno da maneira como o parâmetro
smtpd_sender_restrictions funciona, ou seja, com o esquema de
"first match". Você define uma lista de restrições como valor para esse
parâmetro e a primeira restrição que casar com a mensagem ou conexão
sendo analisada recebe a restrição com o qual ela casou.

Por exemplo, não adianta tentar definir que um ou outro endereço de seu
domínio deve ser bloqueado se você tem como primeiro valor do parâmetro
smtpd_sender_restrictions o valor permit_mynetworks, por exemplo.

Como o permit_mynetworks checa os valores do parâmetro mynetworks e
permite o relay para todas as redes listadas nesse parâmetro, sua
restrição não adiantaria. Ou seja, você disse primeiro que liberaria
toda a sua rede através da especificação do valor permit_mynetworks no
parâmetro smtpd_sender_restrictions e foi isso que o Postfix fez,
liberou sua rede interna completamente. Não importa se depois do valor
permit_mynetworks você tenha especificado quaisquer outras restrições :
a primeira é que vale (first match).

Em meu setup, possui uma série adicionais de condições a serem checadas
no parâmetro smtpd_sender_restrictions, mas, para efeitos didáticos, vou
usar o seguinte :

smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/remetentes_internos, permit_mynetworks, check_relay_domains

A linha acima diz que primeiro o Postfix (na verdade, o daemon smtpd do
Postfix) deve checar o arquivo /etc/postfix/remetentes_internos (na
verdade, o arquivo será /etc/postfix/remetentes_internos.db, um mapa
hash criado com o comando postmap)  antes de mais nada e verificar as
restrições contidas nesse arquivo. Se nenhuma das restrições contidas no
arquivo casar com o caso sendo analisado, continue checando se a conexão
SMTP é originada da rede interna (permit_mynetworks) e, por fim, cheque
se o domínio usado pelo remetente é um dos domínios para os quais
fazemos relay (check_relay_domains consulta o valor do parâmetro
relay_domains, portanto, tenha certeza de tê-lo definido corretamente).

O contéudo do arquivo /etc/postfix/remetentes_internos deve ter algo
como o seguinte :

usuariobloqueado1@dominiointerno.com.br	chechar_interno
usuariobloqueado2@dominiointerno.com.br	chechar_interno

Isso mesmo, ao invés de usar OK, REJECT ou qualquer outra restrição,
estamos indicando uma restrição chamada "checar_interno", a qual vamos
definir como uma classe de restrição. Para definí-la, no arquivo
/etc/postfix/main.cf use :

smtpd_restriction_classes = checar_interno

Pronto, aqui você diz que uma nova classe de restrição de nome
"checar_interno" existe. Mas o que ela faz ? Fácil, vamos definir isso
também. Veja a seguir :

checar_interno = check_recipient_access hash:/etc/postfix/destinatarios_internos, reject

Pronto. Definimos o que nossa classe de restrição fará. Vejamos o
arquivo /etc/postfix/destinatarios_internos :

dominiointerno.com.br		OK
*												REJECT

Isso. No final das contas, a restrição "checar_interno" diz que se o
domínio do destinatário usado for dominiointerno.com.br, a mensagem
passará sem problemas pelo Postfix. Caso contrário, ela será rejeitada.

Neste ponto, a configuração já está completa. Você só precisa gerar os
mapas de lookup e dar um reload no Postfix. Use os comandos abaixo para
isso :

postmap /etc/posfix/remetentes_internos
postmap /etc/postfix/destinatarios_internos
postfix reload

Pronto. Tudo funcionando (pelo menos em meus testes). Isso tudo é
necessário porque você quer restringir seletivamente usuários válidos de
seu domínio válido de forma que eles somente enviem mensagens para os
outros usuários de seu próprio domínio e não para usuários de outros
domínios externos.

Fluxo da mensagem (ou como ela é bloqueada)
===========================================

Seu usuário interno usuariobloqueado1@dominiointerno.com.br envia uma
mensagem para um usuário externo usuarioexterno@dominioexterno.com.br.
A mensagem entra no Postfix pelo daemon smtpd e, portanto, as restrições
definidas em pelo parãmetro smtpd_sender_restrictions serão analisadas.

Primeiro, a restrição check_sender_access é analisada. Ela ponta para um
arquivo de nome /etc/postfix/remtentes_internos. O mapa hash desse
arquivo (/etc/postfix/remetentes_internos.db, criado com o postmap) é
analisado e o postfix encontra uma entrada correspondente ao seu usuário
interno com o seguinte :

usuariobloqueado1@dominiointerno.com.br	chechar_interno

Ok, então quer dizer que para esse usuário, a restrição "checar_interno"
deve ser executada/verificada. O Postfix verifica então que a restrição
"checar_interno" é uma classe de restrição que diz o seguinte :

checar_interno = check_recipient_access hash:/etc/postfix/destinatarios_internos, reject

Ok, então ele checa o arquivo /etc/postfix/destinatarios_internos
(lembre-se, na verdade, ele estará checando o mapa hash
/etc/postfix/destinatarios_internos.db) e procura uma restrição que
case.

Na primeira linha, ele encontra :

dominiointerno.com.br		OK

Ok, para qualquer usuário do domínio interno a mensagem pode ser
entregue sem problemas. Hmm, mas essa mensagem foi enviada para o
usuário externo usuarioexterno@dominioexterno.com.br.

Ok, não casou. O Postfix continua analisando o restante do arquivo
/etc/postfix/destinatarios_internos.db. A próxima entrada diz :

*												REJECT

Opa, essa é forte :-) Para qualquer coisa, rejeite. Ok, o Postfix cumpre
suas ordens e rejeita a mensagem.

Repare que estamos garantindo que o usuário consiga enviar mensagens
para outros usuários do domínio interno somente listando o mesmo com a
restrição (liberação na verdade) OK na primeira linha do arquivo. Caso
existam mais domínios internos, os mesmos devem ser listados também no
começo do arquivo e a restrição de rejeição total deve ser listado como
última restrição.


Bom, espero que tenha entendido. Mensagem grande, mas explicado.

Atenciosamente,

-- 
++----------------------------------------------------------------------++
||  André Luís Lopes                 andrelop@debian.org                ||
||                                   http://people.debian.org/~andrelop ||
||  Debian-BR Project                http://www.debian-br.org           ||
||  Public GPG KeyID                 9D1B82F6                           ||

Attachment: signature.asc
Description: Digital signature


Reply to: