PBX virtuel. Partie 2: Résolvez les problèmes de sécurité avec Asterisk et configurez les appels



Dans l'article précédent, nous avons examiné une installation simple d'un PBX IP (IP PBX) Asterisk 16 à partir d'un référentiel régulier sur un serveur virtuel RuVDS avec Ubuntu 20.04 . Dans une telle configuration, vous ne devez pas exposer le service VoIP au public: vous devez définir des paramètres supplémentaires, y compris ceux liés à la sécurité des informations.



Définition du modèle de menace



Pour commencer, voyons les risques auxquels une entreprise qui a placé un PBX virtuel sur Internet sera confrontée. Toute leur diversité se résume à une courte liste:



  • fuites de donnĂ©es confidentielles et corruption de contenu (dĂ©tournement de session);
  • accès non autorisĂ© aux systèmes d'information de l'entreprise en raison de vulnĂ©rabilitĂ©s dans Asterisk et d'autres logiciels sur le serveur, en particulier en raison d'une configuration incorrecte;
  • perturbation du PBX virtuel en raison d'attaques par dĂ©ni de service;
  • revendre du trafic après avoir piratĂ© un PBX (le type d'attaque le plus courant).


Certaines des vulnérabilités sont directement liées au logiciel Asterisk. Les développeurs de PBX IP publient régulièrement des correctifs, et les administrateurs système ne peuvent installer les mises à jour qu'en temps opportun. Cette méthode ne garantit pas une sécurité totale, il vaut donc la peine de limiter l'accès des clients au serveur de téléphonie IP. Voyons ce qu'il faut faire pour organiser la téléphonie sécurisée.



Configurer un pare-feu



Le moyen le plus simple de vous protéger est de restreindre les connexions client à un pare-feu. Puisque VDS a une adresse IP réelle, il n'est pas nécessaire de résoudre les problèmes de trafic passant par NAT. Il reste à autoriser les connexions entrantes des abonnés et à bloquer toutes les autres utilisant Netfilter . Sur les serveurs virtuels RuVDS avec Ubuntu, il est configuré à l'aide de l'utilitaire UFW (Uncomplicated Firewall) préinstallé . Si vous n'avez pas installé le package ufw, il est facile de le réparer:



sudo apt-get install ufw


Commençons par vérifier le statut:



sudo ufw status verbose


Par défaut, UFW est désactivé (Statut: inactif), mais il ne faut pas se précipiter pour l'activer: si vous ne modifiez pas les paramètres, tous les paquets entrants commenceront à être piratés à la racine et vous perdrez l'accès au serveur via SSH. Au minimum, vous devez autoriser les connexions entrantes sur le port 22, tandis que vous pouvez utiliser le profil d'application OpenSSH préinstallé (afficher les profils: sudo ufw app list):



#    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


Pour afficher la politique de filtrage, utilisez la commande:



sudo ufw status verbose




Pour supprimer des règles, vous devez voir leurs numéros:



sudo ufw status numbered
sudo ufw delete N




Il existe d'autres outils pour configurer Netfiler (les mêmes iptables), mais vous ne devez pas combiner différents utilitaires - cela pose de nombreux problèmes. Cela ne fonctionnera pas sans filtrer le trafic, car votre Asterisk ne restera pas debout pendant une heure lorsqu'il est ouvert à tous les vents, car de telles images amusantes apparaîtront dans la console:





Puisque les utilisateurs distants sont chez eux (en théorie), en règle générale, ils ont une véritable IP dédiée, et nous n'avons besoin de rien d'autre. Sinon, vous devez prendre soin de créer un réseau privé virtuel sécurisé: il sera également utile pour accéder à d'autres ressources d'entreprise qui ne devraient pas être exposées au public. Des défenses plus sophistiquées (fail2ban, etc.) ne sont pas directement liées à Asterisk. Nous les examinerons également dans un contexte général dans d'autres articles.



Se débarrasser des modules inutiles



Cette partie de la configuration n'est pas directement liée à la sécurité, mais est généralement nécessaire. De plus, moins votre PBX offre aux clients d'opportunités, plus il est difficile de le pirater - l'absence de fonctionnalités inutiles compliquera dans une certaine mesure la vie des attaquants potentiels.



La fonctionnalité minimale du PBX ressemble à ceci:



  • Prise en charge SIP;
  • Prise en charge du codec G711 uniquement (si vous le souhaitez, vous pouvez ajouter tous les codecs disponibles);
  • Enregistrement d'appel;
  • Prise en charge du format WAV (si vous le souhaitez, vous pouvez ajouter la prise en charge de tous les formats disponibles);
  • Facultatif : prise en charge du stockage des dĂ©tails des appels sur le serveur de base de donnĂ©es.


Pour gérer le service Asterisk de manière interactive, utilisez la console de texte intégrée:



sudo asterisk -rvv


Les fichiers de module * .so sont stockés dans le répertoire / usr / lib / asterisk / modules / . Le chargement et le téléchargement peuvent se faire dans la console sans avoir à redémarrer le serveur (le nom du module est spécifié sans extension, par exemple, chan_sip au lieu de chan_sip.so ): les paramètres du module Asterisk se trouvent dans le fichier de configuration /etc/asterisk/modules.conf . Par défaut, tous les modules disponibles sont chargés automatiquement au démarrage du serveur, mais cela peut être facilement modifié à l'aide du paramètre autoload = yes | no . Éditons le fichier de configuration, après avoir fait une copie de sauvegarde du fichier de distribution:



module load NAME

module unload NAME








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


Il existe deux approches de configuration. Dans le premier cas, nous activons le chargement automatique de tous les modules existants, et désactivons ceux qui ne sont pas nécessaires via modules.conf (section [modules] ): Veuillez noter que nous spécifions ici le nom du fichier avec l'extension. La deuxième option est de désactiver le chargement automatique de tous et de spécifier uniquement les modules nécessaires dans la section [modules] du fichier modules.conf , par exemple, comme ceci: Après l'édition, modifiez les droits d'accès:



[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




Nous regardons la liste des modules chargés dans la console Asterisk:



module show





Nous ajoutons d'autres modules au goût. Voici comment le fichier modules.conf recherchera la configuration d'un PBX IP avec une fonctionnalité suffisamment développée:



Contenu 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





Remarque: vous pouvez commenter une ligne Ă  l'aide d'un point-virgule.



Après avoir modifié le fichier modules.conf, vous devez recharger les modules à partir de la console Asterisk:



module reload



Si vous devez redémarrer Asterisk, utilisez la commande suivante au lieu de la console intégrée:



sudo systemctl restart asterisk


Tous les modules appelés doivent être installés, sinon Asterisk échouera en essayant de les charger. Par exemple, pour prendre en charge le format MP3, vous devez installer le paquet asterisk-mp3 , et pour travailler avec le serveur MySQL, vous aurez besoin directement d' astérisque-mysql :



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


La recherche de packages disponibles dans le référentiel est facile à l'aide de la commande:



apt-cache search asterisk


En fait, il existe de nombreux autres modules pour Asterisk, nous ne les avons pas tous listés. Si, par exemple, vous installez un PBX sur un serveur physique et que vous souhaitez y connecter des lignes analogiques via une carte d'interface de téléphonie, vous aurez besoin du package asterisk-dahdi .



Configurer la VoIP



Modifions maintenant le fichier sip.conf afin de pouvoir travailler avec Asterisk:



sudo nano /etc/asterisk/sip.conf


Ajoutez les lignes suivantes à la section [general] , si vous ne l'avez pas déjà fait: Le premier paramètre protège Asterisk des attaques par force brute. Si vous ne l'activez pas, le serveur informera les attaquants lorsque l'abonné n'existe pas. Après avoir trouvé un numéro valide, un hacker peut procéder à des mots de passe par force brute. Si alwaysauthreject = yes , les erreurs d'authentification pour les abonnés existants et inexistants se ressemblent et il est plus difficile de deviner le mot de passe. Le paramètre allowguest = no interdit ce que l'on appelle. appels d'invités aux utilisateurs du PBX. Vous pouvez également changer le port qu'Asterisk écoute en un port non standard à l'aide de la directive bindport (de même, l'adresse qui écoute le service VoIP est configurée à l'aide de bindaddr ).



alwaysauthreject=yes

allowguest=no








Dans le fichier sip.conf, nous avons enregistré des abonnés (pairs - de pairs anglais) PBX. Si l'utilisateur travaille depuis une adresse IP fixe, cela vaut la peine de limiter sa connectivité. Il est également nécessaire de créer des mots de passe forts, d'introduire une limite sur le nombre d'appels et, bien sûr, d'enregistrer les connexions à des fournisseurs VoIP externes (les soi-disant trunks - à partir du tronc anglais):



deny=0.0.0.0/0.0.0.0 ;interdire les connexions à partir de tous les nœuds

permit=xxx.xxx.xxx.xxx/24 ;autoriser les connexions à partir d'un sous-réseau spécifique

secret=_ ;les mots de passe d'abonné doivent être résistants à force brute

call-limit=2 ; limitant le nombre d'appels simultanés



En conséquence, le fichier sip.conf ressemblera à ceci:



Contenu 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





Dans ce cas, l'abonné 1001 peut se connecter à partir de n'importe quelle adresse d'un sous-réseau spécifique, et 1002 - uniquement à partir d'une adresse IP fixe. Nous avons également donné aux abonnés un numéro, un mot de passe, un nom et un contexte, qui seront utilisés dans le plan de routage des appels (plan de numérotation). Les instructions de configuration des jonctions sont mieux prises sur les sites des prestataires de services: dans notre cas, il s'agit de SIPNET . Les paramètres sont similaires à ceux des autres pairs - les extensions. Notez également que le contexte spécifié dans le fichier de configuration (nous parlerons de cette entité ci-dessous) doit exister dans dialplan.



Après avoir apporté des modifications au fichier de configuration sip.conf , vous devez redémarrer le module SIP via la console Asterisk:



sip reload



Autres commandes de console intégrées pour travailler avec le module SIP:



sip show peers- affichage de l'Ă©tat de tous les trunks / pairs;

sip show registry- affichage de toutes les inscriptions;

sip show channels- affichage des canaux actifs;

sip show settings- visualiser les paramètres globaux du module SIP.





Dialplan et tout-tout-tout



Un plan de routage d'appel ou un plan de numérotation est souvent appelé le cœur d'Asterisk. Il est stocké dans le fichier /etc/asterisk/extensions.conf et est essentiellement un script qui oblige le PBX à répondre aux événements externes. Les scripts de plan d'appel peuvent être écrits dans différentes langues, mais nous considérerons celui intégré, qui est apparu dans les premières versions du populaire IP PBX. Après avoir configuré et démarré Asterisk, il y aura du contenu dans le fichier extensions.conf . Remplacez-le par le nôtre: la syntaxe du script est assez simple, nous reviendrons plus en détail dans le prochain article. Notez seulement que le plan d'appels d'Asterisk est basé sur quatre concepts centraux:



[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]

;








  • Contextes - parties nommĂ©es du code communiquant entre elles (les noms sont entre crochets): ensembles d'instructions;
  • (extensions) — , exten;
  • — , ( ) ( n — next). exten same;
  • (applications) — . , Dial — , .


Les extensions trient les appels selon un masque en utilisant un ensemble de modèles, en commençant par un trait de soulignement - cela fait comprendre à notre PBX que nous parlons d'un modèle:



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



Ensuite, la priorité est indiquée et l'appel à l'application avec des arguments de passage est assez simple.



Redémarrez le plan de numérotation à l'aide de la console Asterisk:



dialplan reload



Pour afficher le plan de numérotation actuel, utilisez la commande:



dialplan show







Notez que, par exemple, les modules que vous avez chargés peuvent apporter des modifications au plan de numérotation.



Désormais, le PBX permet aux abonnés internes de communiquer entre eux, ainsi que de passer des appels externes en Russie via SIPNET. Ce n'est pas beaucoup, mais suffisant pour la deuxième leçon. Dans la configuration actuelle, le module obsolète chan_sip a été utilisé , qui sera finalement abandonné dans Asterisk. Dans le prochain article, nous examinerons la migration vers la bibliothèque PjSIPpour travailler avec la pile de protocoles VoIP, ainsi que pour étendre le plan de numérotation pour recevoir des appels entrants, organiser des conférences et résoudre d'autres tâches de routage d'appels. Les lecteurs attentifs ont peut-être remarqué que certains des modules chargés n'étaient pas utilisés dans les exemples: nous en aurons besoin pour apprendre à enregistrer les appels, créer des files d'attente et faire d'autres trucs intéressants.





Lisez notre blog)










All Articles