Instalação e Configuração do Ejabberd

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Agora vamos instalar o Ejabberd pelo repositório do Debian

aptitude install ejabberd libsdl-erlang erlang-odbc erlang-tools ldap-utils -y

Agora vamos fazer um ajuste no arquivo de controle do ejabberd.

sed -i "s/#ERLANG_NODE=ejabberd/ERLANG_NODE=ejabberd@`hostname`/g" /etc/default/ejabberd 

Agora que ele já esta instalado vamos consultar o seu status

ejabberdctl status
The node ejabberd@debian is started with status: started
ejabberd 2.1.5 is running in that node

Vamos parar o ejabberd para modificarmos a sua configuração e a sua chave.

/etc/init.d/ejabberd stop

Gerando o certificado para o Ejabberd

Agora vamos configurar o certificado para o Ejabberd

Vamos fazer um backup da chave antiga

mv /etc/ejabberd/ejabberd.pem /etc/ejabberd/ejabberd.pem.orig

Vamos acessar o diretório para criar as chaves

cd /etc/ejabberd

Agora vamos gerar a chave

openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem
Generating a 1024 bit RSA private key
............++++++
...++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase: #senha
Verifying - Enter PEM pass phrase: #senha
-----
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]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:TI
Common Name (eg, YOUR name) []:jabber.douglasqsantos.com.br
Email Address []:douglas.q.santos@gmail.com

Agora vamos tirar a senha da chave

openssl rsa -in privkey.pem -out privkey.pem
Enter pass phrase for privkey.pem:
writing RSA key

Agora vamos acertar a nossa chave

mv privkey.pem ejabberd.pem

Agora vamos acertar a permissão da chave

chown root:ejabberd /etc/ejabberd/ejabberd.pem
chmod 640 /etc/ejabberd/ejabberd.pem

Configurando o Ejabberd com autenticação Local

Vamos fazer um backup do arquivo de configuração

cp -Rfa /etc/ejabberd/ejabberd.cfg{,.bkp}

Agora vamos deixar o arquivo como abaixo.

vim /etc/ejabberd/ejabberd.cfg
%% Aqui vamos definir as ACLs para o ejabberd
{acl, admin, {user, "douglas", "douglasqsantos.com.br"}}.
{acl, admin, {user, "admin", "douglasqsantos.com.br"}}.
%% Qual domínio que vamos utilizar
{hosts, ["douglasqsantos.com.br"]}.
%% Nivel de log que vamos utilizar
{loglevel, 3}.
%% Aqui vamos definir como o serviço vai se comportar
{listen,
 [
  {5222, ejabberd_c2s, [
                       {access, c2s},
                       {shaper, c2s_shaper},
                       {max_stanza_size, 65536},
                       starttls_required, {certfile, "/etc/ejabberd/ejabberd.pem"}
                       ]},
 {5269, ejabberd_s2s_in, [
                         {shaper, s2s_shaper},
                         {max_stanza_size, 131072}
                         ]},
 {5280, ejabberd_http, [
                       http_poll,
                       web_admin
                       ]}
 ]}.
%% se vamos utilizar o starttls para as conexões
{s2s_use_starttls, true}.
%% caminho do certificado
{s2s_certfile, "/etc/ejabberd/ejabberd.pem"}.
%% tipo de autenticação, neste caso interna
{auth_method, internal}.
%% configurações para limitar o tráfego das conexões
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}. 

%% Acls internas default do ejabberd
{acl, local, {user_regexp, ""}}.
 
{access, max_user_sessions, [{10, all}]}.
{access, local, [{allow, local}]}.
{access, c2s, [{deny, blocked},
               {allow, all}]}.
{access, c2s_shaper, [{none, admin},
                      {normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{access, register, [{allow, all}]}.
{access, pubsub_createnode, [{allow, all}]}.
 
%% configurações para o host
{host_config, "douglasqsantos.com.br",
 [  
  {access, c2s, [{allow, admin}, {allow, all}]},
  {access, register, [{allow, all}]}
 ]
}.                                 

%% Aqui definimos o idioma default
{language, "en"}.
 
%%Aqui temos a definição dos módulos utilizados pelo ejabberd
{modules,
 [
  {mod_adhoc,    []},
  {mod_announce, [{access, announce}]}, 
  {mod_caps,     []},
  {mod_configure,[]}, 
  {mod_ctlextra, []},               
  {mod_disco,    []},
  {mod_irc,      []},   
  {mod_last,     []},
  {mod_muc,      [
                  {access, muc},
                  {access_create, muc},
                  {access_persistent, muc},
                  {access_admin, muc_admin},
                  {max_users, 500}
                 ]},
  {mod_offline,  []},
  {mod_privacy,  []},
  {mod_private,  []},
  {mod_proxy65,  [
                  {access, local},
                  {shaper, c2s_shaper}
                 ]},
  {mod_pubsub,   [ 
                  {access_createnode, pubsub_createnode},
                  {plugins, ["default", "pep"]}
                 ]},
  {mod_register, [
                  {welcome_message, {"Bem-Vindo!",
                                     "Bem-Vindo ao seu servidor Jabber de douglasqsantos.com.br. "
                                     "Para mais informações sobre o Jabber:"
                                     "http://www.jabber.org"}},
 
                  {access, register}
                 ]},
  {mod_roster,   []},
  {mod_shared_roster,   []},
  {mod_stats,    []},
  {mod_time,     []},
  {mod_vcard,    []},
  {mod_version,  []}
 ]}.

Os comentários neste arquivo são o sinal de percentual “%” por causa da linguagem que é utilizada erlang

Agora vamos iniciar o nosso ejabberd

/etc/init.d/ejabberd start

Agora vamos criar um usuário administrador par ao nosso jabber, aqui vamos criar o usuário douglas para o domínio douglasqsantos.com.br e a senha sendo senha.

ejabberdctl register douglas douglasqsantos.com.br senha
User douglas.q.santos@gmail.com successfully registered

Como definimos dois domínios para o ejabber Para remover o usuário

ejabberdctl unregister douglas douglasqsantos.com.br

Agora vamos reiniciar o nosso ejabberd

/etc/init.d/ejabberd restart
Restarting jabber server: ejabberd.

Agora vamos acessar a o painel de administração Web, acesse http://ip_servidor:5280/admin, o usuário: douglas.q.santos@gmail.com e a senha: senha

Configurando o Ejabberd com autenticação no AD ou Ldap + Samba

Agora vamos consultar a base do AD/LDAP, a opção -b é a base do LDAP/AD o -D é o usuário do domínio o -W é a opção de pedir senha o -x é a autenticação simples e o -h é o servidor AD/LDAP

ldapsearch -b "dc=douglasqsantos,dc=com,dc=br" -D "DOUGLAS\\Administrador" -W -x -h 10.101.0.23
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=douglasqsantos,dc=com,dc=br> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# douglasqsantos.com.br
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: domain
objectClass: domainDNS
distinguishedName: dc=douglasqsantos,dc=com,dc=br
instanceType: 5
whenCreated: 20100922183238.0Z
whenChanged: 20120809050816.0Z
subRefs: DC=DomainDnsZones,dc=douglasqsantos,dc=com,dc=br
subRefs: DC=ForestDnsZones,dc=douglasqsantos,dc=com,dc=br
subRefs: CN=Configuration,dc=douglasqsantos,dc=com,dc=br
uSNCreated: 7600
[...]

Agora vamos ao arquivo de configuração do ejabberd

vim /etc/ejabberd/ejabberd.cfg
%% Aqui vamos definir as ACLs para o ejabberd
{acl, admin, {user, "douglas", "douglasqsantos.com.br"}}.
{acl, admin, {user, "admin", "douglasqsantos.com.br"}}.
%% Qual domínio que vamos utilizar
{hosts, ["douglasqsantos.com.br"]}.
%% Nivel de log que vamos utilizar
{loglevel, 3}.
%% Aqui vamos definir como o serviço vai se comportar
{listen,
 [
  {5222, ejabberd_c2s, [
                       {access, c2s},
                       {shaper, c2s_shaper},
                       {max_stanza_size, 65536},
                       starttls_required, {certfile, "/etc/ejabberd/ejabberd.pem"}
                       ]},
 {5269, ejabberd_s2s_in, [
                         {shaper, s2s_shaper},
                         {max_stanza_size, 131072}
                         ]},
 {5280, ejabberd_http, [
                       http_poll,
                       web_admin
                       ]}
 ]}.
%% se vamos utilizar o starttls para as conexões
{s2s_use_starttls, true}.
%% caminho do certificado
{s2s_certfile, "/etc/ejabberd/ejabberd.pem"}.
%% Aqui vamos comentar o tipo de autenticação Local para habilitarmos abaixo a autenticação no AD
%%{auth_method, internal}.
%% configuração da autenticação no AD
%% Método de autenticação ldap
{auth_method, ldap}.
%% Servidor AD/LDAP
{ldap_servers, ["10.101.0.23"]}.
%% Aqui definimos se vamos utilizar criptografia
{ldap_encrypt, none}.
%% Porta de escuta do servidor ldap/ad
{ldap_port, 389}.
%% Usuário que vai ler a base ldap/ad, aqui podemos utilizar qualquer usuário do domínio com permissão de leitura 
{ldap_rootdn, "DOUGLAS\\Administrador"}.
%% senha do usuário que vai efetuar a leitura do ldap/ad
{ldap_password, "senha"}.
%% base que vamos consultar aqui podemos especificar uma determinada ou com todos os usuário ou mandar mapear o domínio todo
{ldap_base, "ou=BR,dc=douglasqsantos,dc=com,dc=br"}.
%% atributo que vamos utilizar como nome do usuário estou utilizando a conta do AD ex: usuario@douglasqsantos.com.br
{ldap_uids, [{"sAMAccountName", "%u"}]}.
%% configurações para limitar o tráfego das conexões
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}. 
%% Acls internas default do ejabberd
{acl, local, {user_regexp, ""}}.

{access, max_user_sessions, [{10, all}]}.
{access, local, [{allow, local}]}.
{access, c2s, [{deny, blocked},
               {allow, all}]}.
{access, c2s_shaper, [{none, admin},
                      {normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{access, register, [{allow, all}]}.
{access, pubsub_createnode, [{allow, all}]}.
 
%% configurações para o host
{host_config, "douglasqsantos.com.br",
 [  
  {access, c2s, [{allow, admin}, {allow, all}]},
  {access, register, [{allow, all}]}
 ]
}.                                 
 
%% Aqui definimos o idioma default
{language, "en"}.

%%Aqui temos a definição dos módulos utilizados pelo ejabberd
{modules,
 [
  {mod_adhoc,    []},
  {mod_announce, [{access, announce}]}, % requires mod_adhoc
  {mod_caps,     []},
  {mod_configure,[]}, % requires mod_adhoc
  {mod_ctlextra, []},               
  {mod_disco,    []},
  %%{mod_echo,   [{host, "echo.localhost"}]},
  {mod_irc,      []},   
  {mod_last,     []},
  {mod_muc,      [
                  %%{host, "conference.@HOST@"},
                  {access, muc},
                  {access_create, muc},
                  {access_persistent, muc},
                  {access_admin, muc_admin},
                  {max_users, 500}
                 ]},
  %%{mod_muc_log,[]},
  {mod_offline,  []},
  {mod_privacy,  []},
  {mod_private,  []},
  {mod_proxy65,  [
                  {access, local},
                  {shaper, c2s_shaper}
                 ]},
  {mod_pubsub,   [ % requires mod_caps
                  {access_createnode, pubsub_createnode},
                  {plugins, ["default", "pep"]}
                 ]},
  {mod_register, [
                  {welcome_message, {"Bem-Vindo!",
                                     "Bem-Vindo ao seu servidor Jabber de douglasqsantos.com.br. "
                                     "Para mais informações sobre o Jabber:"
                                     "http://www.jabber.org"}},
 
                  {access, register}
                 ]},
  {mod_roster,   []},
  {mod_shared_roster,   []},
  {mod_stats,    []},
  {mod_time,     []},
  {mod_vcard,    []},
  {mod_version,  []}
 ]}.

Agora vamos acessar a o painel de administração Web, acesse http://ip_servidor:5280/admin, o usuário: douglas.q.santos@gmail.com e a senha: senha_do_ad

Configurando o Ejabberd com autenticação no Ldap

Agora vamos ao arquivo de configuração do ejabberd + LDAP sem samba caso utilize LDAP + SAMBA a configuração é a do AD

vim /etc/ejabberd/ejabberd.cfg
%% Aqui vamos definir as ACLs para o ejabberd
{acl, admin, {user, "douglas", "douglasqsantos.com.br"}}.
{acl, admin, {user, "admin", "douglasqsantos.com.br"}}.
{hosts, ["douglasqsantos.com.br"]}.
%% Nivel de log que vamos utilizar
{loglevel, 3}.
%% Aqui vamos definir como o serviço vai se comportar
{listen,
 [
  {5222, ejabberd_c2s, [
                       {access, c2s},
                       {shaper, c2s_shaper},
                       {max_stanza_size, 65536},
                       starttls_required, {certfile, "/etc/ejabberd/ejabberd.pem"}
                       ]},
 {5269, ejabberd_s2s_in, [
                         {shaper, s2s_shaper},
                         {max_stanza_size, 131072}
                         ]},
 {5280, ejabberd_http, [
                       http_poll,
                       web_admin
                       ]}
 ]}.
 
%% se vamos utilizar o starttls para as conexões
{s2s_use_starttls, true}.
%% caminho do certificado
{s2s_certfile, "/etc/ejabberd/ejabberd.pem"}.
%% Aqui vamos comentar o tipo de autenticação Local para habilitarmos abaixo a autenticação no AD
%%{auth_method, internal}.
%% configuração da autenticação no AD
%% Método de autenticação ldap
{auth_method, ldap}.
%% Servidor AD/LDAP
{ldap_servers, ["10.101.0.25"]}.
%% Aqui definimos se vamos utilizar criptografia
{ldap_encrypt, none}.
%% Porta de escuta do servidor ldap
{ldap_port, 389}.
%% Usuário que vai ler a base ldap/ad, aqui podemos utilizar qualquer usuário do domínio com permissão de leitura 
{ldap_rootdn, "cn=admin,dc=douglasqsantos,dc=com,dc=br"}.
%% senha do usuário que vai efetuar a leitura do ldap
{ldap_password, "senha"}.
%% base que vamos consultar aqui podemos especificar uma determinada ou com todos os usuário ou mandar mapear o domínio todo
{ldap_base, "ou=usuarios,dc=douglasqsantos,dc=com,dc=br"}.
%% atributo que vamos utilizar como nome do usuário estou utilizando a conta do ldap ex: usuario@douglas.lan
{ldap_uids, [{"uid", "%u"}]}.
%% configurações para limitar o tráfego das conexões
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}. 
%% Acls internas default do ejabberd
{acl, local, {user_regexp, ""}}.
 
{access, max_user_sessions, [{10, all}]}.
{access, local, [{allow, local}]}.
{access, c2s, [{deny, blocked},
               {allow, all}]}.
{access, c2s_shaper, [{none, admin},
                      {normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{access, register, [{allow, all}]}.
{access, pubsub_createnode, [{allow, all}]}.
 
%% configurações para o host
{host_config, "douglasqsantos.com.br",
 [  
  {access, c2s, [{allow, admin}, {allow, all}]},
  {access, register, [{allow, all}]}
 ]
}.                                 
 
%% Aqui definimos o idioma default
{language, "pt-br"}.
 
%%Aqui temos a definição dos módulos utilizados pelo ejabberd
{modules,
 [
  {mod_adhoc,    []},
  {mod_announce, [{access, announce}]}, % requires mod_adhoc
  {mod_caps,     []},
  {mod_configure,[]}, % requires mod_adhoc
  {mod_ctlextra, []},               
  {mod_disco,    []},
  %%{mod_echo,   [{host, "echo.localhost"}]},
  {mod_irc,      []},   
  {mod_last,     []},
  {mod_muc,      [
                  %%{host, "conference.@HOST@"},
                  {access, muc},
                  {access_create, muc},
                  {access_persistent, muc},
                  {access_admin, muc_admin},
                  {max_users, 500}
                 ]},
  %%{mod_muc_log,[]},
  {mod_offline,  []},
  {mod_privacy,  []},
  {mod_private,  []},
  {mod_proxy65,  [
                  {access, local},
                  {shaper, c2s_shaper}
                 ]},
  {mod_pubsub,   [ % requires mod_caps
                  {access_createnode, pubsub_createnode},
                  {plugins, ["default", "pep"]}
                 ]},
  {mod_register, [
                  {welcome_message, {"Bem-Vindo!",
                                     "Bem-Vindo ao seu servidor Jabber de douglasqsantos.com.br. "
                                     "Para mais informações sobre o Jabber:"
                                     "http://www.jabber.org"}},
 
                  {access, register}
                 ]},
  {mod_roster,   []},
  {mod_shared_roster,   []},
  {mod_stats,    []},
  {mod_time,     []},
  {mod_vcard,    []},
  {mod_version,  []}
 ]}.

Agora vamos acessar a o painel de administração Web, acesse http://ip_servidor:5280/admin, o usuário: douglas.q.santos@gmail.com e a senha: senha_do_ldap

Criação de Grupos para o Ejabberd

Por default o maldito não importa os grupos nem do AD e nem do Ldap então temos que criar os grupos e atribuir os usuários a ele.

Agora logue em http://ip_server:5280/admin/

  • Agora em Virtual Hosts selecione o seu host no meu caso douglasqsantos.com.br
  • Agora selecione Shared Roster Groups
  • Agora Informe um nome para ele e selecione Add New
  • Agora click no nome do seu grupo
  • Aqui temos que editar ele:
    • Infome um nome para ele
    • Informe uma descrição
    • Aqui em members precisamos informar os usuário que iram fazer parte do grupo ex: douglas.q.santos@gmail.com tem que ser usuário@domínio
    • Em displayed Groups são para quais grupos o nosso grupo vai aparecer, aqui temos que informar pelo menos o nome do mesmo grupo para que os usuários deste grupo tenham acesso uns aos outros.
    • Agora selecione Submit

Para criar mais grupos é só seguir o procedimento acima ;)

Fazendo backup e restore do Ejabberd

Para fazer backup da base de dados Mnesia que é o padrão do ejabberd podemos utilizar o seguinte comando

ejabberdctl backup ejabberd.backup

Desta forma o ejabberd vai criar o arquivo ejabberd.backup em /var/lib/ejabberd com a permissão 640 e usuário e grupo dono sendo o ejabberd.

Caso necessite fazer um backup em dump podemos fazer da seguinte forma, pela documentação ele não é aconselhável quando a base de dados for muito grande.

ejabberdctl dump ejabberd.dump

Agora ver como restaurar um backup efetuado com o comando ejabberdctl backup, considerando que o arquivo esteja em /var/lib/ejabberd com a permissão 640 e usuário e grupo dono sendo o ejabberd.

ejabberdctl restore ejabberd.backup

Agora ver como restaurar um backup efetuado com o comando ejabberdctl dump, considerando que o arquivo esteja em /var/lib/ejabberd com a permissão 640 e usuário e grupo dono sendo o ejabberd.

ejabberdctl load ejabberd.dump

Portas utilizadas pelo Ejabberd

PortaDescrição
5222 Porta padrão para os conexões de clientes Jabber/XMPP, plain or STARTTLS.
5223 Porta padrão para os conexões de clientes Jabber/XMPP, utilizando método antigo de SSL
5269 Porta padrão para servidores Jabber/XMPP
4369 EPMD porta de escuta para requisições de nodos Erlang

Referências