kamailio 软交换是运营级VOIP平台,安全问题是用户部署中面临的挑战。笔者在以前的文章中针对SIP安全输出了很多的文章,包括了使用外部网元SBC来保证UC的安全等传输。
我们一定要时刻记住,部署Kamailio的目的是构建具有特定功能的SIP信令服务器实现某些特定功能,因此有必要从设计方面总结一些安全性的问题。
- 除非在配置文件中有明确的操作(t_relay(),forward()或类似操作),否则SIP请求不会被转发。请求可以创建会话,并且可能会产生消耗,如果允许呼叫方在转发之前启动此类会话,将增加资源消耗,请小心使用。
- SIP响应在回复处理路由块(reply handling routing)中没有丢弃action操作的话,这个响应会自动转发。SIP响应无法进行身份验证,但也无法启动会话,因此不会为会话带来直接消耗。但是,像任何数据一样,它可以占用带宽,即使它是非常轻量级的消息,也会消耗CPU/内存资源。用户可以使用t_check_trans()来确保每个Kamailio接收到的回复都与一个事务相关联。
- Kamailio提供了一个默认的kamailio.cfg,如果没有这个配置文件,Kamailio将无法启动。用户必须仔细检查配置文件并启用适当的功能,以满足用户的安全运行需求。
默认配置文件中的安全讨论
默认的kamailio.cfg是用户创建更高级配置服务的起点。它包括在本地用户之间路由呼叫和路由呼叫到PSTN网关的功能。但是,网关的地址没有指定(对于每个安装而言是特定的)的,这表示除非更新kamailio.cfg配置,并且在那里设置网关的地址,否则它实际上不会做任何路由。
此外,默认已安装的kamailio.cfg未启用用户身份验证。必须通过定义WITH_AUTH来启用身份验证。在启用验证机制之前,用户需要创建数据库表并将用户配置文件添加到订阅者表中。认证机制是基于本地用户的概念构建的。SIP服务器认为是本地用户的话,此用户的From头域是本地IP地址或者主机名。
一旦启用身份验证,Kamailio将向所有本地用户发出挑战,要求提供安全凭据。无论认证是否启用,呼叫的入局和出局路由都遵循规则:
- 本地用户可以拨打任何地方的电话:给其他本地用户、给其他VoIP网络的外国用户或给PSTN进行呼叫。
- 一个外国用户只能拨打本地用户——不允许拨打其他外国用户(不是开放转发),也不允许拨打PSTN电话(不在本地,无法计费)。
就授权机制而言,默认的kamailio.cfg可以允许未经用户身份验证的呼叫流量通过,但是前提是发送方的IP地址已被列入白名单——其地址存储在数据库表带有组ID 1的地址中。
为了检测和阻止恶意攻击,已安装的默认kamailio.cfg提供了一种检测可能,它启用了可以跟踪特定IP地址的功能,检测该地址在每个时间间隔发送的请求数量,并且在超过阀值时发出警报(2秒内发送16个请求),从该地址丢弃五分钟的呼叫流量。流量检测是使用pike模块完成的,被阻止的地址列表保存在htable模块的哈希表中。
如果用户要启用此功能,请在配置文件中添加 #!define WITH_ANTIFLOOD。配置文件中相关的代码片段如下:
# *** To enable anti-flood detection execute:
# - adjust pike and htable=>ipban settings as needed (default is
# block if more than 16 requests in 2 seconds and ban for 300 seconds)
# !define WITH_ANTIFLOOD
…
#!ifdef WITH_ANTIFLOOD
loadmodule "htable.so"
loadmodule "pike.so"
#!endif
…
428. #!ifdef WITH_ANTIFLOOD
429. # ----- pike params -----
430. modparam("pike", "sampling_time_unit", 2)
431. modparam("pike", "reqs_density_per_unit", 16)
432. modparam("pike", "remove_latency", 4) 433.
434. # ----- htable params -----
435. # ip ban htable with autoexpire after 5 minutes
436. modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
437. #!endif
…
545. route[REQINIT] {
546. #!ifdef WITH_ANTIFLOOD
#"同一IP的洪水检测和执行暂时的流量封禁"。
548. # be sure you exclude checking trusted peers, such as pstn gateways
549. # - local host excluded (e.g., loop to self)
550. if(src_ip!=myself) {
551. if($sht(ipban=>$si)!=$null) {
552. # ip is already blocked
553. xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
554. exit;
555. }
556. if (!pike_check_req()) {
557. xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
558. $sht(ipban=>$si) = 1;
559. exit;
560. }
561. }
562. if($ua =~ "friendly-scanner") {
563. sl_send_reply("200", "OK");
564. exit;
565. }
566. #!endif
…
用户这里要注意,该机制依赖于pike和htable模块。Pike用于计算请求密度,htable用于保留被阻止的IP地址列表。其基本逻辑是:
● 如果发送方是可信的(在这种情况下,请求是从和SIP服务器相同的系统发送的-第550行),则跳过防洪处理。
● 如果此IP已被阻止,丢弃请求。
● 如果IP没有被阻止,则通过pike模块处理,使用pike_check_req()检测。
● 如果以上函数返回false,则意味着已达到设置的上限,IP将被添加到哈希表中以被阻止。
● 最后一个if块是用来检测一些已知攻击工具发送的请求,例如“friendly-scanner”。
作者:james.zhu
来源:SIP实验室
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。