在上一篇文章中,我们研究了使用Ubuntu 20.04在RuVDS虚拟服务器上从常规存储库中简单安装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 PBX的modules.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协议栈配合使用,并扩展拨号计划以接听来电,组织会议并解决其他呼叫路由任务。细心的读者可能已经注意到示例中未使用某些已加载的模块:我们将需要它们来学习如何记录呼叫,创建队列和执行其他有趣的技巧。
阅读我们的博客)