SIP安全
# 介绍
运行在公网的 Freeswitch 服务器 (opens new window),每天都会接收到很多恶意的呼叫请求和注册请求,从而尝试盗打电话。但是每天大量的攻击,会导致 Freeswitch 产生很多日志,进而降低 Freeswitch 的处理能力。所以需要合理的配置,来防止电话被盗打。
解决方案:利用 cti 模块与 fail2ban 配置结合,可以把恶意IP封堵掉。进而解决服务器被攻击问题。
# 攻击案例
在 Freeswitch 控制台中,如果频繁输出这样的日志,而且日志中的IP:124.32.10.1
和账户:1177
,用户都不认识,就可以认定该服务器被攻击了。
2024-04-13 17:21:01.959347 98.47% [NOTICE] cti_fail2ban.c:35 write to fail2ban:ip[124.32.10.1] user[1177] at[2024-04-13T17:21:01.959347+0800] Registration failed succeed!
# 防盗打配置
重中之重:不要开通国际长途。其次对于呼出拨号方案和呼入路由要小心配置。
- sip配置里面的external默认是可以任意呼入,默认的呼叫路由是public,public这个路由绝对不要启用呼叫外线功能。
- sip配置里面如果新加了sip项目也同第一点。
- sip配置里面的internal这个是用来分机注册的,auth-calls 必须是勾选,千万不能吧这个勾选去除。
- 分机配置里分机密码设置复杂些。不要勾选allow-empty-apssword。
- 对于提供给网关注册的分机的呼叫路由改成pulibc。
- 呼叫外线的拨号方案要谨慎启用。如果不需要分机拨打外线,千万不要启用呼叫外线的拨号方案,有分机拨打外线的需求是只能在internal路由可以启用呼叫外线的拨号方案。启用了呼叫外线,要确定sip->internal->auth-calls 是勾选的,所有分机密码也要改成足够复杂的,并且要测试一下注册错误的情况下,直接拨号是否可以拨打出去,来验证配置准确无误。
- 如果只有浏览器(wss)可以拨打外线,可以把sip->internal->sip-port 配置的 udp的sip端口防火墙封了去,只放开wss端口。
# 允许呼入配置
在 CCAdmin-Web 中,可以配置指定IP允许呼入,这样的配置同样可以提高中间件的安全性。具体配置方法如下:
CCAdmin-Web -> 呼叫中心 -> SIP设置 -> external -> 变量 :
apply-inbound-acl
设置为inbound
-> 点击“确定”按钮。CCAdmin-Web -> 呼叫中心 -> 配置文件设置 -> 配置文件:
acl.conf
中的 inbound 添加允许呼入的IP -> 点击“保存”按钮。对应格式如下:<list name="inbound" default="deny"> <node type="allow" cidr="127.0.0.1/32"/> </list>
1
2
3重启 Freeswitch,使配置生效。
# fail2ban 的安装与配置
# 安装 fail2ban
yum安装:
yum install fail2ban -y
源代码安装:
git clone https://github.com/fail2ban/fail2ban.git
或者wget https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz
tar xzvf 1.0.2.tar.gz
cd fail2ban-1.0.2
python setup.py install
cp build/fail2ban.service /usr/lib/systemd/system
# 编辑jail.conf
以此执行以下命令:
cd /etc/fail2ban
mv jail.conf jail.conf.local
vi jail.conf
将以下的内容写入到文件:vi jail.conf 中:
[cti] enabled = true filter = cti action = iptables-allports[name=cti, protocol=all] logpath = /ddt/fs/log/cti_fail2ban.log bantime = 86400 maxretry = 5 findtime = 300 ignoreip = 127.0.0.1/8 backend = auto
1
2
3
4
5
6
7
8
9
10内容配置说明:
logpath
: 监视cti记录的异常IP日志。bantime
:封堵时间,单位秒,86400秒就是24小时。maxretry findtime
:(300秒)时间内日志文件出现的IP超过maxretry(5)次就封堵。ignoreip
:ip白名单。
# 设置日志文件权限
给/ddt/fs/log/目录修改安全上下文,可执行命令:chcon -R -t var_log_t /ddt/fs/log
也可以直接关闭sulinux,如果不修改安全上下文,会导致fail2ban启动失败。
# 设置filter
- 执行命令:
vi /etc/fail2ban/filter.d/cti.conf
- 把以下内容写入进去:
[Definition]
failregex = ^ip\[<HOST>\].*
ignoreregex =
2
3
# fail2ban启动关闭相关命令
- 设置开机启动fail2ban命令:
systemctl enable fail2ban
- 启动fail2ban命令:
systemctl start fail2ban
- 关闭fail2ban命令:
systemctl stop fail2ban
- 重启fail2ban命令:
systemctl restart fail2ban
- 查看fail2ban状态命令:
systemctl status fail2ban
# 查看被ban IP命令
fail2ban-client status cti
在输出结果中, File list 要看到了日志文件名才可以。如果 File list 看不到文件名,说明fs还没启动,需要先启动freeswitch,然后再执行命令:systemctl restart fail2ban
重启fail2ban程序。
# fail2ban 操作
手动封堵一个IP:
fail2ban-client set cti banip IP地址
手动解封一个IP:
fail2ban-client set cti unbanip IP地址
添加白名单:
fail2ban-client set cti addignoreip IP地址
删除白名单:
fail2ban-client set cti delignoreip IP地址
查看被禁止的IP地址:
iptables -L -n