FUG-BR / Grupo Brasileiro de Usuarios de FreeBSD - Configurando Servidor Jabber + LDAP + SSL + MySQL
 
08.07  
Inicio arrow Artigos arrow Configurando Servidor Jabber + LDAP + SSL + MySQL
Principal
Inicio
Noticias
Artigos
Regras da Lista
Assinar a Lista
Histrico da Lista
Forum
Keyserver
PC-BSD: Artigos
PC-BSD: Notcias
Galeria de Imagens
Contador Usurios FUG
FUGs Estaduais
Downloads
Enquetes
FAQ
Resumo do Site
Links
Pesquisar
Contato
Sobre a FUG-BR
RSS / Twitter
-
DOC-BR (FUG BR)
Introduo
Projeto DOC-BR
Handbook
FAQ Oficial
-
+ Noticias
Alertas de Seguranca
Alertas em Ports
BSD em Geral
DaemonNews (Ingles)
MyFreeBSD
Todas Categorias
-
Login
Nome de Usurio

Senha

Lembrar login
Esqueceu sua senha?
Sem conta? Crie uma


Configurando Servidor Jabber + LDAP + SSL + MySQL PDF Imprimir E-mail
Por Danton Dorati   
27/03/2007
jabberDanton Dorati mais uma vez contribuiu com um belo artigo, que com certeza irá ajudar boa parte dos usuários da comunidade BSD. Com um artigo bem detalhado, ele deixa claro sobre a implementação de um Servidor de Mensagens Instatâneas muito utilizado, o Jabber, principalmente em intranets de empresas de diversos segmentos, para comunicação interna dos usuários.
Jabber é um protocolo aberto, com bases XML, para sistemas de mensagens instantâneas. Software com base nesse protocolo soa distribuído em milhares de servidores através da internet, e usado por cerca de dez milhões de pessoas em todo mundo, de acordo com a Fundação Jabber Software, para mais informações veja o link completo.

Softwares utilizados no ambiente deste artigo:

·      FreeBSD 6.2 – RELEASE-p2 (STABLE)

·      Jabberd-2.0.11_2

·      OpenLDAP-Server-2.3.34

·      OpenSSL 0.9.7e-p1

·      MySQL-Client-5.0.33

·      MySQL-Server-5.0.33

·      BSDpan-Perl-LDAP-0.34

·      p5-DBD-MySQL-4.001

 

Atualizando seu ports

 
# portsnap fetch extract
# portsnap update

É necessário que sua coleção ports esteja atualizada para que utilize as ultimas versões dos pacotes, pois pode haver também correções de bugs e novos patch's, assim nosso servidor estará mais seguro e mais eficiente sem possíveis erros.

Definindo um hostname para seu servidor LDAP e MySQL

# ee /etc/hosts

Esta configuração possibilita que você atribua um hostname + domain (FQDN = Fully Qualified Domain Name) a seu IP, assim não precisando colocar números, ficando assim com uma aparência mais agradável e mais funcional, pois se decora com mais facilidade nomes.

O arquivo terá a seguinte sintaxe:
127.0.0.1                    localhost.domain.org localhost
IP-do-FreBSD              hostname.domain.org hostname
 
 

Instalando o jabberd versão 2 via ports

 
# cd /usr/ports/net-im/jabberd
# make install clean


Marque APENAS a opção de Suporte ao MySQL.
Depois de finalizada a instalação do Servidor Jabber vamos passar para instalação e configuração do LDAP. Você deve estar se perguntando "porque não configurar o Jabberd agora?"
Logo à frente tenho certeza que entenderá o motivo.

Instalando o OpenLDAP via ports e configurando-o

# cd /usr/ports/net/openldap24-server
# make install clean

Marque as seguintes opções: Suporte à TCP Wrapper, Suporte à BerkeleyDB e SLURPD.
Após o termino da compilação e da instalação vamos gerar chaves de criptografia e uma senha encriptada.

# cd /usr/local/etc/openldap

Certificado para a função "Server"

# openssl genrsa -des3 -out server.key 4096

Enter pass phrase for server.key: <Digite a senha que deseja colocar em slapd.conf.> 

Verifying - Enter pass phrase for server.key: < Redigite a mesma senha. >

# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key: <Novamente a mesma senha> 

 

# openssl req -new -key server.key -out server.csr 

      You are about to be asked to enter information that will be incorporated

      into your certificate request.

      What you are about to enter is what is called a Distinguished Name or a DN.

      There are quite a few fields but you can leave some blank

      For some fields there will be a default value,

      If you enter '.', the field will be left blank.

      -----

      Country Name (2 letter code) [AU]:BR
      State or Province Name (full name) [Some-State]:SP

      Locality Name (eg, city) []:Bebedouro

      Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA

      Organizational Unit Name (eg, section) []: Digite <ENTER>

      Common Name (eg, YOUR name) []:urisso
      Email Address []: 
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo

      Please enter the following 'extra' attributes

      to be sent with your certificate request

      A challenge password []:system

      An optional company name []: Digite <ENTER>

 
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.csr

      Signature ok

  subject=/C=BR/ST=SP/L=Bebedouro/O=EMPRESA/CN=urisso/emailAddress= Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo

      Getting Private key

  

Certificado para a função "client"

# openssl genrsa -des3 -out client.key 1024

 Enter pass phrase for client.key: <Digite a senha usada anteriormente.>

 Verifying - Enter pass phrase for client.key:<Mais uma vez a mesma senha.>

# openssl rsa -in client.key -out client.key

Enter pass phrase for client.key:<Você deve estar cansado já de ouvir falar pra digitar a senha, mas faça isso agora novamente.>

writing RSA key

 

# openssl req -new -key client.key -out client.csr

      You are about to be asked to enter information that will be incorporated

      into your certificate request.

      What you are about to enter is what is called a Distinguished Name or a DN.

      There are quite a few fields but you can leave some blank

      For some fields there will be a default value,

      If you enter '.', the field will be left blank.

      ----- 

      Country Name (2 letter code) [AU]:BR
      State or Province Name (full name) [Some-State]:SP
      Locality Name (eg, city) []:Bebedouro
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA

      Organizational Unit Name (eg, section) []: Digite <ENTER>

      Common Name (eg, YOUR name) []:urisso
      Email Address []:
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo

      Please enter the following 'extra' attributes

      o be sent with your certificate request

      A challenge password []:system

      An optional company name []:  Digite <ENTER>
 

# openssl x509 -req -days 365 -in client.csr -signkey client.key -out client.csr

      Signature ok

 subject=/C=BR/ST=SP/L=Bebedouro/O=EMPRESA/CN=urisso/emailAddress= Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo

      Getting Private key

Criando uma senha encriptada

# slappasswd -s SENHA

{SSHA}zK+i59AN3hXRF3EnSxgwQKOfVKaXrnLo

Arquivo de configuração  do servidor LDAP

#############################################################
# /usr/local/etc/openldap/slapd.conf

# Veja slapd.conf(5) para mais detalhes e opção de configuração.
Include          /usr/local/etc/openldap/schema/core.schema
include          /usr/local/etc/openldap/schema/cosine.schema
include          /usr/local/etc/openldap/schema/inetorgperson.schema

referral          ldaps://hostname.domain.org

pidfile            /var/run/openldap/slapd.pid

argsfile          /var/run/openldap/slapd.args

 

#Modulos

modulepath    /usr/local/libexec/openldap

moduleload     back_bdb

moduleload     back_ldap
 

# Definicoes do banco de dados BDB

database       bdb

suffix            "dc=domain,dc=org" 

rootdn          "cn=urisso,dc=domain,dc=org"

# Não é aconselhável que use senha do tipo clear text.
# Utilize senhas criptografadas, para isso basta copiar
# e colar logo abaixo a chave resultante do comando
# digitado acima ( slappasswd -s SENHA )
rootpw          UA82yYo9+9WBlmuAE20hlqPa0deJxlOn

directory       /var/db/openldap-dataindex

objectClass     eq

# Chave de criptografia do servidor
TLSCertificateFile           /usr/local/etc/openldap/server.csr
TLSCertificateKeyFile      /usr/local/etc/openldap/server.key
TLSVerifyClient 0

#############################################################


Arquivo de configuração do cliente LDAP

 

#############################################################
#/usr/local/etc/openldap/ldap.conf

# Veja ldap.conf(5) para mais detalhes

host        hostname.domain.org

BASE       dc=domain, dc=org

URI         ldaps://hostname.domain.org ldaps://hostname.domain.org:636

port         636

ssl           true

# Chave de criptografia do cliente

TLS_CERT         /usr/local/etc/openldap/client.csr

TLS_KEY          /usr/local/etc/openldap/client.key

TLS_REQCERT     never

SIZELIMIT       12

TIMELIMIT       15

DEREF           never

############################################################

Vamos criar uma base inicial para o LDAP em um arquivo *.ldif onde ficará as informações quando formos carregar pela primeira vez o DB.

# touch base.ldif

O arquivo terá o conteúdo semelhante as este:

  

#############################################################
dn: dc=domain,dc=org

dc: domain

objectClass: top

objectClass: domain

 

dn: cn=urisso,dc=domain,dc=org

objectclass: organizationalRole
cn: urisso
#############################################################


Agora basta adicionar o conteúdo do arquivo ldif ao db do slapd com o comando:

 

# /usr/local/libexec/slapd -h "ldaps:///" -4 -d 4 &

# ldapadd -x -D cn=urisso,dc=domain,dc=org -W -f base.ldif -h hostname.domain.org 


Com o comando acima estamos executando o daemon do LDAP (slapd) em modo interativo e debugado em nível 4.

Agora vamos aos testes:

# ldapsearch -x -ZZ -h IP-do-FreeBSD

Caso você tenha configurado seu hostname, altere o comando acima, ao invés de IP-do-FreeBSD coloque hostname.domain.org  

Instalando MySQL via ports e configurando:      

# cd /usr/ports/databases/mysql50-server
# make install clean


Obs: Caso seu shell seja csh, então de um rehash de antes continuar:

Agora é só por o MySQL para funcionar.

Criando as databases do sistema:

# mysql_install_db

Ajustando o dono do diretório do MySQL para o próprio:

# chown -R mysql:mysql /var/db/mysql

Subindo o serviço do MySQL:
    
# mysqld_safe &  

Configurando usuário root no MySQL:     

# /usr/local/bin/mysqladmin -u root password 'crie-sua-senha-do-root'

Preparando o MySQL para receber os dados do Jabberd2. 

Edite o arquivo /usr/local/share/jabberd/db-setup.mysql e adicione as seguintes linhas para o script possa inserir juntamente com sua estrutura de tabelas um novo usuário para acessar sua database. 


O arquivo modificado ficará algo parecido com isso.

CREATE DATABASE jabberd2; 

USE jabberd2; 

GRANT ALL ON jabberd2.* TO jabberd2@localhost IDENTIFIED BY "senha_do_user_jabberd2"; 

... 

 

Depois de fazer a alteração no script basta adicionar a estrutura à DATABASE no MySQL

# mysql -u root -p <  /usr/local/share/jabberd/db-setup.mysql

Configurando o Jabberd2

As configurações que se seguem são especificas para o funcionamento correto do servidor Jabber + LDAP (Pipe script) + SSL + MySQL , logo você notará que algumas linhas não haverão comentários, isso porque não há necessidade de alterar todo o conteúdo dos arquivos padrões, afinal ficaria muito extenso e gastaria um bom tempo para fazê-lo, coisa que não quero e nem posso, afinal estou matando meu serviço para fazer esse artigo e pretendo publicá-lo o mais rápido possível mas não deixando de lado uma boa explicação para "funfar redondinho" em nosso servidor.

Dica: Caso queira ver um uma boa explicação destes edite os arquivos *.conf.dist dentro de /usr/local/etc/jabberd.

Arquivo de configuração do servidor C2S

# cd /usr/local/etc/jabberd
# rm c2s.conf && touch c2s.conf
# chown jabber:jabber c2s.conf
 

  

############################################################
<!-- Configuração do servidor c2s -->
<c2s>
<!-- ID do servidor quando estiver rodando  (padrão: c2s) -->
<id>c2s</id>
<!-- Local onde ficara o arquivo pidfile do servidor c2s --> 

  <pidfile>/var/jabberd/pid/c2s.pid</pidfile> 

<router> 

<ip>127.0.0.1</ip>            <!-- default: 127.0.0.1 --> 

<port>5347</port>            <!-- default: 5347 --> 


<!-- Arquivo que conterá as informações do certificado SSL e chave privada que quando habilitado fará tunnel encriptado. --> 

    <pemfile>/usr/local/etc/jabberd/server.pem</pemfile> 

<retry> 

      <sleep>2</sleep> 

</retry>
</router> 

<!-- Configuração do log - o tipo de log pode ser "syslog", "file" ou "stdout" -->
<log type='syslog'>
<!-- Se usar syslog, aqui será a identificao do log --> 

    <ident>jabberd/c2s</ident> 

    <facility>local3</facility> 

<!-- se usar o "file", aqui você ira setar o nome e o local do arquivo log --> 

    <file>/var/jabberd/log/c2s.log</file> 

</log>

<!-- Configuração do servidor local --> 

<local> 

<id>hostname.domain.org</id> 

<!-- IP que o servidor ouvira (Padrão: 0.0.0.0) -->
<ip>0.0.0.0</ip>
<!-- Porta que o servidor ouvira, ou 0 para desativá-la, mas essa porta não passarão os dados encriptados então vamos desativar. (padrão: 5222) -->
<port>0</port>
<pemfile>/usr/local/etc/jabberd/server.pem</pemfile>

<!-- Porta SSL a qual o servidor jabber ouvira e que os dados encriptados usarão como rota. (padrão: 5223) -->
<ssl-port>5223</ssl-port> 

</local> 

<io> 

    <max_fds>1024</max_fds> 

    <limits> 

      <bytes>0</bytes> 

      <connects>0</connects> 

    </limits> 

     <access> 

 

<!-- Checka a ordem de verificação  (padrão: allow,deny) allow,deny - Check primeiro as "REDEs/IPs" que estão em "allow". --> 

<!-- Depois passa a checar os que estão em "deny". [ deny,allow - Inverso de allow,deny ] -->
<order>allow,deny</order>

<!-- Se a mascara de sub-rede nao for especificada o padrão que o servidor aceita conexões eh 255.255.255.255  -->
<allow ip='0.0.0.0' mask='255.0.0.0'/> 

       <!-- Aceita conexões vindas do IP setado abaixo --> 

      <allow ip='0.0.0.0'/> 

       <!-- Nega acesso ao servidor, os IPs que estiveram setado nessa linha -->  

<deny ip='127.0.0.1' mask='255.0.0.0'/> 

<deny ip='87.65.43.21'/> 

</access> 

    <check> 

      <interval>0</interval> 

      <idle>0</idle> 

      <keepalive>0</keepalive> 

    </check> 

  </io> 

 

   <!-- Configuração de autenticação e registro de users e mensagens no banco de dados --> 

<authreg> 

<!-- Modulo backend para usar --> 

<module>mysql</module>
<!-- Configuração de registro -->
<register> 


<!-- Caso nao queira que  registro dos usuários seja feita automaticamente comente essa linha, mas você terá que ter certo conhecimento nos comandos do --> 

<!-- MySQL e da sua estrutura para que possa registrar os users manualmente -->
<enable/>
<instructions>Coloque um username e um password para registrá-lo.</instructions>  

      <!-- 

      <password/> 

      --> 

    </register> 

    <mechanisms> 

      <traditional> 

        <plain/> 

        <digest/> 

        <zerok/> 

      </traditional> 

      <sasl> 

        <plain/> 

        <digest-md5/> 

        <!-- 

        <anonymous/> 

        --> 

      </sasl> 

    </mechanisms> 

<!-- Configuração do module MySQL --> 

    <mysql> 

<!-- Database server host and port --> 

<host>localhost</host> 
<port>3306</port>

<!-- Nome do DB -->
<dbname>jabberd2</dbname>

<!-- Usuário e senha pra logar no servidor mysql -->
<user>jabberd2</user>
<pass>senha_do_user_jabberd2</pass>
</mysql>

<!-- Configuração do modulo Pipe -->
<pipe>
<!—Script de autenticação -->
<exec>/usr/local/etc/jabberd/pipe-auth.pl</exec>
</pipe>
</authreg></c2s> 

#############################################################

Arquivo de configuração do servidor Session Mamager

# rm sm.conf && touch sm.conf
# chown jabber:jabber sm.conf


 
#############################################################
<!-- Configuração do Session manager--><sm>
<!--   Coloque ai seu hostname -->
<id>hostname.domain.org</id>

<!--   Define onde o pidfile ficara e qual o nome. -->
<pidfile>/var/jabberd/pid/sm.pid</pidfile> 

  <router> 

    <ip>127.0.0.1</ip> 

    <port>5347</port> 

    <pemfile>/usr/local/etc/jabberd/server.pem</pemfile> 

    <retry> 

      <init>3</init> 

      <lost>3</lost> 

      <sleep>2</sleep> 

    </retry> 

  </router> 

 

  <!-- Configuração de log - o método para logar poderá ser "syslog", "file" ou "stdout" --> 

  <log type='syslog'>
<!-- Se usar método syslog, aqui será a identificao do log -->
<ident>jabberd/c2s</ident>
<facility>local3</facility>

<!-- se usar método o "file", aqui você ira setar o nome e o local do arquivo log -->
<file>/var/jabberd/log/c2s.log</file>
</log>

<!-- Configuração do banco de dados-->
<storage>
<driver>mysql</driver>

<!-- Configuracao do driver MySQL  -->
<mysql>
<!-- Servidor e porta do MySQL -->
<host>localhost</host>
<port>3306</port>

<!-- Nome do banco de dados -->
<dbname>jabberd2</dbname>

<!-- Nome do usuário e senha do MySQL -->
<user>jabberd2</user>
<pass>senha_do_user_jabberd2</pass>
<transactions/>
</mysql>
</storage> 

  <aci> 

    <acl type='all'> 

      <jid> Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo </jid

    </acl> 

  </aci> 

 

  <modules> 

    <chain id='sess-start'/> 

    <chain id='sess-end'> 

 

      <module>iq-last</module> 

    </chain> 

    <chain id='in-sess'> 

      <module>validate</module>         <!-- validate packet type --> 

      <module>privacy</module>          <!-- manage privacy lists --> 

      <module>roster</module>           <!-- handle roster get/sets and s10ns --> 

      <module>vacation</module>         <!-- manage vacation settings --> 

      <module>iq-vcard</module>         <!-- store and retrieve the user's vcard --> 

      <module>iq-private</module>       <!-- manage the user's private data store --> 

      <module>disco</module>            <!-- respond to agents requests from sessions --> 

      <module>offline</module> 

      <module>announce</module>         <!-- deliver motd --> 

      <module>presence</module>         <!-- process and distribute presence updates --> 

      <module>deliver</module>          <!-- deliver packets with full jids directly --> 

    </chain> 

 

   <chain id='out-sess'/> 

 

    <chain id='in-router'> 

      <module>session</module>          <!-- perform session actions as required by c2s --> 

      <module>validate&;lt;/module>         <!-- validate packet type --> 

      <module>presence</module>         <!-- drop incoming presence if user not online --> 

      <module>privacy</module> 

    </chain> 

 

    <chain id='out-router'> 

      <module>privacy</module> 

    </chain> 

 

    <chain id='pkt-sm'> 

      <module>iq-last</module>          <!-- return the server uptime --> 

      <module>iq-time</module>          <!-- return the current server time --> 

      <module>iq-version</module>       <!-- return the server name and version --> 

      <module>disco</module> 

      <module>announce</module> 

      <module>help</module>             <!-- resend sm messages to administrators --> 

      <module>echo</module>             <!-- echo messages sent to /echo --> 

    </chain> 

 

    <chain id='pkt-user'> 

      <module>roster</module>           <!-- handle s10n responses --> 

      <module>presence</module> 

      <module>iq-vcard</module>         <!-- grab user vcards --> 

      <module>deliver</module>  

      <module>vacation</module>         <!-- send vacation messages --> 

      <module>offline</module>          <!-- save messages and s10ns for later --> 

      <module>disco-publish</module> 

      <module>iq-last</module>          <!-- return time since last logout --> 

    </chain> 

 

    <chain id='pkt-router'> 

      <module>session</module>          <!-- take sessions offline their c2s disappears --> 

      <module>disco</module> 

    </chain> 

 

    <chain id='user-load'> 

      <module>active</module>           <!-- get active status --> 

      <module>roster</module>           <!-- load the roster and trust list --> 

      <module>privacy</module>          <!-- load privacy lists --> 

      <module>disco-publish</module>    <!-- load published information --> 

      <module>vacation</module>         <!-- load vacation settings --> 

    </chain> 

 

    <chain id='user-create'> 

      <module>active</module>           <!-- activate new users --> 

      <module>template-roster</module>  <!-- populate roster from template --> 

    </chain> 

 

    <chain id='user-delete'> 

      <module>active</module>           <!-- deactivate users --> 

      <module>announce</module>         <!-- delete motd data --> 

      <module>disco-publish</module>    <!-- delete published information --> 

      <module>offline</module>          <!-- bounce queued messages --> 

      <module>privacy</module>          <!-- delete privacy lists --> 

      <module>roster</module>           <!-- delete roster --> 

      <module>vacation</module>         <!-- delete vacation settings --> 

      <module>iq-last</module>          <!-- delete last logout time --> 

      <module>iq-private</module>       <!-- delete private data --> 

      <module>iq-vcard</module>         <!-- delete vcard --> 

    </chain> 

  </modules> 

 

  <discovery> 

    <identity> 

      <category>server</category> 

      <type>im</type> 

      <name>Jabber IM server</name> 

    </identity> 

    <agents/> 

    <items> 

    </items> 

  </discovery> 

 

  <!-- User options --> 

  <user> 

   <!-- 

 <auto-create/> 

    -->

<template>
   <!-- 

 <roster>/usr/local/etc/jabberd/templates/roster.xml</roster> 

  -->
</template>
</user>
</sm> 

############################################################# 

 

Configurando o Jabberd para utilizar um pacote de autenticação e armazenamento de dados externo. O Jabberd pode efetuar autenticação de diversas maneiras: 

MySQL, PostgreSQL, LDAP e Pipe. Nesse caso usaremos o script Pipe. 

 

Preparando a autenticação redirecionamento para um Script:

Os seguintes modulos perl devem serem instalados via MCPAN: 

·      Net::LDAP::Control 

·      Net::LDAP 

·      Net::LDAPS 

·      MIME::Base64 

·      Unix::Syslog 

·      DBI 

  

# perl -MCPAN -e 'install Net::LDAP::Control'
# perl -MCPAN -e 'install Net::LDAP'
# perl -MCPAN -e 'install MIME::Base64'
# perl -MCPAN -e 'install Unix::Syslog'
# perl -MCPAN -e 'install DBI'

# perl -MCPAN -e 'install DBD::mysql'

# perl -MCPAN -e 'install IO::Socket::INET'


Para gerar a chave SSL server.pem deve-se ser seguidos os comandos: 


# openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem
# openssl rsa -in privkey.pem -out privkey.pem
# cat privkey.pem >> server.pem

# rm privkey.pem

# chown jabber:jabber server.pem
# chmod 640 server.pem


Logo abaixo tem um arquivo modelo de script Pipe. Esse arquivo será o responsável em fazer o intermédio do LDAP com MySQL, é um script pré-configurado que pode ser baixado através desse link. Você poderá comparar com esse que disponibilizei no artigo caso tenha alguma dificuldade na configuração do mesmo.

# touch pipe-auth.pl
# chown jabber:jabber pipe-auth.pl
# chmod +x pipe-auth.pl

Arquivo de autenticação 

############################################################# 

#!/usr/local/bin/perl -w  

use strict;
use Net::LDAP;
use Net::LDAP::Control;
use DBI; 

  

my ($debug, $sth, $entry, $dept, $s, $query, $rosteritem, $rostergroup,@roster, $inneritem, $res); 

my $basedn     = "dc=domain,dc=org";
my $ldapserver = "hostname.domain.org";
my $disname    = "cn=urisso,dc=domain,dc=org";
my $ldappass   = "SENHA"; 

  

my $dbuser      = "jabberd2"; 

my $dbpass      = "senha_do_user_jabberd2"; 

my $dbname     = "jabberd2"; 

  

my $dbh = DBI->connect("DBI:mysql:database=$dbname;host=localhost",$dbuser, $dbpass);

my $ldap = Net::LDAP->new ( $ldapserver, debug => 0 ) or die "$@";
my $mesg = $ldap->bind ($disname, password => $ldappass, version => 3 ) or die "Cannot bind to ldap server. $!";

die $mesg->error if $mesg->code;

# query the department names
my $search = $ldap->search(
             base  => "$basedn",
             scope => "one",
             filter => "(&(objectClass=organizationalUnit) )" );

# fetch the department names
foreach $entry ($search->entries) {
  
    $dept = $entry->get_value('name');
  print "\n\n Dept: $dept \n\n";

    fetchperson("ou=$dept,$basedn", "one", "$dept");

    # query the first department level names
    $s = $ldap->search(
base => "ou=$dept,$basedn",
scope => "one",
filter => "( & (objectClass=organizationalUnit) )" );
    die $s->error if $s->code;
}

$ldap->unbind;

# delete everything in roster-items and roster-groups
# start with a clean page
$query = "DELETE FROM `roster-items`";
$dbh->do("$query") or die ("Cannot delete roster-items!\n");
$query = "DELETE FROM `roster-groups`";
$dbh->do("$query") or die ("Cannot delete roster-groups!\n");
   
# now that the @roster array is ready, populate the rosters
foreach $rosteritem (@roster)
{
    print STDERR "\n\n" . $rosteritem->{'jid'} . "is in " . $rosteritem->{'role'} if $debug;
    foreach $inneritem (@roster) {
if($debug) { print STDERR "\n|_____" . $inneritem->{'jid'} unless $rosteritem->{'jid'} eq $inneritem->{'jid'} ; }


# the following two statements add the roster-groups (Dept Names or Buddy Groups etc)
# and also take care of adding each user to every users' rosters without the need to authorize them manually
$query = "INSERT INTO `roster-items` SET
    `collection-owner` = " . $dbh->quote($rosteritem->{'jid'}) . ",
    jid = " . $dbh->quote($inneritem->{'jid'}) . ",
    name = " . $dbh->quote($inneritem->{'name'}) . " ,
    `to` = 1,
    `from` = 1,
    ask = 0 ";
$sth = $dbh->prepare($query);
$sth->execute or die("Cannot execute query! ($!)");

$query = "INSERT INTO `roster-groups` SET
    `collection-owner` = " . $dbh->quote($rosteritem->{'jid'}) . ",
    jid = " . $dbh->quote($inneritem->{'jid'}) . ",
    `group` = " . $dbh->quote($inneritem->{'rostergroup'}) ;
$sth = $dbh->prepare($query);
$sth->execute or warn("Cannot add roster group! ($!)");
    }
}


#### SUBS ####

sub updatevcard {
$res = shift;
$rostergroup = shift;

my $collection_owner = $res->get_value('sAMAccountName') . '@' . 'jabber.yourdomain.com';
my $email = $res->get_value('mail');
my $org_orgname =  $res->get_value('l');
my $org_orgunit = $res->get_value('department');
my $tel = $res->get_value('telephoneNumber');
my $title = $res->get_value('title');
my $role = $res->get_value('description');
my $nickname = $res->get_value('givenName');
my $adr_locality = $res->get_value('physicalDeliveryOfficeName');
my $adr_region = $res->get_value('st');
my $fn = $res->get_value('displayName');

$query = "REPLACE INTO vcard SET
    `collection-owner` =" . $dbh->quote($collection_owner) . ",
    fn = " . $dbh->quote($fn) . ",
    nickname =  " . $dbh->quote($nickname) . ",
    email = " . $dbh->quote($email) . ",
    title = " . $dbh->quote($title) . ",
    role  = " . $dbh->quote($role) . ",
    `adr-locality` = " . $dbh->quote($adr_locality) . ",
    `adr-region` = " . $dbh->quote($adr_region) . ",
    `org-orgname` = " . $dbh->quote($org_orgname) . ",
    `org-orgunit` = " . $dbh->quote($org_orgunit) . ",
    `desc` = " . $dbh->quote($rostergroup) ;

$sth = $dbh->prepare($query) or die("Cannot prepare database query! ($!)");
$sth->execute or die("Cannot execute database query! ($!) \n $query");
$sth->finish;
print STDERR $collection_owner . "\n" if $debug;

push @roster , {"jid" => $collection_owner, "name" => $fn, "rostergroup" => $rostergroup};
}


sub fetchperson {
my $searchdn = shift;
my $scope = shift;
my $rostergroup = shift;
my ($pers, $person) ;

# query the user names
my $us = $ldap->search(
base => "$searchdn",
scope => "$scope",
filter => "( & (objectClass=person) (mail=*) )" );
die $us->error if $us->code;

# fetch the usernames
foreach $pers ($us->entries) {
    $person = $pers->get_value('cn');
    print "\t\t|___" .
$person . "\n";
    updatevcard($pers,$rostergroup);
}
}
############################################################ 


Para iniciarmos o serviço basta executar o comando jabberd mas como ainda é primeira vez que você ira subir o processo  aconselho que rode o servidor Jabbber com a opção -D, ou seja em modo debug para visualizar quaisquer erros possíveis. Mas antes, use o comando sockstat para saber quais portas estão abertas em seu servidor e veja se o processo slapd está rodando e escutando na porta 636 (SSL), caso não re-execute-o ( # /usr/local/libexec/slapd -h "ldaps:///" -4 -d 4 & ), lembrando que com esse comando você irá executar o servidor LDAP e modo depurado.

# sockstat -4l |grep slapd 

root     slapd      1460  6  tcp4   *:636                 *:* 

# jabberd -D  

Agora vamos habilitar no rc.conf os serviços MySQL, LDAP e Jabberd para sejam executados no momento do boot do sistema.
Adicione as seguintes linhas:       

  

jabberd_enable="YES"
jabberd_chdir="/var/jabberd/pid"
jabberd_user="jabber" 

slapd_enable="YES" 

slapd_flags="-h ldap:/// ldaps:/// -4" 

  

mysql_enable="YES"

Configurando um Client Jabber Windows

Baixe o instalador do Gaim e instale-o. 

Execute o aplicativo, abrirá 3 janelas provavelmente isso se for a mesma versão usada por mim que se encontra no link acima. Vá na aba Contas e clique em Adicionar, um pop-up irá aparecer em seguida.  Nessa pop-up (“Adicionar conta”) selecione  o Protocolo: Jabber, em Nome de usuário: coloque um username qualquer, em Servidor: logicamente seu hostname ou IP do servidor Jabber que acabamos de configurar, no campo Senha: atribua uma senha qualquer. Logo abaixo do ultimo campo preenchido há uma opção minimizada (“Mostrar mais opções”), desmarque a primeira caixa (“Usar TLS se disponível”)  e em seguida marque  Forçar  SSL antigo. Clique em Registrar, abrirá uma barra de progresso do processo de conexão com o Servidor Jabber, se tudo ocorrer bem aparecerá uma mensagem de que você foi registrado com sucesso, e fianalmente clique em Conectar.  

Nota: *Os locais que houverem urisso altere-os por um nickname desejado ( sugiro admin ).
Obs: Caso haja algum problema com o hostname.domain.org substitua pelo IP-do-FreeBSD.  

Danton Dorati - Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo

Comentrios
Muito Bom..
Por moiza em 23/04/2007 16:43:03
Ai ja viram tb o Jabber/Wildfire/Openfire ? Tenho rodando aqui o Jabber/Wildfire aqui no FreeBSD 6.1 Stable muito bom.. inclusive quero testar o plugin de Gateway. Mas ta muito show.. parabns.
Muito Bom..
Por moiza em 23/04/2007 16:47:46
J viram tambm sobre Wildfire agora tb Openfire, tenho rodando o Jabber/Wildfire aqui no FreeBSD 6.1 Stable, com plugins e tudo... muito show... 
http://www.jivesoftware.com/products/openfire/ 
http://www.igniterealtime.org/ 
 
Parabns...
Ops foi maus...
Por moiza em 23/04/2007 16:51:05
Achei que o comentrio no tivesse ido... :-)
Help
Por Vanderlan Lima da Silva em 27/04/2007 15:12:31
Tudo bem. 
 
Ento cara vamso ver se vc pode me ajudar... 
 
Estou tendo um probleminha quando eu chego naquela parte hem que usamos esse comando 

#ldapadd -x -D \'cd=Admin,dc=domain,dc=com,dc=br\' -W -f top.ldif -h jb.domain.com.br 
******logo aps esse comando ele pede a senha****** 
Enter LDAP Password: 
******eu entro com uma senha mas ele aparece essa msg***** 
ldap_sasl_bind(SIMPLE): Can\'t contact LDAP server (-1) 
 
No oque esta ocorrendo... 
Voc poderia me dar uma fora... 
 
Obrigado 
Vanderlan Lima
Vanderlan Lima da Silva
Por urisso em 30/04/2007 00:14:10
Seguinte kra antes de mais nada \"# socostat -4l\" e veja se a ldap esta rodando.. se sim olha a porta, quando fiz esse artigo.. pensei em rodar o servidor LDAP com ssl e sem, no caso esse comando era pra adicionar sua ldif na porta sem autenticacao ssl.... provavelmente precisara especificar o comando \"#ldapadd -x -D -H ldaps://jb.domain.com.br:636 \\\'cd=Admin,dc=domain,dc=com,dc=br\\\' -W -f top.ldif\" foi uma falha minha mas vo pedir pra reditar o artigo e mudar essa parte... :D
Vanderlan Lima da Silva
Por urisso em 30/04/2007 00:14:50
Seguinte kra antes de mais nada \"# socostat -4l\" e veja se a ldap esta rodando.. se sim olha a porta, quando fiz esse artigo.. pensei em rodar o servidor LDAP com ssl e sem, no caso esse comando era pra adicionar sua ldif na porta sem autenticacao ssl.... provavelmente precisara especificar o comando \"#ldapadd -x -D -H ldaps://jb.domain.com.br:636 \\\'cd=Admin,dc=domain,dc=com,dc=br\\\' -W -f top.ldif\" foi uma falha minha mas vo pedir pra reditar o artigo e mudar essa parte... :D
Vanderlan Lima da Silva
Por urisso em 30/04/2007 00:20:13
Vesh tbm mandei duas vezes o comenario :S... Vanderlan Lima da Silva ignore essas barras invertidas nos comandos "\"
Valew
Por Vanderlan Lima em 02/05/2007 19:09:09
Blz, valew amigo pelas dicas.... 
era o meu ldap que no est rodando... 
Estou vendo como posso subir ele pois usando o comando  
#./slapd start 
no diretorio /usr/local/etc/rc.d/ 
no est indo.... 
Vou pocurar mais um pouco valew kra....
Problema no OpenFire: No est seguindo
Por Nilton Neto em 27/06/2007 15:29:58
Pessoal, 
Estamos tentando autenticar usurios de outro ldap, usando referncia a partir um ldap principal, onde o nosso OpenFire est apontando. 
Na administrao do OpenFire, ele lista todos os usurios que esto l no meu Referral. 
Porm quando tentamos autenticar com algum usurio de l, o Servidor Jabber retorna "No autorizado". 
Algum tem alguma idia?
:S
Por Danton Dorati (urisso) em 10/07/2007 15:42:41
Escrevi esse artigo com base em varios outros artigos publicado em ingles, inclusive tive varios problemas com o OpenLDAP mas nao conheo a fundo como funciona o sistema de banco de dados.


Comente!*
Nome:
E-mail
Homepage
Ttulo:
Comentrio:

Cdigo:* Code

ltima Atualizao ( 19/09/2008 )
 
< Anterior   Prximo >
FUG-BR - Espalhando BSD
Dicas Rpidas:

Para quem está cansado de instalar programs via linha de comando com o ports e compania, agoa exite o bpm - BSD Ports Manipulator

 






Wallpapers
Sua Opiniao
Online:
Ns temos 22 visitantes online


Devil Store - Sua loja BSD
FreeBSD Brasil LTDA

FUG-BR: Desde 1999, espalhando BSD pelo Brasil.