Volver al blog

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

images

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.

Suscríbete · Newsletter

Mantente al día, cada semana

Artículos prácticos sobre Linux, redes, seguridad, virtualización y la nube — escritos por sysadmins cubanos.

  • Guías y tutoriales de administración de sistemas
  • Nuevos artículos sobre servidores, redes y nube
  • Sin spam, cancela cuando quieras

Respetamos tu bandeja de entrada. Cancela con un clic.

Patrocinado por SYSCU

¿Tu infraestructura en la nube te cuesta de más?

SYSCU optimiza tu nube de punta a punta — FinOps, DevOps & CI/CD, migraciones a AWS, seguridad y observabilidad. Equipo 100 % senior que reduce tu factura hasta un 40 % y acelera tus despliegues en semanas.

Nuevo · BetaSYSCU Atlas Insight — la plataforma FinOps que convierte tu gasto AWS en decisiones: visibilidad multi-cuenta, recomendaciones automáticas y alertas de anomalías.

No comments yet