RTPBleed et Asterisk : les appels d’Asterisk sous écoute

Asterisk souffre d’un problème assez grave permettant à un attaquant d’écouter simplement vos conversations. Une attaque de l’homme du milieu (man-in-the-middle), sans être vraiment au milieu d’ailleurs, permet de redirriger les flux RTP assez facilement.

Asterisk souffre d’un problème assez grave permettant à un attaquant d’écouter simplement vos conversations. Une attaque de l’homme du milieu (man-in-the-middle), sans être vraiment au milieu d’ailleurs, permet de rediriger les flux RTP assez facilement.

L’annonce a été faite il y a quelques jours (31/08/2017). Il s’agit en fait d’un vieux bug datant de 2011 qui a été réintroduit au premier trimestre 2013. Le premier report annonçant la régression date de mai dernier ainsi que le patch (fournit pour test). L’annonce officielle a été faite le 31 août dernier.

Quelles sont les versions vulnérables ?

Toutes les versions d’Asterisk entre la 11.4.0 à la 14.6.1 sont malheureusement touchées.

Dans quel cas le serveur Asterisk est vulnérable ?

Quand le serveur Asterisk fonctionne avec des postes derrière un routeur NAT, il est nécessaire de mettre en oeuvre des actions afin de router correctement les paquets voix. Le protocole SIP s’appuie sur le protocole RTP afin de transporter la voix et le protocole SDP afin que les user-agents (UA) puissent négocier entre eux des éléments comme les codecs, adresses et ports. Ces éléments sont échangés en clair sur le réseau.
Pour permettre ces négociations, le serveur Asterisk est configuré (fichier sip.conf) avec les options nat=yes et strictrtp=yes. De plus, ces options sont configurées ainsi par défaut !

Comment exploiter la faille ?

Un attaquant doit envoyer des paquets RTP au serveur Asterisk sur un port alloué pour recevoir un flux RTP. Si le serveur est vulnérable, alors le serveur Asterisk répond à l’assaillant en relayant les paquets RTP du destinataire véritable. Il est ensuite aisé avec des outils comme Wireshark de décoder le flux audio.

Quelles sont les actions de mitigation envisageable ?

  • La première recommandation est de ne pas transporter les flux SIP et RTP sur internet en clair, mais d’utiliser un tunnel VPN. Si cela n’est pas possible pour diverses raisons bonnes ou mauvaises, voici d’autres solutions :
  • application du patch fournit par Asterisk (https://raw.githubusercontent.com/kapejod/rtpnatscan/master/patches/asterisk/too-short-rtcp-bugfix.diff) qui actuellement limite la fenêtre temps de l’attaque aux toutes premières millisecondes.
  • éviter l’option nat=yes si possible
  • chiffrer les flux RTP avec SRTP (je vous invite aussi à chiffrer les flux SIP et à utiliser le protocole de transport TCP uniquement pour ce dernier afin de fiabiliser les échanges au lieu de l’UDP)
  • ajouter une option de configuration à vos peers SIP afin de prioriser les paquets RTP venant de l’adresse IP apprises au travers de l’échange initial effectué via le protocole SIP.

Par ailleurs, si vos postes IP et vos fournisseurs de trunk SIP utilisent des adresses IP fixes et connues, la mise en oeuvre d’une règle sur votre firewall bloquant l’accès aux ports UDP 10000 à 20000 (ports RTP utilisés par défaut par un serveur Aterisk) uniquement à partir de ces adresses apporte une protection suffisante.

Comment vérifier si mon serveur Asterisk est vulnérable ?

L’outil rtpnatscan permet de tester votre serveur Asterisk.

Références :

Nouveaux postes SIP Digium : D6x

Digium vient d’annoncer la sortie de nouveaux postes SIP, les D6x qui viennent compléter la gamme IP Phones de Digium. Les modèles sont au nombre de 3, le D60 étant l’entrée de gamme, le D62 le milieu de gamme avec port gigabit et le D65 représentant le haut de gamme.

Les prix annoncés sont les suivants : D60 – $139 USD, D62 – $189 USD, et D65 – $239 USD.

A voir maintenant leurs qualités face à des postes Yealink ou Snom ayant fait leurs preuves !

Source : New Digium IP Phones are Now Available

Règles iptables afin de bloquer les scanners SIP

Les serveurs SIP (Asterisk, FreeSwitch … mais aussi les serveurs propriétaires) sont constamment scannés par des automates ou des humains avec pour seule idée, découvrir une faille à exploiter. En effet, les enjeux financiers sont importants.
Je partage avec vous ce jour, un script iptables pour bloquer les scanners SIP (à adapter notamment les ports si vous utilisez des différents de 5060).

iptables -N SIPDOS

iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sundayddr” –algo bm –to 65535 -m comment –comment “deny sundayddr” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sipsak” –algo bm –to 65535 -m comment –comment “deny sipsak” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sipvicious” –algo bm –to 65535 -m comment –comment “deny sipvicious” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “friendly-scanner” –algo bm –to 65535 -m comment –comment “deny friendly-scanner” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “iWar” –algo bm –to 65535 -m comment –comment “deny iWar” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sip-scan” –algo bm –to 65535 -m comment –comment “deny sip-scan” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: sipcli” –algo bm –to 65535 -m comment –comment “deny sipcli” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: Nmap NSE” –algo bm –to 65535 -m comment –comment “deny Nmap NSE” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: VaxSIPUserAgent” –algo bm –to 65535 -m comment –comment “deny VaxSIPUserAgent” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “From: sipp <sip:” –algo bm –to 65535 -m comment –comment “deny sipp” -j SIPDOS

iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sundayddr” –algo bm –to 65535 -m comment –comment “deny sundayddr” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sipsak” –algo bm –to 65535 -m comment –comment “deny sipsak” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sipvicious” –algo bm –to 65535 -m comment –comment “deny sipvicious” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “friendly-scanner” –algo bm –to 65535 -m comment –comment “deny friendly-scanner” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “iWar” –algo bm –to 65535 -m comment –comment “deny iWar” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sip-scan” –algo bm –to 65535 -m comment –comment “deny sip-scan” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: sipcli” –algo bm –to 65535 -m comment –comment “deny sipcli” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: Nmap NSE” –algo bm –to 65535 -m comment –comment “deny Nmap NSE” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: VaxSIPUserAgent” –algo bm –to 65535 -m comment –comment “deny VaxSIPUserAgent” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “From: sipp <sip:” –algo bm –to 65535 -m comment –comment “deny sipp” -j SIPDOS

iptables -A SIPDOS -j LOG –log-prefix “firewall-sipdos: ” –log-level 6
iptables -A SIPDOS -j DROP

Si vous avez des idées pour l’améliorer, toutes les suggestions sont les bienvenues, l’idée étant de faciliter la sécurisation des serveurs SIP au plus grand nombre.

Mises à jour :

  • 4 août 2016 : ajoût de règles + correction typo suite au commentaire de Ztur

Nouvelle version d’Astlinux 1.2.2 supportant Asterisk 13

Astlinux 1.2.2 vient de sortir. Découvrez les nouveautés d’un IPBX Asterisk embarqué et sécurisé prêt à l’emploi.

L’équipe d’Astlinux vient de sortir une nouvelle version. En dehors des habituelles corrections de bugs ou autres correctifs de sécurité (glibc « GHOST » et OpenSSL), mises à jour (noyau 3.2.66 et Asterisk) et améliorations de l’interface web, la grande nouveauté vient de la prise en charge de Asterisk 13 incluant la stack PJSIP. Toutes les versions d’Astlinux 1.2.2 (version d’Asterisk 1.8 , 11 et 13) intègrent aussi l’application de monitoring monit.

Créer votre serveur Asterisk : dans Linux Pratique été 2015

Le nouveau Linux Pratique vient de sortir avec un article intitulé « Créez votre serveur Asterisk ». Lisez attentivement cet article, et ensuite je vous invite à découvrir pour ceux qui ne connaissent pas encore 2 solutions top basées sur Asterisk :

  • Xivo : une solution créée et éditée par une entreprise française, Avencall. XiVo est une solution complète permettant de déployer un IPBX d’entreprise avec toutes les fonctionnalités nécessaires. L’interface d’administration est claire et complète et le nouveau XiVo Client (bandeau utilisateur permettant de gérer la présence, l’annuaire, le tchat, l’envoi de fax et les renvois de poste) est pratique et agréable. XiVo est construit sur une plateforme Debian et est dédié à être installé sur un serveur (vous pouvez aussi acheter un serveur avec XiVo pré installé).
  • Astlinux : une solution alternative plutôt orientée pour les TPE mais qui connaissent déjà Asterisk. Astlinux fournit une plateforme sécurisée intégrant Firewall, VPN, routage, QoS ainsi qu’une interface web légère. Les utilisateurs disposent d’un accès web dédié permettant de gérer renvois, messagerie vocale, annuaire. Mais pour gérer les appels, vous devrez savoir programmer le dialplan Asterisk (c’est pas bien compliqué non plus). Astlinux fonctionne sur un OS Linux embarqué et très léger avec pour objectif d’être installé sur des mini serveur comme les soekris.

Dans ce numéro de Linux Pratique Juillet / Août 2015, vous avez aussi un article sur une plateforme de CMS basée sur Django, Mezzanine. Je vous recommande cette solution, du Python, du PostgreSQL et une bonne VM et vous pouvez accueillir des milliers de visiteurs sur votre site. Django, le célèbre framework Python, intègre toutes les briques essentielles, et cela nativement afin de sécuriser les applications web. L’installation est super simple (pip install mezzanine) et pour créer un nouveau projet, vous devez taper 2 commandes supplémentaires (qui ne sont pas plus compliquées). Je vous invite à regarder les sites existants fonctionnant sous Mezzanine ainsi que la démonstration (surtout la partie admin, car la partie front est un peu pourrie par les utilisateurs !!!). Et pour les habitués de WordPress, il existe aussi des thèmes pour Mezzanine CMS disponibles en téléchargement (gratuits et payants). En voici un que j’aime bien qui s’appelle Singularity :

thème Mezzanine CMS Singularity Django

Et je profite de cet apparté sans grand rapport avec Asterisk (un peu quand même, on pourrait utiliser Django pour faire un GUI sympa à Asterisk pour des applications spécifiques comme je le fais pour FreeSwitch), pour vous présenter un premier lien regroupant l’ensemble des solutions CMS basées sur le framework Django et les solutions de blog basées aussi sur Django. Je vous recommande Zinnia, développé par un Français. J’ai hésité à migrer mon blog vers sa solution, mais je manque de temps (et il faut que je change d’hébergement !)

Zinnia blog CSM Django

Je vous laisse maintenant acheter ce magazine en ligne ou chez votre marchande de journaux, un bon petit numéro pour avoir un peu de lecture saine (pas Voici ou Mickey) sur la plage cet été.

SIP : comment débugger ?

Table des matières

Introduction

Votre nouveau serveur VoIP est en place. Mais pour une raison que vous ignorez vos appels ne fonctionnent pas comme prévus. Pas de panique, je vais vous présenter quelques outils en ligne de commande qui vont vous aider à déterminer la source du problème. En effet, le protocole SIP n’est pas toujours aussi simple à l’usage que dans la théorie. Les informations fournies par les systèmes de téléphonie Open Source (Asterisk, Freeswitch, Yate …) ou propriétaires ne sont pas toujours d’une grande aide (manque de lisibilité, de souplesse …).

Pourquoi des outils en ligne de commande : l’installation est simple et très rapide, fonctionnent sur toutes les distributions linux, et l’information souhaitée est facilement et rapidement accessible. Il est tout à fait possible d’utiliser ces outils afin de sauvegarder les informations collectées dans un fichier afin de réaliser des analyses plus fines avec des logiciels intégrant une interface graphique, comme le renommé Wireshark.

Pré requis

Vous vous êtes assuré de la bonne configuration de vos comptes SIP (du moins sur le papier), que le routage (diaplan) est correctement fait et que les appels sont possibles (droits d’accès à la route bien affectés, balance financière positive …). Si pour vous, vous ne voyez pas de loup à cette étape, nous allons entrer dans le dur.

Procédure

Je vais maintenant vous expliquer comment trouver de manière efficace la source du problème. Nous allons du plus général vers le plus détaillé. Tout d’abord, vérifier que les échanges de messages SIP se passent comme prévus (je ne vais pas les rappeler ici, je vous laisse ressortir vos cours. J’écrirais peut-être un de ces jours un article les détaillants) : enregistrement, établissement d’un appel, raccroché de l’appel. Si une des étapes est manquantes, il va falloir trouver des informations détaillées. Nous allons voir ces étapes dans le paragraphe suivant.

Comment tracer les messages SIP

Nous allons dans un premier temps vérifier que les messages SIP échanger sont conforment. Nous n’avons pas besoin de tout le détail, juste du type de message SIP (100, 180, 407, 404 …). On va ainsi pouvoir voir très simplement à quelle étape le problème se pose. Le serveur distant souhaite que le compte soit enregistrer avant d’autoriser un appel (merde, on m’avait dit que c’était une authentification par IP ?), le serveur distant vous répond par un bon 404 ? …

Pour cela, je vais utiliser tshark, outil renommé de tout bon administrateur linux. Il utilise la librairie pcap pour capturer le traffic de l’interface déclarée (avec l’option -i) et affiche (ou enregistre dans un fichier avec l’option -w) les informations décodées de paquets capturés. Les fichiers de capture créés peuvent être lus par Wireshark.

Nous allons utiliser toute la puissance de filtrage de tshark afin de trouver l’information souhaitée. Par exemple, il faut vérifier que l’invite correspond bien au format attendu.

tshark -i eth0 -R "ip.addr==78.x.y.10 and sip.CSeq.method eq INVITE" (-V)

Si vous souhaitez capturer l’ensemble du traffic SIP d’une adresse ip spécifique et d’un port spécifique :

tshark -i eth0 -R "ip.addr==78.x.y.10 and port==5060" -z sip,stat

Un autre outil fort utile peut être utilisé, j’ai nommé tcpdump.

tcpdump est un analyseur de paquet. Il utilise libpcap, une librairie C/C++ afin de capturer les paquets.  Vous devez avoir les droits de super utilisateur afin de pouvoir l’utiliser.

Nous allons voir le détail de la commande à utiliser :

-i eth0 — le nom de l’interface à écouter

-n — afin de ne pas résoudre les hostnames

host 1.2.3.4 — filtre le traffic sur cette adresse IP (peut être remplacé par net pour capturer un réseau ex : net 1.2.3.0/24)

proto udp — en général on utilise de l’udp

-w /tmp/file.pcap — pour enregistrer la capture dans un fichier. Mais comme on souhaite avoir le retour en console, on ne vas pas ajouter cette option.

Vous trouverez le détail des options de la commande de tcpdump sur cette page.

Conclusion

Nous venons de voir de manière simple comment débugger un chance SIP entre 2 machines. Vous pouvez utiliser la capture afin de l’importer dans un GUI comme Wireshark afin de réaliser des recherches plus poussées, afficher une vue graphique des échanges ou générer des statistiques.

Il est aussi possible d’utiliser d’autres outils comme ngrep. Je vous présenterai dans un prochain article l’outil HOMER.

Text to speech : comment utiliser festival, eSpeak et GoogleTTS avec asterisk, solution de téléphonie open source

Table des matières

Introduction

Il est souvent indispensable de diffuser des messages spécifiques aux appelants, des messages pouvant changer selon le contexte de l’appel (numéro appelé, numéro de compte saisi …). Il est difficile de prévoir tous les cas et d’enregistrer en studio à l’avance toutes les éventualités sans même parler du coût. Je vous propose d’utiliser un service de google permettant de générer un signal audio à partir d’un texte.

Nous allons voir dans cet article 3 moyens différents de réaliser de la synthèse vocale pour notre serveur asterisk.

Note : toutes les commandes sont pour une machine fonctionnant sous debian/ubuntu, mais vous pouvez simplement les transposer pour un autre système d’exploitation linux.

Qu’est-ce que le text to speech ?

Text to speech ou TTS pour les intimes, est une technique informatique permettant de transformer un texte écrit en parole artificielle, autrement dit, c’est de la synthèse vocale. Je vous renvoie sur wikipedia afin de découvrir l’histoire et les techniques de la synthèse vocale.

Il existe plusieurs solutions libres de synthèse vocale : Festival et eSpeak sont les 2 les plus connues fonctionnant sous linux. Nous allons voir l’installation et l’usage sous asterisk.

Une autre solution non libre, mais gratuite et qui à l’avantage de la simplicité : GoogleTTS. GoogleTTS est un service en ligne de Google (ah bon ?) réalisant de la synthèse vocale et qui est de plus, de bonne qualité.

Solution de synthèse vocale Festival

Installation

L’installation est très simple, le paquet étant disponible dans les repos de Debian et Ubuntu mais aussi de Centos.

apt-get install festival speech-tools

Ensuite, vous devez modifier le fichier festival.scm afin de permettre à asterisk de se connecter au serveur festival. Le fichier est situé dans le répertoire /usr/share/festival/

(define (tts_textasterisk string mode)
"(tts_textasterisk STRING MODE)
Apply tts to STRING. This function is specifically designed for
use in server mode so a single function call may synthesize the string.
This function name may be added to the server safe functions."
(let ((wholeutt (utt.synth (eval (list 'Utterance 'Text string)))))
(utt.wave.resample wholeutt 8000)
(utt.wave.rescale wholeutt 5)
(utt.send.wave.client wholeutt)))

Ensuite, il faut démarrer le serveur festival avec la commande suivante :

festival --server 2>&1 > /dev/null &

Bine entendu, il est souhaitable de l’ajouter au fichier /etc/rc.local afin que le serveur festival soit lancé au démarrage de la machine.

Maintenant, nous devons paramétrer asterisk afin de lui indiquer où joindre notre serveur festival. Pour cela il faut modifier le fichier /etc/asterisk/festival.conf comme ci-dessous :

[general]
host=localhost
port=1314
;usecache=yes
;cachedir=/var/lib/asterisk/festivalcache/
festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n

Maintenant, nous allons vérifier que le module est bien chargé par asterisk en entrant cette commande en cli :

CLI> core show application festival

  -= Info about application 'Festival' =-

[Synopsis]
Say text to the user.

[Description]
Connect to Festival, send the argument, get back the waveform, play it to
the user, allowing any given interrupt keys to immediately terminate and return
the value, or 'any' to allow any number back (useful in dialplan).

[Syntax]
Festival(text[,intkeys])

[Arguments]
Not available

[See Also]
Not available

Si vous obtenez une sortie comme celle-ci , c’est parfait, sinon chargez le module manuellement :

CLI> module load app_festival.so

Utilisation

Nous allons maintenant le tester en modifiant le fichier /etc/asterisk/extensions.conf :

;Festival demo
exten => s, 1, Answer()
exten => s, n, Festival('Welcome! Your phone number is ${CALLERID(num)}.')
exten => s, n, Hangup()

Le résultat est acceptable sans être exceptionnel. Je ne vous ai pas présenté l’installation de la langue française, car la qualité n’est pas suffisante en regard des autres solutions que je vais présenter dans la suite de ce post. Mais comme festival est une solution open source nativement intégrée avec asterisk, il me semblait important de vous en parler.

Solution de synthèse vocale eSpeak

Installation

Tout d’abord, il faut installer les fichiers de développement d’asterisk. Ensuite, il est d’installer eSpeak. Pour nous simplifier la vie, nous allons utiliser les paquets, mais pour un serveur de production je vous encourage à installer eSpeak via les sources.

apt-get install espeak
apt-get install asterisk-espeak

L’installation via les paquets est maintenant terminée.

Utilisation

Nous allons voir l’utilisation de eSpeak au sein du dialplan asterisk. La commande à utiliser est Espeak et est assez simple à utiliser. Voici la syntaxe :

Espeak(text[,intkeys,language])

Le texte est entre guillemets, intkey peut prendre 2 valeurs, soit any, soit une des touches du téléphones et language la langue souhaitée. Voici un exemple :

;eSpeak Demo

exten => 1234,1,Answer()

;;Play mesage using default language as set in espeak.conf

exten => 1234,n,Espeak("This is a simple espeak test in english.",any)

;;Play message in Spanish

exten => 1234,n,Espeak("Esta es una simple prueba espeak en español.",any,es)

;;Play message in Greek

exten => 1234,n,Espeak("Αυτό είναι ένα απλό τέστ του espeak στα ελληνικά.",any,el)

;;Read a text file from disk (relative to the channel language)

;;and play it with espeak using the asterisk channel language.

exten => 1234,n,ReadFile(MYTEXT=/path/${LANGUAGE}/myfile,200)

exten => 1234,n,Espeak("${MYTEXY}",any,${LANGUAGE})

exten => 1234,n,Hangup()

Le logiciel est sous licence GPL, vous êtes donc libre de l’utiliser et bien entendu de l’améliorer.

Solution de synthèse vocale GoogleTTS

Installation

Afin d’utiliser GoogleTTS sur notre serveur asterisk, il est nécessaire que notre serveur ait un accès à internet (le script doit faire appel aux serveurs de Google) mais il nécessite aussi l’installation des paquets suivants :

apt-get install perl libwww-perl sox mpg123

Ensuite, nous allons utiliser un script AGI développer par Zaf, asterisk-googletts. Le script est développé en PERL.

Premièrement, localisez l’emplacement du dossier agi-bin afin d’y installer le script. Pour cela, vérifiez la variable astagidir dans le fichier asterisk.conf . Ensuite téléchargez le fichier googletts.agi dans ce répertoire :

wget https://raw.github.com/zaf/asterisk-googletts/master/googletts.agi
chmod +x googletts.agi

Maintenant, vous avez terminé l’installation !.

Utilisation

L’utilisation est extrêmement simple. Il suffit de faire un appel agi afin d’utiliser la synthèse vocale. Voici un exemple simple :

;DEMO GoogleTTS
exten => S,1,Answer()
exten => s,n,agi(googletts.agi,"Asterisk vous parle enfin.",fr)
exten => s,n,Hangup()

Un peu d’explication : googgletts.agi accepte plusieurs variables (4) que nous allons détailler :

  • La première contient le texte. L’exemple est parlant !
  • La seconde contient la langue qui doit être utilisée (par défaut en-US). La liste est très longue.
  • Les autres variables sont optionnelles :
    • 3ème variable : elle peut prendre soit la valeur « any » ou n’importe quel chiffre ou # ou * . Quand un de ces éléments est saisi par l’appelant sur son clavier téléphonique, la lecture du texte est arrêtée.
    • 4ème variable correspond à la vitesse de lecture (par défaut la valeur vaut 1). Vous pouvez accélérer la lecture en utilisant par exemple cette valeur 1.2 .

L’utilisation est assez simple et le résultat est convaincant. La communication avec les serveurs de Google se fait en clair, mais il est possible d’utiliser une connexion cryptée (pour cela, il faut modifier le script PERL.

Conclusion

Nous avons vu 3 solutions différentes afin de réaliser de la synthèse vocale sous asterisk. Sachez qu’il en existe d’autres gratuites ou payantes de différente qualité. A part festival dont la qualité me semble juste, eSpeak et GoogleTTS apporte une qualité suffisante pour la plus part des installations. Quelle solution utilisez-vous ?

Asterisk : Comment configurer odbc pour stocker les cdr dans mysql

Procédure afin d’installer et configurer odbc pour un serveur linux debian afin d’y stocker nos précieux CDR.

Table des matières

Introduction

Tout d’abord nous allons supposer que les serveurs Asterisk et MySQL sont parfaitement installés et configurés (et sécurisés 🙂 ). Ce n’est pas l’objet de ce guide (Howto).

Installation d’ODBC

Nous allons commencer par installer les drivers ODBC nécessaires. Installer les paquets nécessaires pour le bon fonctionnement de ODBC et MySQL :

apt-get install unixodbc libmyodbc unixodbc iodbc

Maintenant, nous allons configurer odbc afin de se connecter à notre serveur MySQL.

Paramétrage de ODBC

Editer le fichier suivant /etc/odbcinst.ini, et copier les éléments suivants :

[MySQL]
Description = MySQL ODBC Driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout = 0
CPReuse = 0

Maintenant, il faut éditer /etc/odbc.ini et ajouter le code suivant :

[MySQL-asterisk]
Description = Connection to MySQL
Driver = MySQL
Socket = /var/run/mysqld/mysqld.sock
Server = localhost
User = YourUsername
Password = YourPassword
Database = YourDatabase
Option = 3

N’oublier pas d’adapter le User, Password et Database selon vos éléments, sinon vous obtiendrez une belle erreur !.

Création de la base de données CDR

Connectez vous à votre serveur MySQL et entrez le code suivant (attention aux espaces qui peuvent causer des erreurs)

CREATE TABLE cdr(calldate DATETIME NOT NULL,clid varchar(80) NOT NULL DEFAULT'aDefaultValue',src varchar(80) NOT NULL DEFAULT 'aDefaultValue',dstVARCHAR(80) NOT NULL DEFAULT 'aDefaultValue',dcontext VARCHAR(80) NOT NULLDEFAULT  'aDefaultValue',channel VARCHAR(80) NOT NULL DEFAULT 'aDefaultValue',dstchannel VARCHAR(80) NOT NULL DEFAULT'aDefaultValue',lastapp VARCHAR(80) NOT NULL DEFAULT  'aDefaultValue',lastdataVARCHAR(80) NOT NULL DEFAULT  'aDefaultValue',duration int(11) NOT NULLDEFAULT '0',billsec int(11) NOT NULL DEFAULT '0',disposition VARCHAR(45) NOTNULL DEFAULT  'aDefaultValue',amaflags int(11) NOT NULL DEFAULT'0',accountcode VARCHAR(20) NOT NULL DEFAULT  'aDefaultValue',uniqueidVARCHAR(32) NOT NULL DEFAULT  'aDefaultValue',userfield VARCHAR(255) NOT NULLDEFAULT 'aDefaultValue');

GRANT ALL PRIVILEGES ON YourDatabase.* TO YourUsername@localhost IDENTIFIED BY 'YourPassword';

FLUSH PRIVILEGES;

Il faut tester le bon fonctionnement de notre connecteur ODBC avant d’aller plus loin. Entrez cette commande dans votre terminal :

isql -v MySQL-asterisk

Si tout fonctionne correctement, vous êtes connecté, sinon vous devriez voir un gentil message d’erreur 🙁 .

Paramétrage d’asterisk

Configuration d’ODBC

Nous allons commencer par paramétrer les fichiers de configuration d’Asterisk afin qu’il puisse utiliser ODBC afin de se connecter au serveur MySQL. Pour cela, nous allons éditer le fichier /etc/asterisk/res_odbc.conf et y ajouter :

[mysql]
enabled => yes
dsn => MySQL-asterisk
username => YourUsername
password => YourPassword
pre-connect => yes

puis, éditer le fichier /etc/asterisk/cdr_odbc.conf, et remplacer les lignes par celles-ci :

[global]
dsn=MySQL-asterisk
;username=asterisk
;password=asterisk
loguniqueid=yes
dispositionstring=yes
table=cdr ;"cdr" is default table name
usegmtime=no

Configuration de cdr.conf

Pour cela, nous allons éditer le fichier /etc/asterisk/cdr.conf et activer l’enregistrement des CDR dans une base de données via ODBC. Pour cela modifier au début du fichier :

enabled = yes

puis ajouter à la fin du fichier les lignes suivantes :

[odbc]
usegmtime=yes
loguniqueid=yes
loguserfiled=yes

Et maintenant redémarrer votre serveur Asterisk, connectez vous à la console et vérifier que le module res_odbc est bien chargé (reload res_odbc). faites de même avec le module cdr_odbc.

Puis faites un appel afin de vérifier que son CDR est bien dans la base de données.

Conclusion

Après avoir suivi attentivement ce guide, vous avez maintenant une installation Asterisk où vous pouvez enregistrer vos CDR via ODBC dans une base de données MySQL locale ou distante. Vous pouvez ainsi par exemple stocker les CDRs de vos serveurs Asterisk dans une base de données centralisées afin d’exploiter des données riches avec une application comme CDR-STATS, afin d’analyser vos appels et extraire de jolies stats pour les chefs.

 

Asterisk : comment lire un numéro de téléphone à l’appelant

Nous allons voir comment asterisk peut annoncer un numéro de téléphone à l’appelant. En France, on ne lit un numéro de téléphone en annonçant chaque nombre le composant, mais par groupe de 2 ( 014012… est lu zero un, quarante, douze … et non zero, un, quatre, zero, un , deux …). Pour cela nous allons utiliser l’application app_playpack.so.

Table des matières

Fonctionnement

L’application app_playback.so se paramètre dans le fichier de configuration say.conf. L’application utilisée afin de lire le numéro est Playback().

Pré requis

Il faut s’assurer que dans sip.conf, dans la section [general] que vous ayez la définition suivante :

language=fr

Ensuite, éditez asterisk.conf et ajoutez dans le context [options] et ajouter :

languageprefix = yes

Les fichiers de voix française sont bien entendu installés.

Ensuite, vous devez avoir le fichier say.conf dans /etc/asterisk et ce fichier doit contenir les patterns pour le français.

Configuration

Modifiez say.conf afin d’avoir les lignes suivantes :

[fr](date-base,digit-base)
_[n]um:0X => num:${SAY:0:1}, num:${SAY:1:1}

...

;numeros 0800 : 0800, 0811... 0899
_pho[n]e:08XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:3},num:${SAY:4:2}, num:${SAY:6:2},num:${SAY:8:2}

;numeros de telephones fixes et mobiles
_pho[n]e:0[1-79]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}

Ensuite, faites un reload ( ou juste « module reload app_playback.so ») afin de prendre en compte les changements.

Un exemple d’utilisation

Voici un exemple de code à ajouter dans un contexte du fichier extensions.conf :

[pres-num-tel-fr]
exten => 0011,1,Playback(phone:0140456789,say)
exten => 0011,n,Hangup

ou si vous souhaitez utiliser votre AGI en utilisant le PERL :

$AGI->exec("PLAYBACK num:0140456789,say ""n");

Voilà votre asterisk programmé afin d’énoncer à la manière française les numéros de téléphone.

Comment sécuriser le SIP d’un serveur asterisk ?

Comme convenu lors de mes voeux, voici mon premier article technique de 2012 touchant la sécurité informatique et plus précisément comment sécuriser le SIP d’un serveur asterisk.

Je ne vais pas vous rappeler l’intérêt (quand on touche au portefeuille, on comprend de suite beaucoup plus vite) de bien sécuriser son serveur de téléphonie. Asterisk est de plus en plus déployé en entreprise, apportant une flexibilité et des fonctionnalités pour un coût incomparable. Asterisk sait gérer plusieurs protocoles de communications dont le SIP. Nous allons voir dans cet article comment sécuriser le SIP.

Cet article est « presque » indépendant de la version d’Asterisk (les différences seront indiquées), ceci étant d’autant plus important que pour des questions de stabilité ou de compatibilité de code, beaucoup de solutions n’ont pas migré vers la dernière version stable. On trouve couramment en production des 1.4 .

Du point de vue SIP, Asterisk est un B2BUA. Un B2BUA (back-to-back user agent) est un élément logique du réseau dans les applications SIP. Il intervient entre les deux terminaisons d’un appel et divise la communication en deux appels indépendants. Tous les messages de controls passent par le B2BUA, ce qui lui permet d’intervenir lors de l’appel afin de lancer si nécessaire des applications comme l’interception, l’enregistrement, la diffusion de messages … Par contre asterisk n’est pas un proxy SIP. Il intègre quelques unes des fonctions (routage des appels, serveur registrar), mais gère de manière incomplète l’ensemble des messages SIP. Ce n’est tout simplement pas son job.

Afin de protéger notre serveur asterisk, il est judicieux de mettre en frontal un proxy SIP comme Opensips ou Kamailio. Ainsi, toutes les requêtes SIP seront dirigées vers l’interface publique du Proxy SIP. Cela va nous permettre ainsi d’isoler Asterisk. De plus, nous obtenons une architecture plus évolutive (load balancing ou fail over entre 2 serveurs asterisk synchronisés) et plus résistante aux attaques de déni de services. Un proxy SIP a été construit pour supporter un grand nombre de requêtes SIP, ce qui n’est pas le cas d’un serveur Asterisk.

Nous allons ainsi pouvoir paramétrer de manière précise comment notre proxy va répondre aux demandes selon leurs profils, bannir des adresses IP qui auraient un comportement anormal, et détecter des attaques selon des dictionnaires. On peut aussi bannir par défaut des IP selon leur origine géographique, ce qui est très utile si vos clients ne sont qu’en France ou en Europe par exemple.

De plus, Asterisk ne supporte les communications sécurisées (TLS) que depuis la version 1.8 (une version beta patchée 1.6 existe, mais il n’est pas conseillé de l’utiliser en production). Cela ajoute en plus une charge complémentaire sur le serveur. Dans notre schéma, les flux TLS seront gérés par le proxy SIP qui renverra un flux non crytpé à notre asterisk.

Voilà notre schéma :

SIP Channels (réseau public et privé) < —–> PROXY SIP < ——-> ASTERISK < ——> DAHDI, IAX …. channels (réseau privé)

Asterisk fonctionne en Realtime intégrant ainsi dans sa base de données les comptes utilisateurs SIP. Le proxy va vérifier les comptes et l’état des postes SIP dans cette base. L’authentification est gérée par le proxy SIP. Quand un appel arrive et qu’il est authentifié, le proxy le renvoie vers le serveur asterisk. Si l’utilisateur est est disponible (utilisateur interne ou externe via un trunk SIP opérateur), asterisk renvoie l’appel au proxy SIP qui renvoie l’appel au destinataire final.

Ainsi, lors d’une tentative d’attaque, le serveur asterisk est complètement isolé, et c’est le proxy SIP qui les gèrera.