Enviado por admin el
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.
Se presiona el botón “Sign in”:
Se acepta el certificado. El resultado:
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.
4 comentarios
Extensions y demas
Enviado por Arnulfo (no verificado) el
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
Re: Extensions y demas
Enviado por admin el
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
Uso con GUI
Enviado por Diego Espitia (no verificado) el
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.
Implementacion en Asterisk 13
Enviado por rennaser el
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).