Servidor de Mensajeria Instantanea con ejabberd y Jappix

De WikiSalud
Saltar a: navegación, buscar

Contenido

Resumen

Instalación y configuración de ejabberd como servidor de Mensajería instantanea, y Jappix como cliente XMPP web

Introducción

ejabberd (siempre en minúscula) es un servidor de mensajería instantánea Jabber/XMPP, licenciado bajo GPLv2 y escrito en Erlang. Entre otras características, es multi-plataforma, tolerante a fallas, clusterizable y modular.

Entre los módulos más interesantes para entornos corporativos se encuentran el de autenticación contra LDAP y el vCARD LDAP, lo cual elimina la complicación de crear usuarios a mano.

Si bien su fácil integración con Jappix lo hacen una opción bastante interesante, Openfire es otra opción relativamente más sencilla de configurar y de mantener configurada.

Configuración previa del Servidor

Procedimiento

Instalación de software

Instalando paquetes:

aptitude install ejabberd unzip apache2 php5{,-curl,-gd}

Configuracion de ejabberd

De haber seguido la guía, en este momento usted debe poseer al menos dos fichero: Uno PEM RSA private key (`hostname -f`.key) y uno PEM certificate (`hostname -f`.crt). Combine ambos para uso de ejabberd:

cat `hostname -f`.{crt,key} > /etc/ejabberd/`hostname -f`.pem 

El siguiente fichero de configuración es una simplificación de config_ejabberd.cfg.txt , así que siempre puede volver a él para revertir los cambios, entre otros, la eliminación de comentarios, eliminación de creación de usuarios y autenticación anónima (algo sin sentido en un entorno empresarial).

/etc/ejabberd/ejabberd.cfg
%%% =========
%%% DEBUGGING
 
%%
%% loglevel: Verbosity of log files generated by ejabberd.
{loglevel, 1}.
 
%% watchdog_admins: Only useful for developers: if an ejabberd process
%% consumes a lot of memory, send live notifications to these Jabber accounts.
{watchdog_admins, []}.
 
 
%%% ================
%%% SERVED HOSTNAMES
 
%% hosts: Domains served by ejabberd.
{hosts, ["dominio.com"]}.
 
%%% ===============
%%% LISTENING PORTS
 
%% listen: Which ports will ejabberd listen, which service handles it
%% and what options to start it with.
%%
{listen,
 [ 
  {5222, ejabberd_c2s, [inet6, {access, c2s}, {shaper, c2s_shaper}, starttls_required, {certfile, "/etc/ejabberd/im.dominio.com.pem"}, {max_stanza_size, 65536}]},
 
  {5269, ejabberd_s2s_in, [inet6, {shaper, s2s_shaper},{max_stanza_size, 131072}]},
 
  {5280, ejabberd_http, [inet6,{request_handlers, [{["http-bind"], mod_http_bind}]} ]}
 
]}.
 
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
{s2s_use_starttls, true}.
 
%% s2s_certfile: Specify a certificate file.
{s2s_certfile, "/etc/ejabberd/im.dominio.com.pem"}.
 
%% S2S whitelist or blacklist
{s2s_default_policy, allow}.
 
%%% ==============
%%% AUTHENTICATION
%% Authentication using LDAP
{auth_method, ldap}.
%% List of LDAP servers:
{ldap_servers, ["directorio.dominio.com"]}.
%% LDAP attribute that holds user ID:
{ldap_uids, [{"mail", "%u@dominio.com"}]}.
%% Search base of LDAP directory:
{ldap_base, "dc=dominio,dc=com"}.
 
%%% ==============
%% PostgreSQL server:
%% {odbc_server, {pgsql, "localhost", "ejabberd", "ejabberd", "ejabberd"}}.
%%{pgsql_users_number_estimate, true}.
 
%%% ===============
%%% TRAFFIC SHAPERS
 
%% The "normal" shaper limits traffic speed to 1.000 B/s
{shaper, normal, {maxrate, 1000}}.
 
%% The "fast" shaper limits traffic speed to 50.000 B/s
{shaper, fast, {maxrate, 50000}}.
 
 
%%% ====================
%%% ACCESS CONTROL LISTS
 
%% The 'admin' ACL grants administrative privileges to Jabber accounts.
%% You can put as many accounts as you want.
%%
%%{acl, admin, {user, "admin", "jappix.com"}}.
 
%%
%% Blocked users
%%
%%{acl, blocked, {user, "baduser", "example.org"}}.
%%{acl, blocked, {user, "test"}}.
 
%%
%% Local users: don't modify this line.
%%
{acl, local, {user_regexp, ""}}.
 
%%
%% More examples of ACLs
%%
%%{acl, jabberorg, {server, "jabber.org"}}.
%%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
%%{acl, test, {user_regexp, "^test"}}.
%%{acl, test, {user_glob, "test*"}}.
 
%%
%% Define specific ACLs in a virtual host.
%%
%%{host_config, "localhost",
%% [
%% {acl, admin, {user, "bob-local", "localhost"}}
%% ]
%%}.
 
 
%%% ============
%%% ACCESS RULES
 
%% Maximum number of simultaneous sessions allowed for a single user:
{access, max_user_sessions, [{15, all}]}.
 
%% This rule allows access only for local users:
{access, local, [{allow, local}]}.
 
%% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
{allow, all}]}.
 
%% For C2S connections, all users except admins use "normal" shaper
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
 
%% All S2S connections use "fast" shaper
{access, s2s_shaper, [{fast, all}]}.
 
%% Only admins can send announcement messages:
{access, announce, [{allow, admin}]}.
 
%% Only admins can use configuration interface:
{access, configure, [{allow, admin}]}.
 
%% Admins of this server are also admins of MUC service:
{access, muc_admin, [{allow, admin}]}.
 
%% All users are allowed to use MUC service:
{access, muc, [{allow, all}]}.
 
%% Everybody can create pubsub nodes
%%{access, pubsub_createnode, [{allow, admin}]}.
%%{access, pubsub_createnode, [{allow, all}]}.
{access, pubsub_createnode, [{allow, all}]}.
 
%% To disable in-band registration, replace 'allow' with 'deny'.
{access, register, [{deny, all}]}.
 
%% By default frequency of account registrations from a the same IP
%% is limited to 1 account every 10 minutes. To disable put: infinity
%%{registration_timeout, 600}.
{registration_timeout, infinity}.
 
%%% ================
%%% DEFAULT LANGUAGE
 
%% language: Default language used for server messages.
{language, "en"}.
 
 
%%% =======
%%% MODULES
 
%% Modules enabled in all ejabberd virtual hosts.
{modules,
 [
  { mod_adhoc, [] },
  { mod_admin_extra, [] },
  { mod_announce, [ {access, announce} ] },
  { mod_caps, [] },
  { mod_configure,[] },
  { mod_disco, [ {extra_domains, ["irc.dominio.com", "muc.dominio.com", "pubsub.dominio.com", "vjud.dominio.com" ] } ] },
  { mod_irc, [ {host, "irc.dominio.com"} ]},
  { mod_muc, [ {host, "muc.dominio.com"}, {access, muc}, {access_create, muc}, {access_persistent, muc}, {access_admin, muc_admin}, {max_users, 150} ] },
  { mod_muc_log, [
                  {access_log, muc},
                  {cssfile, false},
                  {dirtype, subdirs},
                  {dirname, room_jid},
                  {outdir, "/srv/data_jappix/web/logs.jappix.com/"},
                  {timezone, universal},
                  {spam_prevention, true},
                  {top_link, {"https://jappix.com/", "Jappix.com"}}
                 ]},
  { mod_ping, [] },
  { mod_register, [ {access, register} ] },
  {mod_sic, []},
  {mod_stats, []},
  {mod_time, []},
  {mod_vcard_ldap, [
    {host, "vjud.dominio.com"},
    {ldap_rootdn, ""},
    {ldap_password, ""},
    {ldap_base, "dc=salud,dc=gob,dc=sv"},
    {ldap_vcard_map,[
      {"NICKNAME", "%s %s", ["sn", "givenName"]},
      {"FN", "%s", ["cn"]},
      {"GIVEN", "%s", ["givenName"]},
      {"FAMILY", "%s", ["sn"]},
      {"EMAIL", "%s", ["mail"]},
      {"ORGUNIT", "%s", ["ou"]},
      {"ROLE", "%s", ["title"]},
      {"TEL", "%s", ["telephoneNumber"]},
      {"PHOTO", "%s", ["jpegPhoto"]}
    ]},
    %% Search form
    {ldap_search_fields,
      [{"User", "%u"},
      {"Name", "givenName"},
      {"Family Name", "sn"},
      {"Organization Unit", "ou"}]},
    %% vCard fields to be reported
    %% Note that JID is always returned with search results
    {ldap_search_reported,
      [{"Full Name", "FN"},
      {"Nickname", "NICKNAME"},
      {"Organization Unit", "ORGUNIT"},
      {"Birthday", "BDAY"}]}
    ]
  },
  {mod_version, []},
 
  {mod_http_bind, []}
 ]
}.
 
%% Enable modules with custom options in a specific virtual host
{host_config, "dominio.com",
 [{{add, modules},
   [
    {mod_last, []},
    {mod_private, []},
    {mod_privacy, []},
    {mod_roster, []},
    {mod_offline, []},
    {mod_shared_roster,[]},
    {mod_pubsub, [
                  {host, "pubsub.dominio.com"},
{access_createnode, pubsub_createnode},
{ignore_pep_from_offline, false},
{max_items_node, 1000000},
{last_item_cache, false},
                  {plugins, ["flat", "pep"]}
    ]}
   ]
  }
]}.
 
 
%%% $Id: ejabberd.cfg.example 1733 2014-07-16 17:39:05Z badlop $
 
%%% Local Variables:
%%% mode: erlang
%%% End:
%%% vim: set filetype=erlang tabstop=8:


Configuracion de Apache

Puede configurar el host virtual apache como su preferencia. Configure tranquilamente SSL/TLS: Recuerde que habrá muchos datos entre Jappix y el cliente, entre ellos, sus credenciales en el árbol LDAP.
La configuración completa con HTTPS requiere que agregue las siguientes líneas dentro de la configuración del host:

/etc/apache2/sites-enabled/000-default
<VirtualHost 10.30.40.50:443>
...
  Header set Access-Control-Allow-Origin http://im.dominio.com
  ProxyPass  /http-bind  http://im.dominio.com:5280/http-bind/
  ProxyPassReverse  /http-bind   http://im.dominio.com:5280/http-bind/
...
</VirtualHost>


Lo más sano para esta configuración configuración es que haga una redirección obligatoria a HTTPS en el host HTTP.

/etc/apache2/sites-enabled/000-default
...
<VirtualHost *:80>
        RedirectMatch permanent ^(.*)$ https://im.dominio.com$1
        ServerName im.dominio.com
        ErrorLog /var/log/apache2/im.dominio.com-error.log
        CustomLog /var/log/apache2/im.dominio.com-access.log common
</VirtualHost>
...


Active los módulos necesarios para las opciones de agregado de cabeceras y proxy http en apache2.

a2enmod proxy proxy_http headers 

Una vez reiniciado el servidor Apache, pruebe ingresando a https://im.dominio.com/http-bind/. Se muestra una pequeña página de aviso de parte de ejabberd

texto descriptivo

Configuración de Jappix

Obtenga la última versión de jappix en https://jappix.org/.
Al momento de escribir esta guía, algunos cambios en jappix 1.1.0 malograron el manejo que hacen de CORS. Pero esta versión que bajé un par de días antes no tiene ese problema, sin embargo, se insta a probar si la última versión disponible no tiene ese problema.

Configuración web
La primera primera es una pantalla de bienvenida en la que solo es preciso comprobar que vamos a configurar con HTTPS desde un principio
Jappix01.png
Se verifica que se tenga permisos de escritura en el directorio de la aplicación:

Se recomienda manejar los permisos para el grupo www-data (Grupo al que pertenece el usuario www-data que es el que corre los procesos de apache Debian)

chown -R root:www-data /var/www 
chmod 775 /var/www 
Jappix02.png
Al momento de revisar esta guía, no he revisado las capacidades del administrador.
Jappix03.png
Las pantalla ofrece un ejemplo bastante descriptivo de como llenar estos datos.
  • La sección Services es sobre todo descriptiva. Se escoger español en la lista desplegable de Language, para que sea el idioma predeterminado de todos los usuarios
  • La seccion Connection debería quedar como en la imagen. No puede escogerse otro servidor a usar que no sea el nuestro y sin conexiones anónimas, dos caracteristicas propias de un servicio privado
  • En la sección ADVANCED debe quedar de esta forma. Aparte de las opciones por defecto, básicamente sólo tendrá que marcar las casillas para HTTPS Storage y force HTTPS (Si bien también realizamos una redirección a nivel de servidor)
Jappix04.png
No podría haber mejor forma de explicar esta imagen: La mayoría de los servicios expuestos ya están activos en ejabberd.

Es necesarios que en su servidor DNS haga un alias de su servidor IM a todos ellos: No hay necesidad de entradas SRV porque al final el acceso es descrito por medio del servidor que ha de usar para BOSH, que como se ve en la imagen, y gracias a las configuraciones que hemos hecho en Apache, se encuentra perfectamente en el mismo dominio. No hay necesidad de especificar su puerto real (5280) y se accede a el por medio de HTTPS

Jappix05.png
Se verifican algunos paquetes (que esta guía ya indico instalar). Cambiar el peso máximo es nada más opcional, usado para algunas características de Jappix.
Jappix06.png

El resultado es bastante conmovedor

Jappix08.png

Fuentes

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas