Comunicaciones corporativas con Synapse

En este post veremos la instalación de Synapse, un servidor propio que nos permitirá controlar y securizar las comunicaciones de mensajería entre nuestros usuarios, un símil de Slack. Podremos mediante una app móvil o una web darles acceso seguro a salas de reuniones, mensajería privada, integración con Directorio Activo, con Jitsi, Nextcloud…

 

Una herramienta que nos agilizará mucho organizando nuestra vida laboral mediante canales o salas donde los usuarios podrán intercambiar sus necesidades, una alternativa real al correo electrónico, Teams, Slack y demás. Podrán chatear, enviarse ficheros, videoconferencias integradas con nuestro Jitsi, o lo dicho, si tienes Nextcloud podremos integrar el cliente de manera nativa.

¡Empezamos! Matrix es un protocolo abierto y una red para la comunicación descentralizada, donde los usuarios pueden participar en salas de chat públicas y privadas a través de servidores públicos y privados (“servidores domésticos”); así como cualquier cliente de su elección, al igual que hacemos con el correo electrónico. El objetivo es proporcionar una red global libre y abierta para la comunicación encriptada de principio a fin, sin sacrificar la facilidad de uso, y así poder liberar a los usuarios de quedar atrapados en las apps de ciertos fabricantes, que se hoy en día se ha convertido en lo más común.

 

Synapse es la implementación de servidor doméstico Matrix más instalada, está escrito en Python 3 y es open source. En este post veremos varias cosillas:

  • Instalar Synapse
  • Habilitar Proxy inverso con Nginx
  • Instalar cliente Element
  • Integración de autenticación con Directorio Activo.
  • Instalar Element-web
  • Integración con Jitsi
  • Integración con Nextcloud

 

Instalación de Synapse

Para hacer la instalación nos basaremos en un Ubuntu Server 21.04 que tendremos actualizadito y con una IP estática. Comenzamos instalando los requisitos:

sudo apt install build-essential python3-dev libffi-dev python3-pip python3-setuptools sqlite3 libssl-dev virtualenv libjpeg-dev libxslt1-dev

 

Nos descargamos la repo y las claves para finalmente instalar Matrix Synapse:

sudo apt install -y lsb-release wget apt-transport-https
sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list
sudo apt update
sudo apt install matrix-synapse-py3

 

Nos saltará la siguiente pregunta, tenemos que indicar el nombre FQDN del servidor, algo como matrix.midominio.eso que deberás dar de alta en tus servidores DNSs y que resuelvan contra la IP de esta máquina.

 

Si queremos enviar estadísticas anónimas para que mejoren el uso,

 

Iniciamos y habilitamos el servicio:

sudo systemctl start matrix-synapse.service
sudo systemctl enable matrix-synapse.service

 

Editamos el fichero de configuración de Synapse: /etc/matrix-synapse/homeserver.yaml y veremos el puerto de escucha, la dirección de escucha (podremos dejar 127.0.0.1 si accederemos con el proxy inverso), si queremos TLS, o importante, si queremos permitir que se registren usuarios libremente en nuestro entorno, o no:

...
- port: 8008
    tls: false
    type: http
    x_forwarded: true
    bind_addresses: ['0.0.0.0']

    resources:
      - names: [client, federation]
        compress: false
...
enable_registration: false
...

 

Si hacemos cualquier cambio reiniciamos el servicio:

sudo systemctl restart matrix-synapse.service

 

Y si en bind_address escuchamos desde 0.0.0.0 podremos abrir un navegador y verificar que el servicio está corriendo, abrimos contra http://DIRECCION_IP_SYNAPSE:8008

 

Proxy Inverso

Como vemos, nuestro Synapse corre bajo HTTP, lo que haremos a continuación será instalar Nginx y habilitar el acceso a Synapse mediante proxy inverso y cifrado con SSL. Así que venga, instalamos Nginx, lo iniciamos y lo marcamos como inicio automático con el sistema:

sudo apt install nginx
sudo systemctl start nginx.service
sudo systemctl enable nginx.service

 

Creamos el fichero de configuración para el sitio web de Synapse, le llamamos por ejemplo ‘/etc/nginx/sites-available/synapse’ y al menos reemplazaremos el FQDN de ejemplo que os dejo con el de cada uno de vosotros:

server {
       listen 80;
       server_name matrix.midominio.eso;
       return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name matrix.midominio.eso;

    ssl_certificate /etc/ssl/certs/wildcard_midominio_eso.cer;
    ssl_certificate_key /etc/ssl/certs/wildcard_midominio_eso.key;

    # If you don't wanna serve a site, comment this out
    root /var/www/html;
    index index.html index.htm;

    location /_matrix {
      proxy_pass http://127.0.0.1:8008;
      proxy_set_header X-Forwarded-For $remote_addr;
    }
    location /.well-known/matrix/server {
      return 200 '{"m.server": "matrix.midominio.eso:443"}';
      add_header Content-Type application/json;
    }
    location /.well-known/matrix/client {
      return 200 '{"m.homeserver": {"base_url": "https://matrix.midominio.eso"},"m.identity_server": {"base_url": "https://vector.im"}}';
      add_header Content-Type application/json;
      add_header "Access-Control-Allow-Origin" *;
    }
}

 

Creamos un enlace para habilitar el sitio de Synapse y reiniciamos Nginx:

sudo ln -s /etc/nginx/sites-available/synapse /etc/nginx/sites-enabled/
sudo systemctl restart nginx.service

 

Si todo ha ido bien podremos validarlo abriendo un navegador contra https://DIRECCION_IP_SYNAPSE/.well-known/matrix/server

 

Element

Bien, para conectarnos a nuestro servidor Synapse, podemos usar cualquier cliente como dijimos anteriormente, el más común quizá sea Element, anteriormente conocido como Riot. Pues Element lo podremos abrir directamente desde https://app.element.io o podemos descargarnos un cliente en local, para nuestro Windows, Linux, Mac, Android o iOS.

Una vez abierto Element, deberemos indicar que tenemos la cuenta alojada en nuestro propio servidor, indicamos nuestro FQDN y ya podremos loguearnos. Pero antes de loguearnos… ¿tendremos que tener una cuenta? ¿no? Bien. si tenemos Synapse configurado ya contra nuestro LDAP podremos intentar entrar ya con nuestro usuario del Directorio Activo, si no es así, necesitaremos usar usuarios locales. Para poder crear usuarios locales deberemos permitir que los usuarios puedan registrarse y para ello si recordamos, en el fichero de configuración establecemos ‘enable_registration: true’ y reiniciamos el servicio. Ahora ya sí podríamos crear una cuenta de usuario. Pero claro, cuidado con los registros abiertos, es cierto que en la configuración verás que podemos requerir de un secreto compartido previo y así no se validan, poner un CAPCHA… Normalmente los registros los dejaremos deshabilitados.

 

Y nada, si entramos ya Element nos da la bienvenida, nos permite enviar mensajes a contactos, explorar salas públicas o crear chats grupales entre otros.

 

Element en sí no tiene ninguna complicación, los usuarios manejan este tipo de herramientas diariamente, pero esta es open source, segura, cifrada y corre en nuestro datacenter, sin fugas de datos o con la máxima privacidad.

 

Configuración contra Directorio Activo

Lo más cómodo será integrar la autenticación de Synapse con nuestro dominio de Active Directory, para ello, primero instalaremos el conector LDAP y finalmente en la configuración de Synapse indicamos los datos de nuestro LDAP. Instalamos los requisitos primero:

sudo apt-get install matrix-synapse-ldap3 -y

 

Editamos el fichero de configuración de Synapse (/etc/matrix-synapse/homeserver.yaml) y añadimos la siguiente configuración en la sección correspondiente:

password_providers:
    - module: "ldap_auth_provider.LdapAuthProvider"
      config:
        enabled: true
        uri: "ldap://DIRECCION_IP_DC:389"
        start_tls: false
        base: "ou=OU_2,ou=OU_1,dc=DOMINIO,dc=LOCAL"
        attributes:
           uid: "sAMAccountName"
           mail: "mail"
           name: "givenName"
        bind_dn: "cn=USUARIO_LDAP_SYNAPSE,ou=OU_2,ou=OU_1,dc=DOMINIO,dc=LOCAL"
        bind_password: "CONTRASEÑA"
        #filter: "(objectClass=posixAccount)"

Donde bueno, podríamos añadir alguna linea adicional contra otro DC, así como que preferiblemente configurar LDAPS mejor por el 636 y con TLS y en la BaseDN tendremos la base de donde nos buscará los usuarios, así como si queremos poner algún filtro adicional…

 

Y nada tras reiniciar el servicio de Synapse podremos ya intentar loguearnos con nuestros usuarios de dominio.

sudo systemctl restart matrix-synapse.service

 

Element-web

En el propio servidor de Synapse podremos instalar Element-web, que así podremos evitar hacer que los usuarios se tengan que ir a la web de Element para hablar o el tener un cliente instalado offline. Element-web nos proporcionará el mismo GUI pero ejecutándose en nuestro servidor (en Nginx), un cliente web, vaya.

Así que, creamos el directorio donde guardaremos element-web, nos lo descargamos, instalamos gnupg, las claves & las instalamos, descomprimimos element, creamos un enlace simbólico y corregimos los permisos; finalmente crearemos nuestro fichero de configuración:

sudo mkdir -p /var/www/html/element
cd /var/www/html/element

sudo wget https://github.com/vector-im/element-web/releases/download/v1.7.34/element-v1.7.34.tar.gz

sudo apt install -y gnupg
sudo wget https://github.com/vector-im/element-web/releases/download/v1.7.34/element-v1.7.34.tar.gz.asc

sudo gpg --keyserver keyserver.ubuntu.com --search-keys releases@riot.im
sudo gpg --verify element-v1.7.34.tar.gz.asc

sudo tar -xzvf element-v1.7.34.tar.gz

sudo ln -s element-v1.7.34 element
sudo chown www-data:www-data -R element

cd element
sudo cp config.sample.json config.json

 

Editamos el fichero de configuración (/var/www/html/element/element/config.json), modificamos la ‘base_url’ con el FQDN completo de Synapse (matrix.midominio.eso); y ‘server_name’ con el nombre del dominio (midominio.eso). Quedando:

{
    "default_server_config": {
        "m.homeserver": {
            "base_url": "https://matrix.midominio.eso",
            "server_name": "midominio.eso"
        },
        "m.identity_server": {
            "base_url": "https://matrix.midominio.eso"
        }
    },
...

 

Creamos el fichero de configuración para Nginx:

server {
       listen 80;
       server_name element.midominio.eso;
       return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name element.midominio.eso;

    ssl_certificate /etc/ssl/certs/wildcard_mi_dominio.cer;
    ssl_certificate_key /etc/ssl/certs/wildcard_mi_dominio.key;

    root /var/www/html/element/element;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

 

Habilitamos el sitio y reiniciamos Nginx:

sudo ln -s /etc/nginx/sites-available/element /etc/nginx/sites-enabled/
sudo systemctl restart nginx.service

 

Y probamos con un navegador a acceder a https://element.midominio.eso ¡et voilà! ya podremos loguearnos con nuestros usuarios directamente en web, y no te cuento si customizamos el Inicio…

 

Integración con Jitsi

Si tenemos nuestro propio servidor de videoconferencias basado en Jitsi, podemos integrarlo con Element-web y así cuando quieran hacer una llamada o video llamada, o grupal, usarán nuestros recursos, todo queda en casa, seguro, cifrado… basta con editar el fichero de configuración de element-web (/var/www/html/element/element/config.json) en la sección de Jitsi y poner nuestro FQDN:

},
"jitsi": {
    "preferredDomain": "jitsi.midominio.eso"
}

 

¡Y quedaría super chulo!

 

Integración con Nextcloud

Venga ya acabamos… esto lo mismo, si tienes tu propio sistema de intercambio de ficheros o aún más un Hub de conexión a tus usuarios con Nextcloud podrás con una app integrar en la propia interfaz de Nextcloud un apa

 

En Nextcloud, logueados con una cuenta con privilegios de administrador, vamos a las Apps > Integración > y buscamos ‘Element for Nextcloud’, pulsamos en “Descargar y activar”.

 

Si vamos a la parte de Configuración, en el menú lateral podremos ver un apartado nuevo llamado ‘Element’, deberemos configurar la URL del servidor Element Web.

 

Y ahora los usuarios tendrán en la barra superior un icono adicional, donde directamente podrán hablar, interactuar con el resto de compañeros… ¡precioso!

 

Bueno, que espero os haya resultado interesante, gracias a todos los que dais Likes y Recomendaciones en las redes sociales, abrazos a tod@s!