Asterisk 11.X y la configuración de las extensiones SIP en OpenLDAP

En este articulo veremos como instalar un servidor LDAP (OpenLDAP) y como configurar las extensiones SIP directamente en ese servidor. El mismo servidor LDAP se podrá utilizar también para configurar usuarios XMPP de forma que el mismo usuario tendrá una cuenta SIP y una cuenta XMPP (en el servidor Ejabberd que se instalará). Algunos datos de la instalación:

  • Asterisk 11.13.0
  • Servidor de Digital Ocean 1GB RAM
  • CentOS 6.5 64 bit
  • Ejabberd

Primero se crea un Droplet en DO y se accede vía SSH. Primero se actualiza el sistema:

yum update -y

Se instalan los repositorios EPEL que luego se utilizarán para la instalación de algunas dependencias para una correcta instalación de Ejabberd:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Se instala el editor nano y el programa wget:

yum install nano wget -y

Se configura la zona horaria:

rm /etc/localtime

ln -s /usr/share/zoneinfo/America/Bogota /etc/localtime

El idioma (Español de Colombia):

nano /etc/sysconfig/i18n

Se modifica esta línea:

LANG="en_US.UTF-8"

para que quede (en el caso de Colombia):

LANG="es_CO.iso88591"

Se instala el paquete del network time protocol que se utiliza para tener siempre actualizada la hora del servidor:

yum install ntp -y

Se configura para que arranque en automático:

chkconfig ntpd on

Se inicia:

service ntpd start

Se crea la partición de Swap ya que no viene por defecto:

dd if=/dev/zero of=/swapfile bs=1024 count=512k

mkswap /swapfile

swapon /swapfile

Se configura la partición de swap para que arranque con el sistema:

nano /etc/fstab

al final del archivo se añade la línea que sigue:

/swapfile swap swap defaults 0 0

Se cambian los permisos del archivo recién creado:

chmod 0600 /swapfile

Se reinicia el sistema:

reboot

ASTERISK 11.13.0

Se vuelve a acceder al servidor vía SSH y se instala Asterisk. Primero unas cuantas dependencias:

yum install libvorbis libvorbis-devel vorbis-tools libogg libogg-devel -y

yum install curl curl-devel libidn-devel -y

yum install gcc ncurses-devel make gcc-c++ compat-libtermcap zlib-devel libtool bison-devel -y

yum install bison openssl-devel bzip2-devel wget newt-devel subversion flex gtk2-devel -y

yum install mysql mysql-server mysql-devel -y

yum install unixODBC unixODBC-devel mysql-connector-odbc libtool-ltdl-devel -y

yum install sqlite sqlite-devel -y

yum install libuuid libuuid-devel uuid uuid-devel -y

yum install speex-devel wavpack-devel flac-devel -y

yum install sox* -y

yum install libtiff libtiff-devel libxml2 libxml2-devel spandsp* -y

yum install gnutls gnutls-devel gnutls-utils iksemel* -y

OpenLDAP:

yum install compat-openldap openldap openldap-clients openldap-devel openldap-servers -y

SNMP:

yum install net-snmp net-snmp-devel net-snmp-libs net-snmp-utils -y

LibiCAL y Neon:

yum install libical* neon* -y

LIBSRTP:

cd /usr/src

yum install git -y

git clone https://github.com/cisco/libsrtp libsrtp
cd libsrtp
./configure --prefix=/usr CFLAGS=-fPIC --libdir=/usr/lib64
make
make runtest
make install

Se descarga la versión 11.13.0 de Asterisk:

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11.13.0.ta...

tar -xf asterisk-11.13.0.tar.gz
cd asterisk-11.13.0
./configure --libdir=/usr/lib64
make
make install
make samples
make config

 

EJABBERD 14.07

Se descarga y instala el servidor Ejabberd y algunas dependencias:

yum install libyaml-devel -y

cd /usr/src

wget http://www.process-one.net/downloads/downloads-action.php?file=/ejabberd...

mv downloads-action.php\?file\=%2Fejabberd%2F14.07%2Fejabberd-14.07-linux-x86_64-installer.run ejabberd-14.07-linux-x86_64-installer.run

chmod +x ejabberd-14.07-linux-x86_64-installer.run

./ejabberd-14.07-linux-x86_64-installer.run

Se contestan las preguntas como sigue:

Please select the installation language
[1] Dutch - Nederlands
[2] English - English
[3] French - Français
[4] German - Deutsch
[5] Russian - ???????
[6] Simplified Chinese - ????
[7] Spanish - Español
Please choose an option [2] : 7

¿Acepta esta licencia? [y/n]: y

Directorio de instalación [/opt/ejabberd-14.05]: /opt/ejabberd

dominio del servidor ejabberd [sip20.voztovoice.org]:

Nombre de usuario de administrador [admin]:

Contraseña de administrador :
Teclea de nuevo la contraseña :
Cluster [y/N]: n

¿Desea continuar? [Y/n]: y

Instalando
0% ______________ 50% ______________ 100%
#########################################

¿Quiere ver el archivo Léeme? [Y/n]: n

OPENLDAP

Mientras antes la configuración de OpenLDAP se realizaba en el archivo slapd.conf ahora la configuración se basa en algunos archivos distintos, algunos de los cuales hay que modificar.

Primero se crea una contraseña para el administrador de OpenLDAP(sesamo):

slappasswd
New password:
Re-enter new password:
{SSHA}V9AX7hL/fJ+9Mv/XV3QkfRvFhkr8USsN

Se configura el administrador y el sufijo del árbol de OpenLDAP (que normalmente corresponde al dominio configurado en el servidor):

nano /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif

se cambian estas líneas:

olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com

para que queden:

olcSuffix: dc=voztovoice,dc=org
olcRootDN: cn=Manager,dc=voztovoice,dc=org

Modificar voztovoice y org con el nombre de su dominio.

Después de la segunda línea se añade la que sigue que  contiene la contraseña cifrada que se ha creado anteriormente:

olcRootPW: {SSHA}V9AX7hL/fJ+9Mv/XV3QkfRvFhkr8USsN

Se continua definiendo quien tendrá acceso de lectura/escritura a el servidor OpenLDAP:

nano /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif

Se modifica esta línea:

olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read  by dn.base="cn=manager,dc=my-domain,dc=com" read  by * none

para que quede:

olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read  by dn.base="cn=Manager,dc=voztovoice,dc=org" read  by * none

en negrita los cambios. Se vuelve a modificar el primer archivo:

nano /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif

y al final se añaden las dos líneas que siguen que limitan la posibilidad de ver las contraseñas cifradas de los demás usuarios:

olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=Manager,dc=voztovoice,dc=org" write by anonymous auth by * none
olcAccess: {1}to * by dn.base="cn=Manager,dc=voztovoice,dc=org" write by self write by * read

Se guardan lo cambios y se configura OpenLDAP para que arranque en automático:

chkconfig slapd on

Se inicia:

service slapd start

Iniciando slapd: [ OK ]

Se añade el esquema LDAP de Asterisk que luego nos permitirá configurar la extensiones SIP:

cp /usr/src/asterisk-11.13.0/contrib/scripts/asterisk.ldap-schema /etc/openldap/schema/asterisk.schema

ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/src/asterisk-11.13.0/contrib/scripts/asterisk.ldif

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=asterisk,cn=schema,cn=config"

Se reinicia:

service slapd restart

Los pasos a seguir son:

  • crear una organización
  • crear una unidad operativa dentro de la organización
  • añadir el primer usuario

Primero la organización:

cd /tmp

nano voztovoice.ldif

se copian las siguientes líneas (modificar el nombre de dominio):

dn: dc=voztovoice,dc=org
objectClass: dcObject
objectClass: organization
dc: voztovoice
o : voztovoice

Se guardan los cambios y se carga el archivo al servidor LDAP:

ldapadd -f voztovoice.ldif -D cn=Manager,dc=voztovoice,dc=org -w sesamo

Para averiguar que la organización se ha añadido al árbol LDAP:

ldapsearch -x -LLL -b dc=voztovoice,dc=org

dn: dc=voztovoice,dc=org
objectClass: dcObject
objectClass: organization
dc: voztovoice
o: voztovoice

Se continua con la unidad operativa dentro de la organización (usuarios):

nano unidad.ldif

Se copian las siguientes líneas:

dn: ou=usuarios,dc=voztovoice,dc=org
objectClass: organizationalUnit
ou: usuarios

Se guardan los cambios y se añade a LDAP:

ldapadd -f unidad.ldif -D cn=Manager,dc=voztovoice,dc=org -w sesamo

Se termina con la creación del primer usuario/extensión:

nano 1001.ldif

Se copian las siguientes líneas:

dn: cn=1001,ou=usuarios,dc=voztovoice,dc=org
objectClass: inetOrgPerson
objectClass: AsteriskSIPUser
uid: 1001
sn: 1001
givenName: voztovoice
displayName: voztovoice
userPassword: sesamo
mail: campus@voztovoice.org
AstAccountCallerID: 1001
AstAccountContext: externas
AstAccountDTMFMode: rfc2833
AstAccountMailbox: 1001@defult
AstAccountNAT: force_rport,comedia
AstAccountQualify: yes
AstAccountType: friend
AstAccountDisallowedCodec: all
AstAccountAllowedCodec: ulaw,alaw
AstAccountMusicOnHold: default
AstAccountHost: dynamic

Se carga al servidor LDAP:

ldapadd -f 1001.ldif -D cn=Manager,dc=voztovoice,dc=org -w sesamo

Se averigua que se haya cargado correctamente:

ldapsearch -x -LLL -b dc=voztovoice,dc=org

Si hay que añadir muchos usuarios o para modificar los usuarios creados, se pueden utilizar aplicaciones externas que se conectan al servidor OpenLDAP y cualquier tipo de configuración. un ejemplo es: Apache Directory Studio

 

Configuración ASTERISK

Terminada esta parte se pasa a la configuración de Asterisk. Los archivos que hay que modificar son tres:

  • extconfig.conf
  • res_ldap.conf
  • sip.conf

Se modifica el primero:

nano /etc/asterisk/extconfig.conf

se cambia esta línea:

;sippeers => odbc,asterisk

para que quede:

sippeers => ldap,"dc=voztovoice,dc=org",sip

Se guardan los cambios y se renombra el archivo res_ldap.conf

mv /etc/asterisk/res_ldap.conf /etc/asterisk/ldap.conf.old

Se crea uno nuevo:

nano /etc/asterisk/res_ldap.conf

Se copian las líneas que siguen:

[_general]
host=127.0.0.1
port=389
protocol=3                 .
basedn=dc=voztovoice,dc=org
user=cn=Manager,dc=voztovoice,dc=org
pass=sesamo

[sip]
name = cn
amaflags = AstAccountAMAFlags
callgroup = AstAccountCallGroup
callerid = AstAccountCallerID
directmedia = AstAccountDirectMedia
context = AstAccountContext
dtmfmode = AstAccountDTMFMode
fromuser = AstAccountFromUser
fromdomain = AstAccountFromDomain
fullcontact = AstAccountFullContact
fullcontact = gecos
host = AstAccountHost
insecure = AstAccountInsecure
mailbox = AstAccountMailbox
md5secret = AstAccountRealmedPassword
nat = AstAccountNAT
deny = AstAccountDeny
permit = AstAccountPermit
pickupgroup = AstAccountPickupGroup
port = AstAccountPort
qualify = AstAccountQualify
restrictcid = AstAccountRestrictCID
rtptimeout = AstAccountRTPTimeout
rtpholdtimeout = AstAccountRTPHoldTimeout
type = AstAccountType
disallow = AstAccountDisallowedCodec
allow = AstAccountAllowedCodec
MusicOnHold = AstAccountMusicOnHold
regseconds = AstAccountExpirationTimestamp
regcontext = AstAccountRegistrationContext
regexten = AstAccountRegistrationExten
CanCallForward = AstAccountCanCallForward
ipaddr = AstAccountIPAddress
defaultuser = AstAccountDefaultUser
regserver = AstAccountRegistrationServer
lastms = AstAccountLastQualifyMilliseconds
additionalFilter=(objectClass=AsteriskSIPUser)

Se guardan los cambios y modifica el sip.conf:

nano /etc/asterisk/sip.conf

se cambia esta línea:

rtcachefriends=no

para que quede

rtcachefriends=yes

Se guardan los cambio y se inicia Asterisk:

service asterisk start

se averigua que el modulo esté funcionando correctamente:

asterisk -rvvvvvvvvvvvvvvvv

CLI> realtime show ldap status

Connected to 'ldap://127.0.0.1:389', baseDN dc=voztovoice,dc=org with username cn=Manager,dc=voztovoice,dc=org for 23 seconds.

Por ultimo se configura un softphone con la extensión 1001 creada en LDAP y se averigua que se registre correctamente:

CLI> sip show peers

Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                 Realtime
1001/1001                 186.112.217.93                           D         Yes                       Yes            19432    OK (118 ms)                                  Cached RT

 

Configuración EJABBERD

Ahora se completa la configuración del servidor Ejabberd para que funcione con LDAP:

nano /opt/ejabberd/conf/ejabberd.yml

Se modifica esta línea:

auth_method: internal

para que quede comentada:

## auth_method: internal

se elimina este bloque:

## Authentication using LDAP
##
## auth_method: ldap
##
## List of LDAP servers:
## ldap_servers:
##   - "loalhost"
##
## Encryption of connection to LDAP servers:
## ldap_encrypt: none
## ldap_encrypt: tls
##
## Port to connect to on LDAP servers:
## ldap_port: 389
## ldap_port: 636
##
## LDAP manager:
## ldap_rootdn: "dc=example,dc=com"
##
## Password of LDAP manager:
## ldap_password: "******"
##
## Search base of LDAP directory:
## ldap_base: "dc=example,dc=com"
##
## LDAP attribute that holds user ID:
## ldap_uids:
##   - "mail": "%u@mail.example.org"
##
## LDAP filter:
## ldap_filter: "(objectClass=shadowAccount)"

y se pega:

## Authentication using LDAP
auth_method: ldap
## List of LDAP servers:
ldap_servers:
   - "127.0.0.1"
ldap_encrypt: none
ldap_port: 389
ldap_rootdn: "cn=Manager,dc=voztovoice,dc=org"
ldap_password: "sesamo"
ldap_base: "ou=usuarios,dc=voztovoice,dc=org"
ldap_uids:
   - "displayName": "%u"

El campo que se utilizará para registrarse al servidor XMPP será el contenido en el parametro displayName Se guardan los cambios y se inicia el servidor XMPP:

/opt/ejabberd/bin/start

Se averigua que esté corriendo:

/opt/ejabberd/bin/status
The node ejabberd@localhost is started with status: started
ejabberd community is running in that node

Se para:

/opt/ejabberd/bin/stop

Se instala el script del servicio:

cp /opt/ejabberd/bin/ejabberd.init /etc/init.d/ejabberd

chmod +x /etc/init.d/ejabberd

Se abre:

nano /etc/init.d/ejabberd

Después de esta línea:

#! /bin/sh

se añade:

# ejabberd Startup script for the ejabberd XMPP Server
# chkconfig: - 99 10
. /etc/init.d/functions

Se modifica esta línea:

USER=ejabberd

para que quede:

USER=root

Se guardan los cambios y se termina la configuración:

chkconfig --add ejabberd

chkconfig ejabberd on

Se inicia nuevamente:

service ejabberd start

Starting ejabberd...
done.

Ahora se registra el usuario creado en LDAP que tendrá estos valores:

nombre: voztovoice
password: sesamo

Se utilizará Jitsi.

Captura

Se presiona el botón “Sign in”:

Captura

Se acepta el certificado. El resultado:

Captura

De esta forma tendremos nuestro servidor LDAP configurado para las extensiones SIP y los usuarios XMPP. Les recuerdo que con LDAP en Asterisk Realtime, es posible configurar también extensiones IAX2 y el Dialplan.

Comentarios

Hola Andrea , dado que nunca me he dado la tarea de probar asterisk en realtime , crees que se pueda usar la parte sip.conf en ldap y el dialplan, features, agents , voicemail de manera normal y no en realtime.

sldss

Hola,

el Realtime dinámico te permite guardas los "objetos" en una base de datos y al mismo tiempo en los archivos de configuración. Esto quiere decir que puedes tener extensiones SIP configuradas en el archivo sip.conf y extensiones SIP configuradas en el servidor LDAP. Las dos funcionarán.

El hecho que configures las extensiones SIP en LDAP Realtime no significa que estás obligado a guardar en Realtime las demás cosas.

Espero haberme explicado.

Saludos

Buen día,
Actualmente tengo mas de 2000 extensiones configuradas en un servidor asterisk y dado que es bastante dificil manejarlas con asterisk puro, instalamos FreePBX.
Habrá alguna manera de que FreePBX tome el CallerID de LDAP y lo presente en la pantalla del usuario llamado?
Aparte probé todo lo expuesto aquí y funciona perfecto, pero al crear un dispositivo en sip.conf empieza a crear fallas con el dispostivo conectado con LDAP.

Hola buenas tardes.

Estoy implementando la conexión entre Asterisk 13 y LDAP y me encuentro con el problema que ahora Asterisk hace el cálculo del MD5 usando tres variables concatenadas (user:realm:secret). Esto me genera incovenientes ya que el userPassword de LDAP solo calcula el MD5 sobre la contraseña y no usa otros campos.

Alguien tiene idea cómo editar el código fuente de Asterisk para que sólo calcule el MD5 usando el secret??? se que esto está definido en chan_sip.c

En esta página está la forma en que calcula el MD5 Asterisk ahora. https://www.voip-info.org/wiki/view/Asterisk+sip+md5secret

El servidor LDAP contra el que me autentico está funcionando con muchos usuarios y servicios ya implementados, por lo que no puede hacer grandes cambios sobre él.

Por otro lado, les comento que la autenticacion de los usuarios SIP me funciona correctamente usando secret en texto plano o haciendo el hashing md5 usando las tres variables que nombré (pero esto no me sirve para un entorno de producción).