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)