PBX virtual. Parte 2: Resuelve problemas de seguridad con Asterisk y configura llamadas



En el artículo anterior, analizamos una instalación simple de una IP PBX (IP PBX) Asterisk 16 desde un repositorio regular en un servidor virtual RuVDS con Ubuntu 20.04 . En tal configuración, no vale la pena exponer el servicio de VoIP al público: es necesario realizar configuraciones adicionales relacionadas, entre otras cosas, con la seguridad de la información.



Definición del modelo de amenazas



Para empezar, averigüemos qué riesgos enfrentará una empresa que haya colocado un PBX virtual en Internet. Toda su diversidad se reduce a una breve lista:



  • filtraciones de datos confidenciales y corrupción de contenido (secuestro de sesiones);
  • acceso no autorizado a los sistemas de información corporativos debido a vulnerabilidades en Asterisk y otro software en el servidor, en particular, debido a una configuración incorrecta;
  • interrupción de PBX virtual debido a ataques de denegación de servicio;
  • revender tráfico después de piratear un PBX (el tipo de ataque más común).


Algunas de las vulnerabilidades están directamente relacionadas con el software Asterisk. Los desarrolladores de IP PBX lanzan parches regularmente y los administradores del sistema solo pueden instalar actualizaciones de manera oportuna. Este método no garantiza una seguridad completa, por lo que también vale la pena limitar el acceso de los clientes al servidor de telefonía IP. Veamos qué se debe hacer para organizar la telefonía segura.



Configurar un cortafuegos



La forma más fácil de protegerse es restringir las conexiones del cliente a un firewall. Dado que VDS tiene una IP real, no es necesario resolver problemas con el tráfico que pasa por NAT. Queda por permitir las conexiones entrantes de los suscriptores y bloquear todas las demás mediante Netfilter . En los servidores virtuales RuVDS con Ubuntu, se configura mediante la utilidad UFW (firewall sin complicaciones) preinstalada . Si no tiene el paquete ufw instalado, es fácil de arreglar:



sudo apt-get install ufw


Primero, verifiquemos el estado:



sudo ufw status verbose


De forma predeterminada, UFW está deshabilitado (Estado: inactivo), pero no debe apresurarse a habilitarlo: si no cambia la configuración, todos los paquetes entrantes comenzarán a ser pirateados en la raíz y perderá el acceso al servidor a través de SSH. Como mínimo, debe permitir conexiones entrantes en el puerto 22, mientras que puede usar el perfil de aplicación OpenSSH preinstalado (ver perfiles: lista de aplicaciones sudo ufw):



#    SSH 
#   IP,   
sudo ufw allow OpenSSH
#    IP (  )
sudo ufw allow from XXX.XXX.XXX.XXX to any port 22
#       IP ()    Asterisk
sudo ufw allow from XXX.XXX.XXX.XXX
#   
sudo ufw enable


Para ver la política de filtrado, use el comando:



sudo ufw status verbose




Para eliminar reglas, debe ver sus números:



sudo ufw status numbered
sudo ufw delete N




Hay otras herramientas para configurar Netfiler (las mismas iptables), pero no debe combinar diferentes utilidades, esto está plagado de problemas. No funcionará sin filtrar el tráfico, porque tu Asterisk no se detendrá durante una hora cuando esté abierto a todos los vientos, ya que aparecerán imágenes tan divertidas en la consola:





Dado que los usuarios remotos están en casa (en teoría), por regla general, tienen una IP dedicada real y no necesitamos nada más. De lo contrario, debes encargarte de crear una red privada virtual segura: también te resultará útil para acceder a otros recursos corporativos que no deben estar expuestos al público. Las defensas más sofisticadas (fail2ban, etc.) no están directamente relacionadas con Asterisk. También los veremos en contexto general en otras publicaciones.



Deshacerse de módulos innecesarios



Esta parte de la configuración no está directamente relacionada con la seguridad, pero generalmente es necesaria. Además, cuantas menos oportunidades brinde su PBX a los clientes, más difícil será piratearlo: la ausencia de funciones innecesarias complicará la vida de posibles intrusos hasta cierto punto.



La funcionalidad mínima de PBX se ve así:



  • Soporte SIP;
  • Soporte para el códec solo alaw G711 (si lo desea, puede agregar todos los códecs disponibles);
  • Grabacion de llamada;
  • Soporte para formato WAV (si lo desea, puede agregar soporte para todos los formatos disponibles);
  • Opcional : soporte para almacenar detalles de llamadas en el servidor de base de datos.


Para administrar el servicio Asterisk de forma interactiva, se utiliza la consola de texto incorporada:



sudo asterisk -rvv


Los archivos de módulo * .so se almacenan en el directorio / usr / lib / asterisk / modules / . La carga y la descarga pueden estar en la consola sin tener que reiniciar el servidor (el nombre del módulo se especifica sin una extensión, por ejemplo, chan_sip en lugar de chan_sip.so ): la configuración del módulo Asterisk se encuentra en el archivo de configuración /etc/asterisk/modules.conf . De forma predeterminada, todos los módulos disponibles se cargan automáticamente al iniciar el servidor, pero esto se puede cambiar fácilmente usando el parámetro autoload = yes | no . Editemos el archivo de configuración, después de hacer una copia de seguridad del archivo de distribución:



module load NAME

module unload NAME








sudo mv /etc/asterisk/modules.conf /etc/asterisk/modules.conf.b
sudo nano /etc/asterisk/modules.conf


Hay dos enfoques de configuración. En el primer caso, habilitamos la carga automática de todos los módulos existentes y deshabilitamos los innecesarios a través de modules.conf (sección [módulos] ): Nota, aquí especificamos el nombre del archivo con la extensión. La segunda opción es deshabilitar la carga automática de todos y especificar solo los módulos necesarios en la sección [módulos] del archivo modules.conf , por ejemplo, así: Después de editar, cambie los derechos de acceso:



[modules]

autoload=yes

noload => module_name.so












[modules]

autoload = no

load => chan_sip.so

load => codec_alaw.so

load => format_wav.so

load => app_dial.so

load => res_musiconhold.so








sudo chown asterisk:asterisk /etc/asterisk/modules.conf
sudo chmod 640 /etc/asterisk/modules.conf




Observamos la lista de módulos cargados en la consola de Asterisk:



module show





Añadimos otros módulos a gusto. Así buscará el archivo modules.conf para configurar una IP PBX con una funcionalidad suficientemente desarrollada:



Contenido de modules.conf
[modules]



autoload=no ; /usr/lib/asterisk/modules/



; VoIP (SIP)

load => chan_sip.so

load => res_sorcery_config.so

load => res_pjproject.so ; res_rtp_asterisk.so

load => res_rtp_asterisk.so

load => app_dial.so ; res_musiconhold.so

load => app_echo.so

load => bridge_simple.so ;

load => app_bridgewait.so

load => app_transfer.so ;

load => app_verbose.so ;

load => app_voicemail.so ; res_adsi.so

load => app_playback.so ;

load => app_stack.so

load => app_confbridge.so ;

load => app_directory.so

load => res_adsi.so

load => app_system.so ;

load => app_queue.so ;



;

load => func_devstate.so

load => app_chanisavail.so ; ChanIsAvail

load => func_cut.so ; cut



;

load => res_musiconhold.so

load => pbx_config.so



;

load => codec_a_mu.so

load => codec_adpcm.so

load => codec_alaw.so

load => codec_ulaw.so

load => codec_gsm.so

load => codec_lpc10.so

load => codec_g726.so

load => codec_g722.so



;

load => format_gsm.so ; Raw GSM data

load => format_h263.so ; Raw h263 data

load => format_pcm.so ; Raw uLaw 8khz Audio support (PCM)

load => format_wav_gsm.so ; Microsoft WAV format (Proprietary GSM)

load => format_wav.so ; Microsoft WAV format (8000hz Signed Linear)

load => format_mp3.so ; mp3-format



; Dahdi ( VDS )

;load => chan_dahdi.so



;

load => res_parking.so



; res_monitor.so,

load => func_periodic_hook.so

load => func_strings.so ; STRFTIME

; CALLERID, res_monitor.so

load => func_callerid.so

load => func_volume.so

;

load => res_monitor.so

load => app_mixmonitor.so ; app_mixmonitor.so app_dial.so

load => func_channel.so



; MySQL ( )

;load => cdr_mysql.so

;load => res_config_mysql.so ; MySQL RealTime Configuration Driver



; MySQL ODBC ( )

;load => res_odbc.so

;load => res_config_odbc.so

;load => cdr_odbc.so ;



; SNMP ( )

;load => res_snmp.so



; /var/spool/asterisk/outgoing/ ( )

;load => pbx_spool.so



; ( )

;load => app_exec.so ; exec execif

;load => app_while.so ; dialplan

;load => res_sorcery_astdb.so

;load => res_sorcery_realtime.so

;load => app_read.so

;load => app_stack.so

;load => cdr_csv.so ; /var/log/asterisk/cdr-csv/Master.csv

;load => func_cdr.so

;load => func_logic.so

;load => func_timeout.so

;load => func_shell.so

;load => pbx_ael.so

;load => res_ael_share.so

;load => res_agi.so

;load => res_speech.so ; res_agi.so





Nota: Puede comentar una línea con un punto y coma.



Después de modificar el archivo modules.conf, debe volver a cargar los módulos desde la consola de Asterisk:



module reload



Si necesita reiniciar Asterisk, use el siguiente comando en lugar de la consola incorporada:



sudo systemctl restart asterisk


Todos los módulos llamados deben estar instalados, de lo contrario, Asterisk fallará al intentar cargarlos. Por ejemplo, para admitir el formato MP3, debe instalar el paquete asterisk-mp3 y, para trabajar con el servidor MySQL, necesitará asterisk-mysql directamente :



sudo apt-get install asterisk-mp3
sudo apt-get install asterisk-mysql


Encontrar paquetes disponibles en el repositorio es fácil usando el comando:



apt-cache search asterisk


De hecho, hay muchos más módulos para Asterisk, no los hemos enumerado todos. Si, por ejemplo, instala un PBX en un servidor físico y desea conectarle líneas analógicas a través de una placa de interfaz de telefonía, necesitará el paquete asterisk-dahdi .



Configurar VoIP



Ahora cambiemos el archivo sip.conf para que podamos trabajar con Asterisk:



sudo nano /etc/asterisk/sip.conf


Agregue las siguientes líneas a la sección [general] , si aún no lo ha hecho: El primer parámetro protege a Asterisk de ataques de fuerza bruta. Si no lo habilita, el servidor informará a los atacantes cuando el suscriptor no existe. Habiendo encontrado un número válido, un hacker puede recurrir a contraseñas de fuerza bruta. Si alwaysauthreject = yes , los errores de autenticación de los suscriptores existentes y no existentes tienen el mismo aspecto y es más difícil adivinar la contraseña. El parámetro allowguest = no prohíbe el llamado. llamadas de invitado a usuarios de PBX. También puede cambiar el puerto que escucha Asterisk a un puerto no estándar usando la directiva bindport (de manera similar, la dirección que escucha el servicio VoIP se configura usando bindaddr ).



alwaysauthreject=yes

allowguest=no








En el archivo sip.conf, tenemos suscriptores registrados (pares - de pares en inglés) PBX. Si el usuario trabaja desde IP fija, vale la pena limitar su conectividad. También es necesario crear contraseñas seguras, introducir un límite en el número de llamadas y, por supuesto, registrar conexiones a proveedores de VoIP externos (los llamados troncales - desde el troncal en inglés):



deny=0.0.0.0/0.0.0.0 ;prohibir conexiones desde todos los nodos

permit=xxx.xxx.xxx.xxx/24 ;permitir conexiones desde una subred específica las

secret=_ ;contraseñas de suscriptor deben ser resistentes a fuerza bruta que

call-limit=2 ; limita el número de llamadas simultáneas



Como resultado, el archivo sip.conf se verá así:



Contenido de Sip.conf
[general]

context=default

allowoverlap=no

udpbindaddr=0.0.0.0

tcpenable=no

tcpbindaddr=0.0.0.0

transport=udp

srvlookup=yes

alwaysauthreject=yes

allowguest=no



; SIPNET c chan_sip

; register

[sipnet]

remotesecret=

defaultuser=

host=sipnet.ru

type=peer

context=sipnet-trunk; dialplan ( extensions.conf)

insecure=invite

callbackextension=s

fromuser=

fromdomain=sipnet.ru

disallow=all

allow=alaw,ulaw

nat=no

directmedia=no

dtmfmode=rfc2833



[office](!)

; , .

; .

type=friend

host=dynamic ; , IP

nat=no ; NAT

deny=0.0.0.0/0.0.0.0 ;

call-limit=2

qualify=yes ; 2

dtmfmode=rfc2833 ; dtmf , rfc2833

; ,

disallow=all

allow=ulaw

allow=alaw

allow=g729

allow=g723

allow=g726

allow=h261

allow=h263

allow=h264

allow=h263p



; () office

[1001](office)

permit=XXX.XXX.XXX.XXX/Netmask

secret=_

callerid= <1001>

context=homeoffice ; dialplan ( extensions.conf)



[1002](office)

permit=YYY.YYY.YYY.YYY

secret=_

callerid= <1002>

context=homeoffice





En este caso, el suscriptor 1001 puede conectarse desde cualquier dirección de una subred específica y 1002, solo desde una IP fija. También proporcionamos a los suscriptores un número, contraseña, nombre y contexto, que se utilizarán en el plan de enrutamiento de llamadas (plan de marcado). Las instrucciones para configurar troncales se toman mejor en los sitios de los proveedores de servicios: en nuestro caso, esto es SIPNET . Los parámetros son similares a los de otros pares: extensiones. Tenga en cuenta también que el contexto especificado en el archivo de configuración (hablaremos de esta entidad a continuación) debe existir en dialplan.



Después de realizar cambios en el archivo de configuración sip.conf , debe reiniciar el módulo SIP a través de la consola Asterisk:



sip reload



Otros comandos de consola incorporados para trabajar con el módulo SIP:



sip show peers- mostrar el estado de todos los troncales / pares;

sip show registry- visualización de todos los registros;

sip show channels- visualización de canales activos;

sip show settings- visualización de la configuración global del módulo SIP.





Dialplan y todo para todos



El plan de enrutamiento de llamadas o plan de marcado a menudo se conoce como el corazón de Asterisk. Se almacena en el archivo /etc/asterisk/extensions.conf y es esencialmente un script que hace que la PBX responda a eventos externos. Los scripts del plan de llamadas se pueden escribir en diferentes idiomas, pero consideraremos el integrado, que apareció en las primeras versiones de la popular IP PBX. Después de configurar e iniciar Asterisk, habrá algo de contenido en el archivo extensions.conf . Reemplazémoslo con el nuestro: La sintaxis del script es bastante sencilla, entraremos en más detalles en el próximo artículo. Tenga en cuenta solo que el plan de llamadas de Asterisk se basa en cuatro conceptos centrales:



[general]

static=yes

writeprotect=no

priorityjumping=no

autofallthrough=yes

clearglobalvars=no



;

[default]

exten => _X.,1,NoOp()

same => n,Busy()

same => n,HangUp()



; homeoffice

[homeoffice]

;

exten => _1XXX,1,Dial(SIP/${EXTEN})

; SIPNET

exten => _.7XXXXXXXXXX,1,Dial(SIP/${EXTEN}@sipnet)



; sipnet-trunk, SIPNET

[sipnet-trunk]

;








  • Contextos : comunicación con nombres (los nombres están entre corchetes) partes del código: conjuntos de instrucciones;
  • (extensions) — , exten;
  • — , ( ) ( n — next). exten same;
  • (applications) — . , Dial — , .


Las extensiones clasifican las llamadas por una máscara usando un conjunto de patrones, comenzando con un guión bajo; hace que nuestra PBX entienda que estamos hablando de un patrón:



exten => _1XXX,1,Dial(SIP/${EXTEN})



A continuación, se indica la prioridad y la llamada de la aplicación con el paso de argumentos es bastante simple.



Reinicie el plan de marcado usando la consola de Asterisk:



dialplan reload



Para ver el plan de marcado actual, use el comando:



dialplan show







Tenga en cuenta que, por ejemplo, los módulos que ha cargado pueden realizar cambios en el plan de marcado.



Ahora el PBX permite a los suscriptores internos comunicarse entre sí, así como hacer llamadas externas dentro de Rusia a través de SIPNET. Esto no es mucho, pero es suficiente para la segunda lección. En la configuración actual, se ha utilizado el módulo chan_sip obsoleto , que eventualmente se descontinuará en Asterisk. En el próximo artículo veremos la migración a la biblioteca PjSIPpara trabajar con la pila de protocolos de VoIP, así como ampliar el plan de marcado para recibir llamadas entrantes, organizar conferencias y resolver otras tareas de enrutamiento de llamadas. Los lectores atentos pueden haber notado que algunos de los módulos cargados no se usaron en los ejemplos: los necesitaremos para aprender a grabar llamadas, crear colas y hacer otros trucos interesantes.





Lea nuestro blog)










All Articles