虚拟PBX。第2部分:使用Asterisk解决安全问题并建立呼叫



在上一篇文章中,我们研究了使用Ubuntu 20.04RuVDS虚拟服务器上从常规存储库中简单安装IP PBX(IP PBX)Asterisk 16的过程在这样的配置中,不值得向公众公开VoIP服务:您需要进行其他设置,其中包括与信息安全性相关的其他设置。



定义威胁模型



首先,让我们弄清楚将虚拟PBX放置在Internet上的公司将面临的风险。他们所有的多样性归结为一小段:



  • 机密数据泄漏和内容损坏(会话劫持);
  • 由于Asterisk和服务器上其他软件的漏洞,特别是由于配置错误,导致未经授权访问公司信息系统;
  • 由于拒绝服务攻击而导致虚拟PBX中断;
  • 入侵PBX(最常见的攻击类型)后转售流量。


一些漏洞与Asterisk软件直接相关。IP PBX开发人员会定期发布补丁程序,并且系统管理员只能及时安装更新。此方法不能保证完全的安全性,因此也值得限制客户端对IP电话服务器的访问。让我们看看组织安全电话应该做什么。



配置防火墙



保护自己的最简单方法是将客户端连接限制到防火墙。由于VDS具有真实IP,因此无需解决通过NAT的流量问题。它仍然允许来自订户的传入连接,并通过Netfilter阻止所有其他连接具有Ubuntu的虚拟服务器RuVDS上,它是使用预安装的UFW(非复杂防火墙)实用程序配置的如果您没有安装ufw软件包,则很容易修复:



sudo apt-get install ufw


首先,让我们检查一下状态:



sudo ufw status verbose


默认情况下,UFW处于禁用状态(状态:不活动),但您不要急于启用它:如果不更改设置,所有传入数据包将开始在根上被黑,并且您将无法通过SSH访问服务器。至少应允许端口22上的传入连接,同时可以使用预安装的OpenSSH应用程序配置文件(查看配置文件: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


要查看过滤策略,请使用以下命令:



sudo ufw status verbose




要删除规则,您需要查看其编号:



sudo ufw status numbered
sudo ufw delete N




还有其他用于配置Netfiler的工具(相同的iptables),但您不应组合使用不同的实用程序-这充满了问题。如果不过滤流量,它将无法正常工作,因为您的星号在狂风中无法站立一个小时,因为这样有趣的图片将出现在控制台中:





由于远程用户在家里(理论上),他们通常具有真正的专用IP,我们不需要任何其他东西。否则,您应该注意创建一个安全的虚拟专用网络:它也将用于访问不应公开的其他公司资源。更复杂的防御措施(fail2ban等)与Asterisk不直接相关。我们还将在其他文章中以一般的语境看待它们。



摆脱不必要的模块



配置的这部分与安全性没有直接关系,但是通常是必需的。此外,您的PBX给客户提供的机会越少,破解它的难度就越大-缺少不必要的功能将在一定程度上使潜在入侵者的生活变得复杂。



PBX的最低功能如下所示:



  • SIP支持;
  • 支持仅G711 alaw编解码器(如果需要,可以添加所有可用的编解码器);
  • 通话录音
  • 支持WAV格式(如果需要,您可以添加对所有可用格式的支持);
  • 可选:支持在数据库服务器上存储呼叫详细信息。


要以交互方式管理Asterisk服务,请使用内置的文本控制台:



sudo asterisk -rvv


模块文件* .so存储在/ usr / lib / asterisk / modules /目录中。上载和下载可以在控制台中进行,而不必重新启动服务器(指定模块名称时不带扩展名,例如chan_sip而不是chan_sip.so): 在配置文件/etc/asterisk/modules.conf中可以找到Asterisk Module设置。默认情况下,所有可用的模块都会在服务器启动时自动加载,但是可以使用autoload = yes | no参数轻松更改。在创建分发文件的备份副本之后,让我们编辑配置文件:



module load NAME

module unload NAME








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


有两种配置方法。在第一种情况下,我们启用所有现有模块的自动加载,并通过modules.conf[modules]部分禁用不必要的模块请注意,此处我们以扩展名指定文件名。 第二个选项是禁用所有文件的自动加载,并在modules.conf文件[modules]节中仅指定必要的模块,例如,如下所示: 编辑后,更改访问权限:



[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




我们在Asterisk控制台中查看已加载模块的列表:



module show





我们添加了其他模块来尝试。这是使用具有充分开发的功能来配置IP PBXmodules.conf文件的外观



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





注意:您可以使用分号注释掉一行。



修改modules.conf文件之后,必须从Asterisk控制台重新加载模块:



module reload



如果需要重新启动Asterisk,请使用以下命令代替内置控制台:



sudo systemctl restart asterisk


必须安装所有被调用的模块,否则Asterisk在尝试加载它们时将失败。例如,要支持MP3格式,您必须安装asterisk-mp3软件包,但要直接与MySQL服务器一起使用,则需要asterisk-mysql



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


使用以下命令很容易找到存储库中可用的软件包:



apt-cache search asterisk


实际上,Asterisk还有更多模块,我们没有列出所有模块。例如,如果您在物理服务器上安装PBX,并希望通过电话接口板将模拟线路连接到PBX,则将需要asterisk-dahdi软件包



配置VoIP



现在,我们更改sip.conf文件,以便我们可以使用Asterisk:



sudo nano /etc/asterisk/sip.conf


如果尚未 将以下行 添加到[general]部分,请执行以下操作:第一个参数可保护Asterisk免受蛮力攻击。如果不启用它,则服务器将在订户不存在时通知攻击者。找到有效的号码后,黑客可以使用蛮力密码。如果alwaysauthreject = yes,则现有和不存在的订户的身份验证错误看起来相同,并且更难猜测密码。参数allowguest = no禁止所谓的。 PBX用户的访客呼叫。您也可以改变端口的Asterisk监听使用非标准一个bindport指令(同样,地址侦听到VoIP服务是利用被配置bindaddr)。



alwaysauthreject=yes

allowguest=no








在sip.conf文件中,我们注册了PBX订户(对等-来自英语对等体)。如果用户使用固定IP,则值得限制其连接性。还必须创建强密码,限制呼叫数量,当然还要注册到外部VoIP提供商的连接(所谓的中继-来自英语中继):



deny=0.0.0.0/0.0.0.0 ;禁止来自所有节点的

permit=xxx.xxx.xxx.xxx/24 ;连接,允许来自特定子网的连接

secret=_ ;用户密码必须能够抵抗蛮力

call-limit=2 ; 限制了同时调用的次数,



因此,sip.conf文件将如下所示:



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





在这种情况下,用户1001可以从特定子网的任何地址连接,而1002-仅可以从固定IP连接。我们还为订户提供了一个号码,密码,名称和上下文,这些号码将在呼叫路由计划(拨号计划)中使用。最好在服务提供商的站点上获取配置中继的说明:在我们的例子中,这是SIPNET。这些参数与其他对等方(扩展)的参数相似。还要注意,在配置文件中指定的上下文(我们将在下面讨论该实体)必须存在于Dialplan中。



更改sip.conf配置文件后,您需要通过Asterisk控制台重新启动SIP模块:



sip reload



其他内置控制台命令以使用SIP模块:



sip show peers-显示所有中继/对等体的状态;

sip show registry-显示所有注册;

sip show channels-显示活动频道;

sip show settings-查看SIP模块的全局设置。





拨号计划和所有所有



呼叫路由计划或拨号计划通常被称为Asterisk的核心。它存储在/etc/asterisk/extensions.conf文件中,实际上是使PBX响应外部事件的脚本。呼叫计划脚本可以用不同的语言编写,但是我们将考虑内置的脚本,该脚本出现在流行的IP PBX的第一个版本中。配置并启动Asterisk之后,extensions.conf文件中将包含一些内容。让我们用我们自己的替换它: 脚本语法非常简单,我们将在下一篇文章中更详细地介绍。仅注意,Asterisk的呼叫计划基于四个中心概念:



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

;








  • 上下文-代码中彼此通信的命名部分(名称括在方括号中):指令集;
  • (extensions) — , exten;
  • — , ( ) ( n — next). exten same;
  • (applications) — . , Dial — , .


扩展使用一组模式(以下划线开头)通过掩码对调用进行排序-它使我们的PBX理解我们正在谈论的模式:



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



接下来,将指示优先级,并且对带有传递参数的应用程序的调用非常简单。



使用Asterisk控制台重新启动拨号计划:



dialplan reload



要查看当前的拨号计划,请使用以下命令:



dialplan show







请注意,例如,您已加载的模块可以更改Dialplan。



现在,PBX允许内部用户彼此通信,以及通过SIPNET在俄罗斯境内进行外部呼叫。这虽然不多,但足以用于第二节课。在当前配置中,已使用了已弃用的chan_sip模块,该模块最终将在Asterisk中终止。在下一篇文章中,我们将研究迁移到PjSIP可以与VoIP协议栈配合使用,并扩展拨号计划以接听来电,组织会议并解决其他呼叫路由任务。细心的读者可能已经注意到示例中未使用某些已加载的模块:我们将需要它们来学习如何记录呼叫,创建队列和执行其他有趣的技巧。





阅读我们的博客)










All Articles