sábado, 15 de março de 2008

Openfire: como bloquear usuários MSN usando o Gateway IM e o Packet Filter

Uma pergunta que muitas vezes me fazem é: Usando o transporte MSN no Openfire como posso fazer para liberar o usuário X para falar com somente alguns contatos do MSN, já que o padrão é que ele possa falar com todos ?

Até hoje eu ainda não tinha respostas para essa pergunta, apesar de ter uma noção de como fazer, principalmente depois que me indicaram o plugin Packet Filter. Só que hoje resolvi testar o mesmo e encontrei uma forma de resolver isso.

O que faz o plugin Packet Filter ?
O Packet Filter é uma espécie de "iptables" para Openfire. Ele permite que você aceite, rejeite ou descarte vários tipos de pacotes XMPP baseado em regras que você pode estabelecer.

É mais ou menos assim: você pode dizer que o usuário fulano não pode enviar nem receber mensagens do usuário ciclano, ou que o grupo contabilidade pode mandar e receber mensagens do grupo diretoria, mas não do grupo rh, e por aí vai.

Vendo essas features imaginei que fosse de alguma forma possível usar o recurso para filtrar os contatos MSN (ou ICQ, ou AIM, ou o protocolo que for).

Bem, descobri que É POSSÍVEL sim, mas que é um trabalho árduo pelo menos da forma que estou implementando as regras. A forma de implementação padrão obriga que os filtros sejam feitos conta a conta e para que o mesmo funcione da forma que eu implementei você tem de liberar também um a um os contatos para qual seu usuário pode enviar/receber as mensagens (inclusive os contatos Jabber do servidor local). Ou seja, numa instalação com muitos usuários usando o transporte MSN isso pode ser inviável de gerenciar/administrar.

Mas porque isso é trabalhoso ?
Porque na realidade o packet filter não foi feito para trabalhar com os transportes, mas sim com contas locais. Mas já que no Openfire, todos os contatos de um transporte tem um JID válido você pode usar o plugin para isso também.

Você pode explicar isso melhor ?
Cada usuário do Openfire ganha um JID, que é a identificação do usuário para o servidor. No meu servidor de testes, chamado openfire.inet, meu usuário marcelo responde pelo JID marcelo@openfire.inet.

Agora vejamos o caso do transporte MSN: ao vincular minha conta local Jabber (marcelo@openfire.inet) a uma conta MSN usando o plugin Gateway IM, todos meus contatos MSN ganharam também um JID válido. Então, por exemplo, o meu contato marceloterres@dominio.com passou a ter um JID local chamado marceloterres\40dominio.com@msn.openfire.inet.

Agora que ele tem um JID, eu posso usá-lo para criar regras no Packet Filter. :-)

Mas de que forma o packet filter será eficaz ? Como posso implementá-lo ?
A melhor forma que encontrei até o momento é a seguinte:
  • em primeiro lugar você deve liberar todas os contatos que você quer permitir para o usuário (inclusive os contatos do servidor local e não só os do transporte MSN). A liberação é uma via de mão dupla, pois você precisa liberar o envio e precisa também liberar o recebimento de mensagens para cada contato do usuário (a não ser é claro que você queira que algum contato do usuário só possa mandar mensagens e não receber e vice versa).
  • em segundo lugar você deve criar 2 regras dizendo que os pacotes de mensagens de quaisquer outros usuários serão rejeitados (ATENÇÃO: para essas regras use só os pacotes de mensagens, porque se você usar os pacotes do tipo any (quaisquer) o usuário não conseguirá nem logar no servidor).
IMPORTANTE: O packet filter, assim como o Iptables, usa precedência para as regras, por isso a primeira regra que fechar é a que vale. Dessa forma, coloque antes as regras de liberação e depois as regras de bloqueio.

Tem um exemplo prático ?
A imagem abaixo ilustra melhor a questão (clique nela para ampliar e entender).

Nesse servidor de testes (openfire.inet) o usuário marcelo@openfire.inet pode mandar e receber mensagens para/do usuário local fulano (fulano@openfire.inet) e também do seu contato MSN (marceloterres@dominio.com). Todos as mensagens enviadas/recebidas de seus demais contatos serão rejeitadas, como pode ser visto nas 2 últimas linhas.


Isso não impede que o usuário veja todos seus contatos que estiverem online e nem que eles o vejam também, mas caso o usuário tente mandar uma mensagem para um contato bloqueado o servidor Openfire informa que a mensagem foi rejeitada (uma forma de resolver a questão da visibilidade seria rejeitar todos os pacotes (any) de cada contato bloqueado, mas aí isso teria de ser feito contato a contato, ou seja, mais trabalho manual).

Acredito que a solução acima não seja a mais elegante e mais simples mas de momento foi a forma que encontrei para resolver a questão.

Talvez em breve tenhamos um plugin só para isso, ou quem sabe o próprio Gateway IM não venha a implementar esse recurso, mas para quem não pode esperar, é uma solução que pode ser implementada agora.

PS: caso tenha outra sugestões de implementação, por favor poste aqui.

UPDATE (13/11/2008): Não deixem de ler o comentário de Sarunas, pois o mesmo parece simplificar e muito o uso do Packet Filter. Eu ainda não tive tempo de testá-lo, mas assim que for possível irei fazer, e conforme também vá recebendo feedback de outras pessoas, vou postar mais sobre isso aqui.


Leia também:

34 comentários:

  1. Fala Marcelo, parabens pelo artigo cara!!! De fato bastante trabalhoso, mas com uma funcionalidade excelente. É praticamente o mesmo trabalho que faz o appliance do BRA para MSN. Vou ver se consigo tempo para implementar e testar. Abraços.

    Cássio Rosas,

    ResponderExcluir
  2. Obrigado ! :-)

    Depois que você testar poste aqui suas impressões por favor.

    []s

    ResponderExcluir
  3. Cara não sei se pode servir pra voce, mas achei a alguns dias atrás esse projeto aqui http://sourceforge.net/projects/msn-proxy

    Não sei se você já conhece também, mas aí está minha contribuição, talvez alguém querendo bloquear o msn o msn-proxy ajude.

    ResponderExcluir
  4. Obrigado pela dica.

    Na realidade o que eu procurava era uma forma de fazer isso usando transporte MSN sobre o Jabber (XMPP) no servidor Openfire.

    Valeu.

    ResponderExcluir
  5. Olá marcelo... Parabens pelo seu artigo... muito legal... mas eu estou tendo problemas em implementar as regras... ao implementa-las... eu não consigo enviar nem receber mensagens, implementando da maneira que vc explicou... o que poderia ser...
    ?

    ResponderExcluir
  6. Obrigado pelo elogio :-)

    Quanto ao seu problema. Como você fez a regra ? Poderia fazer um snapshot (como eu fiz) e mandar para mim por e-mail ? (mhterres@yahoo.com).

    Assim quem sabe eu possa verificar melhor o que está havendo.

    Um abraço.

    ResponderExcluir
  7. ola Marcelo,

    fiz as regras e testando com os usuarios
    do proprio openfire vai tranquilo,
    o problema que aparentemente ele nao esta
    entendendo os usuarios do msn.

    Ou seja, os ususarios do msn aparecem e
    funcionanm normalmente dentro de minha conta no openfire

    ResponderExcluir
  8. Oi.

    Te inscreve na lista Openfire-BR e manda um snapshot das tuas regras para que a gente possa dar uma olhada.

    []s

    ResponderExcluir
  9. Olá Marcelo,

    Muito bom o seu artigo.

    Se vc puder me ajudar, gostaria de umas dicas para criar grupos no openfire/spark importando estes grupos do AD.

    Abraços.

    Aldino Brasil de Souza.

    ResponderExcluir
  10. Oi Aldino.

    Você pode mandar suas dúvidas para meu e-mail ou então assinar a lista Openfire-Br, ok ?

    Um abraço,

    ResponderExcluir
  11. Marcelo, configurei recentemente o Openfire, mas não encontro nada referente ao utilizar o msn por ele, gostaria de saber como faço para deixar apenas usuários do Openfire utilize o msn, poderia me ajudar, onde encontro, como configurar o servidor e o os clientes?
    Agradeço

    ResponderExcluir
  12. Marcelo, configurei recentemente o Openfire, mas não encontro nada referente ao utilizar o msn por ele, gostaria de saber como faço para deixar apenas usuários do Openfire utilize o msn, poderia me ajudar, onde encontro, como configurar o servidor e o os clientes?
    Agradeco

    ResponderExcluir
  13. Olá.

    Para isso você deve fazer 2 coisas:

    1) Bloquear no firewall de sua empresa o FORWARD da porta 1863 (exceto para o IP do servidor Openfire).

    2) Configurar no Openfire o plugin Gateway-IM. Dê uma olhada nesse link para ver se te ajuda.

    Quanto a configurar os clientes, dependendo do cliente que você usar não tem muito o que ser feito. Por exemplo, se você usar o Pidgin, quando o usuário logar, todos os contatos MSN dele já irão aparecer na lista. Os demais clientes tem de ver caso a caso.

    Ah, não esqueça de se inscrever na lista Openfire-BR, ok ?

    []s

    ResponderExcluir
  14. Olá Marcelo. Gostei muito do artigo, pois quebrei a cabeça alguns dias tentando fazer isso mas não consegui. Na verdade eu estava fazendo um caminho inverso ao seu. Ao invés de bloquear tudo e ir liberando um a um (inclusive os contatos locais), eu tentava liberar apenas os contatos externos (do msn) e bloqueava o envio de mensagens apenas para o item transporte. Amanhã mesmo eu tento configurar o PF da maneira que você sugeriu e posto aqui se funcionou ou não.

    Abraços

    Leonardo (leonardo@londrina.net

    ResponderExcluir
  15. Ok,

    fico no aguardo do resultado de seus testes.

    []s

    ResponderExcluir
  16. olá Marcelo!
    ja me inscrevi no grupo de e-mail, mas to com um problema bem simples: eu adicionei os usuarios do openfire com seus contatos msn. Depois eu apaguei os contatos msn que o usuário nao precisa falar, até aí tudo bem, porém quando o usuário se desconecta e conecta novamente, aquele contato que eu proibi voltou a aparecer. o que poderia ser?
    grato!

    ResponderExcluir
  17. Olá Rod.

    Quando você diz que apagou os contatos msn, a que você se refere especificamente ???

    Não te entendi. Apagou onde ?

    []s

    ResponderExcluir
  18. oi marcelo!
    me perdoe pela falta de informação.
    mas sobre os contatos através do gateway im, tem a opçao do usuário chamada roster.
    nesse menu roster aparece todos os contatos do msn do usuario@openfire, e destes contatos msn, desejo eliminar alguns da lista de contatos do cliente pidgin.
    quando elimino aquele contato do menu roster, realmente elimina da lista do cliente pidgin, porem quando este cliente@openfire refaz a conexão num outro momento, aquele contato do roster volta a aparecer.
    ja passou por isto?

    ResponderExcluir
  19. Agora entendi.

    Eu nunca tinha tentando esse método, e me deparei com o mesmo problema que o teu. Quando o usuário loga de novo, os contatos voltam (até porque a lista de contatos fica nos servidores da rede MSN).

    Não sei se isso funciona como tu quer, mas seria muito interessante. De qualquer maneira, isso não resolveria de forma completa o problema, pois se o usuário adicionasse um novo contato, tu teria de ir lá apagar o mesmo. Ou seja, seria uma briga da gato e rato.

    Por favor, poste na lista essa questão, pois seria um ponto interessante para se discutir e muitas cabeças pensam melhor do que duas. :-)

    []s

    ResponderExcluir
  20. Boa tarde!

    Já faz um tempo que escrevi um plugin para openfire que faz o log de conversas e cria regras para habilitação/negação de conversa entre usuários e grupo de usuários.

    Funciona basicamente da mesma forma citada acima, como regras de um firewall, onde a mensagem passa por cada filtro até ser liberada/negada por alguma regra ou, em caso de nao haver regra para os usuários da mensagem, dela ser descartada.

    Para mais detalhes, entrem em contato via msn:

    fspanont@hotmail.com

    Grande abraço!

    ResponderExcluir
  21. Olá.

    Muito interessante isso. Com relação aos logs das conversas, o Monitoring Service já atende relativamente bem, mas quanto ao bloqueio isso é realmente muito bom.

    Ele bloqueia também as contas dos transportes ?

    Você poderia disponibilizar essa plugin em algum site e divulgá-lo na lista do Openfire_br. Isso é viável ?

    Um abraço e obrigado pelo comentário.

    ResponderExcluir
  22. As someone who spent a lot of time trying to figure out how to set up proper rules, which don't require explicitly defining who can talk to who:

    start of the rule with this to allow the client to login to the gateway:

    pass from any to msn.my_server type any

    now create the rules:

    pass from some_group to some_msn\40hotmail.com@msn.my_server type any
    pass from some_user to some_msn2\40hotmail.com@msn.my_server type any

    Finally, block everything off which does not match these:

    drop from any to *@msn.my_server type any

    ResponderExcluir
  23. Thanks a lot for your help.

    Regards,

    Marcelo Terres

    ResponderExcluir
  24. Marcelo,
    Uso a versão do Opendire que já vem com o Packet Filter como opção nativa para instalação. No entanto eu instalo normal, mas não consigo salvar as regras que crio. Você já teve esse problema?
    Em versões anteriores eu percebi isso também.

    ResponderExcluir
  25. Olá Fabrício.

    Nunca passei por tal problema. Você pode tentar ver na Lista do Openfire-BR se mais alguém já teve problema semelhante.

    []s

    ResponderExcluir
  26. Marcelo instalei o Openfire e instalei os plugins packet Filter, Gateway Im e Monitoring Server eu criei uma conta para eu fazer teste e instalei o Client (Spark)na minha aestação de trabalho, mas não sei como acessar o packet Filter para tentar fazer regras para bloquear e liberar contatos de MSN , pois sei que é bem trabalhoso mas tem como fazer isso pelo Packet Filter correto ?

    eu entro no https://ip do meu servidor:9091 e não acho onde fica o packet filter eu uso o Openfire em um Server 2003.

    Obrigado

    ResponderExcluir
  27. Marcelo

    Gostaria de uma ajuda sua, eu instalei o Openfire em um servidor Windows 2003, instalei os plugins Gateway Im, Packet Filter e Monitoring Service na minha estação de trabalho eu instalei o Spark, no Openfire gateways eu marquei a opção MSN e permissões eu marquei Esses usuários e/ou grupos podem se registrar, e coloquei meu usuário. Até ai tudo beleza eu me conecto via spark e consigo acessar o MSN, mas eu gostaria de começar a fazer as regras para liberar e bloquear os contatos que os funcionários vão ter acesso ao MSN, sei que da para se fazer isso pelo Packet Filter e que é bem trabalhoso, pois tem que liberar para cada usuário o contato que vc deseja que ele consiga adicionar no MSN, o problema é achar onde fazer isso? Como eu acesso o packet filter? Já me matei aqui e não acho vc poderia me ajudar a acessar e onde eu crio as regras?

    Grato

    ResponderExcluir
  28. Vá em Configurações do Servidor e irá aparecer a opção Packet Filter no menu lateral esquerdo.

    []s

    ResponderExcluir
  29. Pessoal, to testando aqui da seguinte forma:
    criei varias regras dizendo que grupo fulano pode falar com grupo ciclano.Depois disso criei as regras dos MSN
    E finalmente criei uma regra negando tudo.
    Deu um poudo de trabalho, porem fica viavel ja que nao vou criar mais grupos nenhum no meu openfire

    ResponderExcluir
  30. Em primeiro lugar BOA DICA.
    Agora gostaria de saber se teria como bloquear por exemplo.

    user fulano@meuopenfire.com de mandar mensagem para um determinado dominio tipo:

    fulano@meuopenfire.com DROP @hotmail.com

    ResponderExcluir
  31. Nunca fiz algo assim, mas já tentaste colocar no To ou no From somente o domínio (hotmail.com) ?

    []s

    ResponderExcluir
  32. Como solução rápida e eficaz pode-se usar o mecanismo de ordenação de regra a nosso favor conforme o exemplo abaixo:
    Crie um grupo de usuários locais (Grupo_Usuario_Local);
    Crie um grupo contendo as contas de msn que serão permitidas para conversação (Grupo_Lista_MSN_Permitido);
    Em Packet Filter Rules crie as seguintes regras abaixo:
    Pass Grupo_Usuario_Local Grupo_Lista_MSN_Permitido Any true
    Pass Grupo_Lista_MSN_Permitido Grupo_Usuario_Local Any true
    Drop Transporte_MSN Any Any true
    Drop Any Transporte_MSN Any true
    OBS: Isto é só um exemplo podendo ser modificado conforme a necessidade.
    Sds,
    Alex Cerqueira

    ResponderExcluir
  33. Caro amigo,

    Instalei o plugin do Packet Filter, porém, quando vou cadastrar uma regra simplesmente nao acontece nada, fica em branco e nao cria a regra. Pode me ajudar em algo??

    Att,

    Allan Santos

    ResponderExcluir
  34. Olá.

    Qual a versão do Openfire em uso ?

    Você não encontrou erros nos logs do mesmo ?

    []s

    ResponderExcluir