XMPP

Hace tiempo que quería hacer mi propio servidor XMPP, mientras otra gente se anda peleando entre que si Whatsapp, Telegram, el chat de Facebook, o alguna de otras esas cosas raras son mejores, yo me aferro a Xmpp que es software libre y que hasta ahora me ha funcionado muy bien para chatear con amig@s, familia y otra gente conocida. Xmpp es tan grandioso que que incluso yo lo puedo instalar en mi propio servidor :) y así tener mas control sobre mis datos, eso no se puede hacer con Whatsapp u otra de esas cosas.

Busque por Internet que software era recomendado para instalar en un servidor Xmpp en Debian 9, la lucha estaba entre Ejabberd y Prosody IM y gano el segundo, simplemente por que leí por ahí que es mas sencillo de configurar, mas ligero y tiene un desarrollo mas activo actualmente.

!Así que manos a la obra¡

Me inspire por el articulo de Mierda.tv "Instalar un servidor XMPP – Prosody 0.10.0 sobre GNU/Linux Debian 9", pero al leerlo me pregunte ¿de verdad es tan fácil de instalar y configurar? y con ese tipo de preguntas mi única respuesta es ¡vamos a probar!

En el articulo de Fanta (así se llama el autor del blog Mierda.tv) vi que recomendaba obtener la versión 0.10.0 de Prosody con el comando wget, pero antes de hacer esto busque en los repositorios de Debian, para ser mas preciso en los backports de Debian 9, como yo ya tenia habilitado ese repositorio ya solo tuve que ejecutar el comando:

apt-get -t stretch-backports install prosodyctl

Y !voila¡ ya tenia Prosody IM en su versión 0.10.0, ahora a configurarlo, esto lo comenzamos a hacer con:

#vim /etc/prosody/prosody.cfg.lua

Ahí tenemos muchas opciones de configuración para nuestro servidor, no me voy a detener en todas y solo comento algunas:

Example: admins = { "user1@example.com", "user2@example.net" }
admins = { }

Esto nos sirve para designar un@ o más admistrador@s, se sorprendí que al crear esta cuenta y agregarla a Pidgin tenia muchas opciones disponibles como agregar nuevas cuentas al servidor.

Después tenemos los módulos que utiliza Prosody y que podemos escoger cuales queremos tener habilitados y cuales no, los que no queremos usar solo se tienen que comentar con dos guiones como en el caso de --"register" que abre la posibilidad de que la gente se registre abiertamente en nuestro servidor o no, como yo de momento no la quiero abrir la mantengo deshabilitada.

modules_enabled = {

      -- Generally required
              "roster"; -- Allow users to have a roster. Recommended ;)
              "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
              "tls"; -- Add support for secure TLS on c2s/s2s connections
              "dialback"; -- s2s dialback support
              "disco"; -- Service discovery

      -- Not essential, but recommended
              "carbons"; -- Keep multiple clients in sync
              "pep"; -- Enables users to publish their mood, activity, playing music and more
              "private"; -- Private XML storage (for room bookmarks, etc.)
              "blocklist"; -- Allow users to block communications with other users
              "vcard"; -- Allow users to set vCards

      -- Nice to have
              "version"; -- Replies to server version requests
              "uptime"; -- Report how long server has been running
              "time"; -- Let others know the time here on this server
              "ping"; -- Replies to XMPP pings with pongs
              --"register"; -- Allow users to register on this server using a client and change passwords
              --"mam"; -- Store messages in an archive and allow users to access it

No entiendo bien por que hay que decir dos veces si queremos que se permita abiertamente el registro o no, pero nos encontramos de nuevo con ese tema, y yo como ya dije antes no quiero abierto el registro así que lo tengo de esta forma:

allow_registration = false

Cifrado si siempre que sea posible por favor:

c2s_require_encryption = true

s2s_require_encryption = true

Después nos pregunta donde queremos tener los certificados para cifrar nuestra comunicación, estos por defecto están en /etc/prosody/certs/ así que lo dejamos de esta manera:

-- Location of directory to find certificates in (relative to main config file):
201 certificates = "certs"

Con esto termínanos con este archivo y ahora nos toca configurar nuestro "Vitual Host"; ya al final del archivo anterior nos mencionaba como hay que proceder:

----------- Virtual hosts -----------
-- You need to add a VirtualHost entry for each domain you wish Prosody to serve.
-- Settings under each VirtualHost entry apply *only* to that host.
-- It's customary to maintain VirtualHost entries in separate config files
-- under /etc/prosody/conf.d/ directory. Examples of such config files can
-- be found in /etc/prosody/conf.avail/ directory.

Así que paso a crear y editar el archivo punks.computer.cfg.lua dentro de la carpeta /etc/prosody/conf.d/ en este archivo solo determinamos el nombre de nuestro dominio y su respectivo certificado TLS que en este caso es uno de Let's Encrypt:

-- Section for example.com

VirtualHost "punks.computer"
       enabled = true -- Remove this line to enable this host

       -- Assign this host a certificate for TLS, otherwise it would use the one
       -- set in the global section (if any).
       -- Note that old-style SSL on port 5223 only supports one certificate, and will always
       -- use the global one.
      ssl = {
              key = "/etc/prosody/certs/punks.computer.key";
              certificate = "/etc/prosody/certs/punks.computer.crt";
              }

Ahora solo nos faltaría importar nuestro certificado de Let's Encrypt a nuestra a la carpeta de Prosody para que lo pueda usar:

#prosodyctl --root cert import /etc/letsencrypt/live
The directory /etc/prosody/certs is not owned by the current user, won't be able to write files to it

Pero ahí tenia un problema pues me aparecía ese mensaje diciéndome que yo no era estaba autorizado para escribir archivos en la carpeta /certs, ¿qué hacer entonces?, por lo general no me gusta estar jugando con los permisos y l@s usuri@s de las carpetas, pienso que cada programa sabe cuales deben de ser sus configuraciones, como cuando hice mi servidor de correo con Postfix y Dovecot y yo no tuve que hacer ningún cambio de este tipo en la instalación base, o al menos no que yo lo recuerde, pero bueno esa es otra historia.

Fue con esta situación con la que no podía avanzar por un buen tiempo, no lograba que el certificado de Let's Encrypt funcionara, solo lograba hacer funcionar un certificado auto firmado que esta bien pero cada ves que lo abría Pidgin este me preguntaba si quería aceptar el certificado o no, y esto me era un poco molesto, además no quería rendirme y quería hacer funcionar el certificado de Let's Encrypt.

Y no fue hasta un día que logre hablar (vía Xmpp desde luego) con Fanta el autor del articulo en el que me había basado y le pregunte si el no había tenido este problema, y el muy amablemente me ayudo, lo primero que me sugirió fue cambiar los permisos de la carpeta certs/ a 777 para probar, pero para quien no sabe sobre permisos en GNU/Linux esto que estaba haciendo era muy arriesgado pues con eso estoy dejando abierto que cualquier persona pueda escribir algo ahí, lo cual seria un riesgo de seguridad para mi servidor, pero pensé que si solo lo hacia un momento y después lo regresaba a su estado original no pasaba nada y así lo hice.

Permisos777

Y con los permisos 777 si lograba importar el certificado SSL de Let's Encrypt, pero no lo podía dejar así por razones de seguridad desde luego, así que jugué un rato con los permisos y no me quedaba claro como cambiarlos a la mejor manera para que fueran seguros y que Prosody funcionara. Buscando un poco por la red encontré este script de bash que soluciona ese problema, lo primero que pensé es que no quería meter cualquier script desconocido en mi servidor, así que mejor analice que es lo que este hacia y probé e hice esto:

#chown -R root:root /etc/prosody

Y ahora si a importar el certificado SSL:

#prosodyctl --root cert import /etc/letsencrypt/live
Imported certificate and key for hosts punks.computer

Después devolverle la propiedad de las carpetas al usuario Prosody para que pudiera usar el certificado sin problemas:

#chown -R prosody:prosody /etc/prosody

Para ir terminando darle unos buenos permisos a la carpeta /certs y su contenido:

chmod -R 700 /etc/prosody/certs

Ahora recargar Prosody para que se entere de los cambios:

root@punks:/etc# prosodyctl reload
Prosody log files re-opened and config file reloaded. You may need to reload modules for some changes to take effect.
root@punks:/etc# prosodyctl check
Checking config...
Done.

Checking DNS for host punks.computer...

Checking certificates...
Checking certificate for punks.computer
Certificate: /etc/prosody/certs/punks.computer.crt

All checks passed, congratulations!

Y bueno este ultimo proceso de cambiar los permisos y usuari@s es algo incomodo, y hay que estarlo haciendo cada tres meses que es lo que duran los certificados de Let's Encrypt; quías yo debería de hacer mi propio script, o mejor aun a ver si la gente que desarrolla Prosody hacen mas fácil esta situación, o bueno también podrían durar mas los certificados de Let's Encrypt, esperemos que eso pase pronto.

Nota*** La imagen contra los permisos 777 la tome de este buen repositorio de imagenes

ACTUALIZACIÓN

Hace ya un mes o mas que Prosody en los backports de Debian Stretch se actualizo a la versión 0.11.2-1 (y eso borro mi configuración, pero eso es otra historia) y con eso la situación de la importación de los certificados TLS se simplifico mucho.

La semana ante pasada al querer entrar a mi cuenta Xmpp con Profanity no lograba conectarme, así que me puse a pensar en cual sería el problema, se supone que tengo Monit configurado para que si Prosody se detiene por alguna razón se reinicie automáticamente, así que probe el comando:

#prosodyctl status

Y obtuve la respuesta:

Prosody is running

Así que lo segundo que se me ocurrió fue que hubiera un error con el certificado, no tenia muchas ganas de repetir el proceso que mención antes y que esta abajo de esta publicación, pero tampoco veía que tenia mucha otra opción, así que tecleé lo siguiente:

#prosodyctl --root cert import /etc/letsencrypt/live
Imported certificate and key for hosts punks.computer

Y funciono sin problemas, así que ahora solo tenia que recargar Prosody:

#prosodyctl reload

Y listo ya podía ingresar de nuevo y sin ningún problema a mi cuenta :)