Servidor de Mensajeria Instantanea con ejabberd y Jappix
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
- configure correctamente el idioma.
- Configure certificados digitales, puede tomar como referencia guía para firma de resultados
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).
%%% ========= %%% 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:
<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.
... <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
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.
La primera primera es una pantalla de bienvenida en la que solo es preciso comprobar que vamos a configurar con HTTPS desde un principio | |
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 |
|
Al momento de revisar esta guía, no he revisado las capacidades del administrador. | |
Las pantalla ofrece un ejemplo bastante descriptivo de como llenar estos datos.
|
|
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 |
|
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. |
El resultado es bastante conmovedor