
No artigo anterior, vimos uma instalação simples de um IP PBX (IP PBX) Asterisk 16 de um repositório regular em um servidor virtual RuVDS com Ubuntu 20.04 . Nessa configuração, não vale a pena expor o serviço VoIP ao público: você precisa fazer configurações adicionais relacionadas, entre outras coisas, à segurança da informação.
Definindo o modelo de ameaça
Para começar, vamos descobrir os riscos que uma empresa que colocou um PBX virtual na Internet enfrentará. Toda a sua diversidade se resume a uma pequena lista:
- vazamentos de dados confidenciais e corrupção de conteúdo (sequestro de sessão);
- acesso não autorizado a sistemas de informação corporativa devido a vulnerabilidades no Asterisk e outro software no servidor, em particular, devido à configuração incorreta;
- interrupção de PBX virtual devido a ataques de negação de serviço;
- revender o tráfego após hackear um PBX (o tipo mais comum de ataque).
Algumas das vulnerabilidades estão diretamente relacionadas ao software Asterisk. Os desenvolvedores de IP PBX lançam patches regularmente e os administradores de sistema só podem instalar atualizações em tempo hábil. Este método não garante segurança total, por isso também vale a pena limitar o acesso dos clientes ao servidor de telefonia IP. Vamos ver o que deve ser feito para organizar a telefonia segura.
Configurando um firewall
A maneira mais fácil de se proteger é restringir as conexões do cliente a um firewall. Como o VDS tem IP real, não há necessidade de resolver problemas com o tráfego que passa pelo NAT. Resta permitir conexões de entrada de assinantes e bloquear todas as outras usando o Netfilter . Em servidores virtuais RuVDS com Ubuntu, ele é configurado usando o utilitário UFW (Uncomplicated Firewall) pré-instalado . Se você não tiver o pacote ufw instalado, é fácil de consertar:
sudo apt-get install ufw
Primeiro, vamos verificar o status:
sudo ufw status verbose
Por padrão, o UFW está desabilitado (Status: inativo), mas você não deve se apressar em habilitá-lo: se você não alterar as configurações, todos os pacotes recebidos começarão a ser hackeados na raiz e você perderá o acesso ao servidor via SSH. No mínimo, você deve permitir conexões de entrada na porta 22, enquanto pode usar o perfil de aplicativo OpenSSH pré-instalado (ver perfis: 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
Para visualizar a política de filtragem, use o comando:
sudo ufw status verbose

Para excluir regras, você precisa ver seus números:
sudo ufw status numbered
sudo ufw delete N

Existem outras ferramentas para configurar o Netfiler (o mesmo iptables), mas você não deve combinar utilitários diferentes - ele está repleto de problemas. Não funcionará sem filtrar o tráfego, porque o seu Asterisk não resistirá por uma hora quando aberto a todos os ventos, visto que imagens engraçadas aparecerão no console:

Como os usuários remotos estão em casa (em teoria), eles geralmente têm um IP dedicado real e não precisamos de mais nada. Caso contrário, você deve ter o cuidado de criar uma rede privada virtual segura: ela também será útil para acessar outros recursos corporativos que não devem ser expostos ao público. Defesas mais sofisticadas (fail2ban, etc.) não estão diretamente relacionadas ao Asterisk. Vamos olhar para eles no contexto geral em outras postagens também.
Livrar-se de módulos desnecessários
Esta parte da configuração não está diretamente relacionada à segurança, mas geralmente é necessária. Além disso, quanto menos oportunidades seu PBX fornecer aos clientes, mais difícil será hackea-lo - a ausência de funcionalidade desnecessária complicará, até certo ponto, a vida de invasores em potencial.
A funcionalidade mínima do PBX é parecida com esta:
- Suporte SIP;
- Suporte para codec G711 apenas (se desejar, pode adicionar todos os codecs disponíveis);
- Gravação de chamadas;
- Suporte para formato WAV (se desejar, você pode adicionar suporte para todos os formatos disponíveis)
- Opcional : suporte para armazenar detalhes da chamada no servidor de banco de dados.
Para gerenciar o serviço Asterisk interativamente, use o console de texto integrado:
sudo asterisk -rvv
Os arquivos de módulo * .so são armazenados no diretório / usr / lib / asterisk / modules / . Upload e download podem ser feitos no console sem a necessidade de reiniciar o servidor (o nome do módulo é especificado sem uma extensão, por exemplo, chan_sip ao invés de chan_sip.so ): as configurações do Módulo Asterisk encontradas no arquivo de configuração /etc/asterisk/modules.conf . Por padrão, todos os módulos disponíveis são carregados automaticamente na inicialização do servidor, mas isso pode ser facilmente alterado usando o parâmetro autoload = yes | no . Vamos editar o arquivo de configuração, depois de fazer uma cópia de backup do arquivo de distribuição:
module load NAME
module unload NAME
sudo mv /etc/asterisk/modules.conf /etc/asterisk/modules.conf.b
sudo nano /etc/asterisk/modules.conf
Existem duas abordagens para configuração. No primeiro caso, habilitamos o carregamento automático de todos os módulos existentes e desabilitamos os desnecessários por meio de modules.conf (seção [módulos] ): Observe que aqui especificamos o nome do arquivo com a extensão. A segunda opção é desabilitar o carregamento automático de todos e especificar apenas os módulos necessários na seção [módulos] do arquivo modules.conf , por exemplo: Após editar, altere os direitos de acesso:
[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
Vemos a lista de módulos carregados no console do Asterisk:
module show

Adicionamos outros módulos a gosto. É assim que o arquivo modules.conf parecerá para configurar um IP PBX com uma funcionalidade suficientemente desenvolvida:
Conteúdo 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: você pode comentar uma linha usando um ponto e vírgula.
Depois de modificar o arquivo modules.conf, você deve recarregar os módulos do console do Asterisk:
module reload
Se você precisar reiniciar o Asterisk, use o seguinte comando em vez do console integrado:
sudo systemctl restart asterisk
Todos os módulos chamados devem ser instalados, caso contrário, o Asterisk irá falhar ao tentar carregá-los. Por exemplo, para suportar o formato MP3, você deve instalar o pacote asterisk-mp3 e, para trabalhar com o servidor MySQL, precisará diretamente do asterisk-mysql :
sudo apt-get install asterisk-mp3
sudo apt-get install asterisk-mysql
Encontrar pacotes disponíveis no repositório é fácil usando o comando:
apt-cache search asterisk
Na verdade, existem muitos mais módulos para o Asterisk, não listamos todos eles. Se você, por exemplo, instalar um PBX em um servidor físico e quiser conectar linhas analógicas a ele por meio de uma placa de interface de telefonia, precisará do pacote asterisk-dahdi .
Configurando VoIP
Agora vamos mudar o arquivo sip.conf para que possamos trabalhar com o Asterisk:
sudo nano /etc/asterisk/sip.conf
Adicione as seguintes linhas à seção [geral] , se ainda não o fez: O primeiro parâmetro protege o Asterisk de ataques de força bruta. Se você não ativá-lo, o servidor informará os invasores quando o assinante não existir. Tendo encontrado um número válido, um hacker pode usar senhas de força bruta. Se alwaysauthreject = yes , os erros de autenticação para assinantes existentes e não existentes têm a mesma aparência e é mais difícil adivinhar a senha. O parâmetro allowguest = no proíbe o assim chamado. chamadas de convidados para usuários de PBX. Você também pode alterar a porta que o Asterisk escuta para um não padrão usando a diretiva bindport (da mesma forma, o endereço que escuta o serviço VoIP é configurado usando bindaddr ).
alwaysauthreject=yes
allowguest=no
No arquivo sip.conf registramos assinantes (pares - de pares ingleses) PBX. Se o usuário trabalha com IP fixo, vale a pena limitar sua conectividade. Também é necessário criar senhas fortes, introduzir um limite no número de chamadas e, claro, registrar conexões a provedores VoIP externos (os chamados troncos - do tronco inglês):
deny=0.0.0.0/0.0.0.0 ;
proibir conexões de todos os nós
permit=xxx.xxx.xxx.xxx/24 ;
permite conexões de uma sub-rede específica
secret=_ ;
as senhas dos assinantes devem ser resistentes a força bruta
call-limit=2 ;
limitando o número de chamadas simultâneas
Como resultado, o arquivo sip.conf terá a seguinte aparência:
Conteúdo 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
Nesse caso, o assinante 1001 pode se conectar de qualquer endereço de uma sub-rede específica e 1002 - apenas de um IP fixo. Também fornecemos aos assinantes um número, senha, nome e contexto, que serão utilizados no plano de roteamento de chamadas (dialplan). As instruções para a configuração dos troncos são melhor realizadas nos sites dos provedores de serviço: no nosso caso, é o SIPNET . Os parâmetros são semelhantes aos de outros pares - extensões. Observe também que o contexto especificado no arquivo de configuração (falaremos sobre essa entidade a seguir) deve existir no dialplan.
Depois de fazer alterações no arquivo de configuração sip.conf , você precisa reiniciar o módulo SIP através do console do Asterisk:
sip reload
Outros comandos de console integrados para trabalhar com o módulo SIP:
sip show peers
- exibindo o status de todos os troncos / pares;
sip show registry
- exibição de todos os registros;
sip show channels
- exibição de canais ativos;
sip show settings
- visualizar as configurações globais do módulo SIP.

Dialplan e tudo-tudo-tudo
Um plano de roteamento de chamadas ou dialplan é freqüentemente referido como o coração do Asterisk. Ele é armazenado no arquivo /etc/asterisk/extensions.conf e é essencialmente um script que faz o PBX responder a eventos externos. Os scripts do plano de chamadas podem ser escritos em diferentes idiomas, mas consideraremos o idioma integrado, que apareceu nas primeiras versões do popular IP PBX. Após configurar e iniciar o Asterisk, haverá algum conteúdo no arquivo extensions.conf . Substitua-o pelo nosso: a sintaxe do script é bastante direta, entraremos em mais detalhes no próximo artigo. Observe apenas que o plano de chamadas do Asterisk é baseado em quatro conceitos centrais:
[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 - partes nomeadas do código que se comunicam entre si (os nomes estão entre colchetes): conjuntos de instruções;
- (extensions) — , exten;
- — , ( ) ( n — next). exten same;
- (applications) — . , Dial — , .
As extensões classificam as chamadas por uma máscara usando um conjunto de padrões, começando com um sublinhado - faz nosso PBX entender que estamos falando sobre um padrão: a
exten => _1XXX,1,Dial(SIP/${EXTEN})
seguir, a prioridade é indicada e a chamada para o aplicativo com a passagem de argumentos é bastante simples.
Reinicie o dialplan usando o console do Asterisk:
dialplan reload
Para ver o dialplan atual, use o comando:
dialplan show

Observe que, por exemplo, os módulos que você carregou podem fazer alterações no dialplan.
Agora, o PBX permite que os assinantes internos se comuniquem entre si, bem como façam chamadas externas dentro da Rússia via SIPNET. Não é muito, mas o suficiente para a segunda lição. Na configuração atual, o módulo chan_sip obsoleto foi usado , o que será descontinuado no Asterisk com o tempo. No próximo artigo, veremos como migrar para a biblioteca PjSIPpara trabalhar com a pilha do protocolo VoIP, bem como estender o dialplan para receber chamadas, organizar conferências e resolver outras tarefas de roteamento de chamadas. Leitores atentos devem ter notado que alguns dos módulos carregados não foram usados nos exemplos: vamos precisar deles para aprender como gravar chamadas, criar filas e fazer outros truques interessantes.

Leia nosso blog)

