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.







No comments yet