Categorías: Como se hace

Servidor de mensajería Ejabberd con autenticación LDAP en Debian10

Primero que nada este procedimiento lo ejecutaremos en un Debian 10, plenamente actualizado, sirve CT o VM dentro de Proxmox, aunque se recomienda CT. Este tutorial contempla LDAP tanto en sus variantes openLDAP, Samba4 o ADDC de Windows, sólo debe usted ajustar el camino del árbol ldap en el cual se van a hacer las búsquedas de los usuarios.

PCs involucradas:
1- Samba4/ADDC -> 192.168.0.4
2- Jabber -> 192.168.0.6

Entonces, empezamos!

Lo primero que hareos es agregar los records al DNS que necesita jabber para funcionar:
Recordar los records del DNS de jabber como servicio:

;Records del Jabber
_jabber._tcp.inutil.cu.		IN	SRV	5	0	5269	jabber.inutil.cu.
_xmpp-server._tcp.inutil.cu.	IN	SRV	5	0	5269	jabber.inutil.cu.
_conference._tcp.inutil.cu.	IN	SRV	5	0	5269	jabber.inutil.cu.
_xmpp-client._tcp.inutil.cu.	IN	SRV	5	0	5222	jabber.inutil.cu.

Y necesitamos crear la cuenta de usuario que se conectará al ldap desde el ejabberd, por lo que esto se debe ejecutar[este procedimiento lo tengo implementado contra Samba4]:

samba-tool user create 'ejabberd' 'jabb*123' \
    --surname='XMPP Service' \
    --given-name='eJabberd' \
    --company='INUTIL' \
    --description='eJabberd XMPP Service Account'

samba-tool user setexpiry ejabberd --noexpiry

Y crear los records DNS[en caso de que los tengas con el Samba4]:

samba-tool dns add localhost inutil.cu jabber A '192.168.0.6' -U 'administrator'%'Admin*123'
samba-tool dns add localhost 0.168.192.in-addr.arpa 6 PTR 'jabber.inutil.cu.' -U 'administrator'%'Admin*123'
samba-tool dns add localhost inutil.cu conference CNAME 'jabber.inutil.cu' -U 'administrator'%'Admin*123'
samba-tool dns add localhost inutil.cu echo CNAME 'jabber.inutil.cu' -U 'administrator'%'Admin*123'
samba-tool dns add localhost inutil.cu pubsub CNAME 'jabber.inutil.cu' -U 'administrator'%'Admin*123'
samba-tool dns add localhost inutil.cu _jabber._tcp SRV 'jabber.inutil.cu 5269 5 0' -U 'administrator'%'Admin*123'
samba-tool dns add localhost inutil.cu _xmpp-client._tcp SRV 'jabber.inutil.cu 5222 5 0' -U 'administrator'%'Admin*123'
samba-tool dns add localhost inutil.cu _xmpp-server._tcp SRV 'jabber.inutil.cu 5269 5 0' -U 'administrator'%'Admin*123'

Instalamos el servicio Ejabberd:

apt install -y ejabberd ejabberd-contrib erlang-eldap

Hacemos salva de la configuracion original:

mv /etc/ejabberd/ejabberd.pem{,.orig}

Ahora creamos el certificado[autofirmado] que usará ejabberd:

mkdir -p /etc/ejabberd/cert
openssl req -x509 -nodes -days 3650 -sha512 \
    -subj "/C=CU/ST=La Habana/L=La Habana/O=INUTIL.CU/OU=INUTIL/CN=*.inutil.cu/emailAddress=postmaster@inutil.cu/" \
    -addext "subjectAltName = DNS:jabber.inutil.cu,DNS:conference.inutil.cu,DNS:echo.inutil.cu,DNS:pubsub.inutil.cu,IP:192.168.0.6" \
    -newkey rsa:4096 \
    -out /tmp/exampleJabber.crt \
    -keyout /tmp/exampleJabber.key

openssl dhparam -out /etc/ejabberd/cert/dh2048.pem 2048

cat /tmp/{exampleJabber.crt,exampleJabber.key} > /etc/ejabberd/cert/ejabberd.pem
chmod 0640 /etc/ejabberd/cert/ejabberd.pem
chown root:ejabberd /etc/ejabberd/cert/ejabberd.pem

Y listo, ahora sólo nos queda revisar/editar/ajustar la configuración general a nuestras necesidades:

###
###              ejabberd configuration file
###
loglevel: 4
log_rotate_count: 0
log_rotate_date: ""

hosts:
  - "inutil.cu"

certfiles:
  - "/etc/ejabberd/cert/ejabberd.pem"

define_macro:
  'TLS_CIPHERS': "HIGH:!aNULL:!eNULL:!3DES:@STRENGTH"
  'TLS_OPTIONS':
    - "no_sslv3"
    - "no_tlsv1"
    - "no_tlsv1_1"
    - "cipher_server_preference"
    - "no_compression"
  'DH_FILE': "/etc/ejabberd/cert/dh2048.pem"

c2s_ciphers: 'TLS_CIPHERS'
s2s_ciphers: 'TLS_CIPHERS'
c2s_protocol_options: 'TLS_OPTIONS'
s2s_protocol_options: 'TLS_OPTIONS'
c2s_dhfile: 'DH_FILE'
s2s_dhfile: 'DH_FILE'

listen:
  -
    port: 5222
    ip: "0.0.0.0"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
    protocol_options: 'TLS_OPTIONS'
  -
    port: 5223
    ip: "0.0.0.0"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    tls: true
    protocol_options: 'TLS_OPTIONS'
  -
    port: 5269
    ip: "0.0.0.0"
    module: ejabberd_s2s_in
    max_stanza_size: 524288
  -
    port: 5280
    ip: "0.0.0.0"
    module: ejabberd_http
    request_handlers:
      "/api": mod_http_api
      "/bosh": mod_bosh
      "/ws": ejabberd_http_ws
    tls: true
    protocol_options: 'TLS_OPTIONS'
    web_admin: true

disable_sasl_mechanisms:
  - "digest-md5"
  - "X-OAUTH2"

s2s_use_starttls: required

auth_password_format: scram
fqdn: "jabber.inutil.cu"
auth_method: ldap
ldap_servers:
   - "addc.inutil.cu"
ldap_encrypt: none
ldap_port: 389
ldap_rootdn: "ejabberd@inutil.cu"
ldap_password: "jabb*123"
ldap_base: "OU=inutil,DC=inutil,DC=cu"
ldap_uids: {"sAMAccountName": "%u"}
ldap_filter: "(&(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"

acl:
  admin:
     user:
       - "administrator@inutil.cu"

  local:
    user_regexp: ""
  loopback:
    ip:
      - "127.0.0.0/8"

access_rules:
  local:
    - allow: local
  c2s:
    - deny: blocked
    - allow
  announce:
    - allow: admin
  configure:
    - allow: admin
  muc_create:
    - allow: local
  pubsub_createnode:
    - allow: local
  register:
    - allow
  trusted_network:
    - allow: loopback

api_permissions:
  "console commands":
    from:
      - ejabberd_ctl
    who: all
    what: "*"
  "admin access":
    who:
      - access:
          - allow:
            - acl: loopback
            - acl: admin
      - oauth:
        - scope: "ejabberd:admin"
        - access:
          - allow:
            - acl: loopback
            - acl: admin
    what:
      - "*"
      - "!stop"
      - "!start"
  "public commands":
    who:
      - ip: "127.0.0.1/8"
    what:
      - "status"
      - "connected_users_number"

shaper:
  normal: 1000
  fast: 50000

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    - 5000: admin
    - 100
  c2s_shaper:
    - none: admin
    - normal
  s2s_shaper: fast

modules:
  mod_adhoc: {}
  mod_admin_extra: {}
  mod_announce:
    access: announce
  mod_blocking: {}
  mod_bosh: {}
  mod_caps: {}
  mod_carboncopy: {}
  mod_client_state: {}
  mod_configure: {}
  mod_disco: {}
  mod_echo: {}
  mod_fail2ban: {}
  mod_http_api: {}
  mod_last: {}
  mod_muc:
    access:
      - allow
    access_admin:
      - allow: admin
    access_create: muc_create
    access_persistent: muc_create
    default_room_options:
      mam: true
  mod_muc_admin: {}
  mod_offline:
    access_max_user_messages: max_user_offline_messages
  mod_ping: {}
  mod_pres_counter:
    count: 5
    interval: 60
  mod_privacy: {}
  mod_private: {}
  mod_pubsub:
    access_createnode: pubsub_createnode
    plugins:
      - "flat"
      - "pep"
    force_node_config:
      "eu.siacs.conversations.axolotl.*":
        access_model: open
      "storage:bookmarks":
        access_model: whitelist
  mod_push: {}
  mod_push_keepalive: {}
  mod_roster:
    versioning: true
  mod_shared_roster_ldap:
   ldap_base: "OU=inutil,DC=inutil,DC=cu"
   ldap_groupattr: "department"
   ldap_groupdesc: "department"
   ldap_memberattr: "sAMAccountName"
   ldap_useruid: "sAMAccountName"
   ldap_userdesc: "cn"
   ldap_rfilter: "(objectClass=user)"
   ldap_filter: "(&(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"
  mod_s2s_dialback: {}
  mod_sic: {}
  mod_stream_mgmt:
    resend_on_timeout: if_offline
  mod_vcard:
    db_type: ldap
    ldap_uids: {"sAMAccountName": "%u"}
    matches: infinity
    ldap_vcard_map:
      "NICKNAME": {"%s": ["givenName"]}
      "FN": {"%s": ["displayName"]}
      "EMAIL": {"%s": ["mail"]}
      "GIVEN": {"%s": ["givenName"]}
      "MIDDLE": {"%s": ["middleName"]}
      "FAMILY": {"%s": ["sn"]}
      "ORGNAME": {"%s": ["company"]}
      "ORGUNIT": {"%s": ["department"]}
      "TITLE": {"%s": ["title"]}
      "TEL": {"%s": ["telephoneNumber"]}
    ldap_search_fields:
      "User": "%u"
      "Full Name": "displayName"
      "Email": "mail"
    ldap_search_reported:
      "Full Name": "FN"
      "Nickname": "NICKNAME"
      "Email": "EMAIL"
  mod_version: {}
allow_contrib_modules: true

Para agregar los usuarios, como podemos ver en el apartado mod_shared_roster_ldap, sólo con añadirlos al ADDC basta y por ahí mismo se activan se desactivan. Al agregar un usuario, debemos darle descripción en el apartado «Propiedades/Organización/Departamento», con el departamento al que pertenece para que salga ordenado en el roster del Ejabberd, cuando se conecten con el Pidgin, Pandion, Spark.

Adjunto la configuración de ejemplo, así como imágenes del sistema funcionando.

Entonces hasta acá es todo. Bastante fácil y de bajo consumo de recursos el Ejabberd. Prueben y comenten.

Espero les sirva.

¿De cuánta utilidad te ha parecido este contenido?

Leslie León Sinclair

Ver comentarios

  • Saludos, este Manual se puede implementar en Debian11, porque he hecho todo lo posible x emplearlo, y nada de nada

  • Uff, cualquier semejanza con "https://www.sysadminsdecuba.com/2019/08/guia-para-la-implementacion-de-servicios-integrados-a-samba4-como-active-directory-domain-controller-ad-dc-en-debian-9-10-parte-7/", debe ser pura coincidencia... ;-) ;-) ;-)

  • Muy buen tutorial.
    Pero sería bueno este procedimiento lo implementen contra openLdap y no Samba.

    Saludos

  • Será esa la razón por la cual a mi no me funciona? Cuando mando a instalar ejabberd me da una bola de errores, algo parecido a lo que siempre me ha sucedido con NTP y en ocasiones con apache2, problemas que he encontrado como solucionarlos, pero en el caso de ejabberd no! Desde donde bajas el .deb? Si sitio oficial de ejabberd??

  • Muy bueno, pero te recomiendo no instalar del repo de debian, que tiene el 18.12, sino bajar el .deb de ejabberd directo, que está por el 20.12...

Compartir
Publicado por
Leslie León Sinclair

Entradas recientes

Alta disponibilidad de sus base de datos con Percona XtraDB Cluster en Kubernetes

Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…

8 meses hace

Home automation (Parte 3) – ESPHome

Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…

1 año hace

Home automation (Parte 2) – Home Assistant

Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…

1 año hace

Home automation (Parte 1)

Desde hace varios meses vengo con la idea de automatizar la casa donde vivo. Poco…

1 año hace

Cocinando una imagen personalizada de OpenWRT

El artículo describe el uso para un caso particular de OpenWRT y la creación de…

1 año hace