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/[email protected]/" \
    -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: "[email protected]"
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:
       - "[email protected]"

  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?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.9 / 5. Recuento de votos: 7

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

7 comentarios

  1. Firefox 99.0 Firefox 99.0 Windows 7 x64 Edition Windows 7 x64 Edition
    Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0

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

  2. Firefox 85.0 Firefox 85.0 GNU/Linux x64 GNU/Linux x64
    Mozilla/5.0 (X11; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0

    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… 😉 😉 😉

  3. Firefox 85.0 Firefox 85.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0

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

    Saludos


  4. Warning: Undefined array key 1 in /var/www/html/sysadminsdecuba/wp-content/plugins/wp-useragent/wp-useragent-detect-os.php on line 668
    Firefox 84.0 Firefox 84.0 Ubuntu x64 Ubuntu x64
    Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0

    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??

  5. SeaMonkey 2.53.5.1 SeaMonkey 2.53.5.1 GNU/Linux x64 GNU/Linux x64
    Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 SeaMonkey/2.53.5.1

    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…

Responder a Fredy Mendez Cancelar la respuesta

Tu dirección de correo electrónico no será publicada.


*