Безопасность Asterisk

Безопасность Asterisk

Безопасность Asrterisk – разумеется самый важный инструмент использования IP-телефонии на данной платформе. Мы очень часто сталкиваемся с различным видами атак на Asterisk. Неверная настройка и незнание простых правил влекут за собой финансовые потери для предприятия, которое использует PBX Asterisk.

В данной статье мы расскажем об основополагающих механизмах, обеспечивающих безопасность Asterisk. Мы также рассмотрим механизмы безопасности Linux, несомненно нацеленные на устойчивость к атакам к Asterisk. Нами разработаны правила безопасности, требующие особого внимания.

Устойчивые к взлому пароли и логины.

Во-первых, пароли и логины SIP-аккаунтов, администраторов, менеджеров Asterisk (AMI, API) и на сетевых устройствах (VoIP-шлюзы, SIP-транки с регистрацией) должны состоять не менее чем из 13 символов (буквы, цифры, спецсимволы, смена регистра). Во-вторых, не следует использовать стандартные логины в системе, такие как admin, administrator, manager и т.д.

Правильная настройка SIP в Asterisk – sip.conf.

Для защиты от сканеров следует изменить стандартный порт SIP, запретить гостевые вызовы и регистрации, overlap-наборы, подписку на информацию о статусе канала и т.д. Полное описание параметров general sip.conf описано в статье. Ниже приведены настройки файла /etc/asterisk/sip.conf прежде всего для сервера Asterisk с комментариями:

[general]
context=default          ;По-умолчанию назначаем неиспользуемый контекст для исходящих вызовов
allowguest=no            ;Запрещаем гостевые (без аутентификации) подключения
match_auth_username=no   ;Запрещаем использование поля 'username' вместо 'from'
allowoverlap=no          ;Запрещаем набор по одной цифре
;allowtransfer=no        ;Запрещаем использование переадресации
realm=CUCM11.5(1)SU3     ;Используем свое доменное имя сервера (скрываем что Asterisk)
;domainsasrealm=no
;recordonfeature=automixmon
bindport=9050            ;Меняем порт SIP сигнализации
udpbindaddr=0.0.0.0      ;Адрес UDP по-умолчанию
tcpenable=yes            ;Включаем поддержку TCP (вдруг у вас есть Avaya)
tcpbindaddr=0.0.0.0      ;Адрес TCP по-умолчанию
;tlsenable=no
;tlsbindaddr=0.0.0.0
;tcpauthtimeout = 30
;tcpauthlimit = 100
;websocket_enabled = true
;websocket_write_timeout = 100
transport=udp           ;Транспорт по-умолчанию
srvlookup=yes           ;Разрешаем осуществлять вызовы по DNS-именам
;pedantic=yes
;tos_sip=cs3
;tos_audio=ef
;tos_video=af41
;tos_text=af41
;cos_sip=3
;cos_audio=5
;cos_video=4
;cos_text=3
;maxexpiry=3600
;minexpiry=60
;defaultexpiry=120
;submaxexpiry=3600
;subminexpiry=60
;mwiexpiry=3600
;maxforwards=70
qualifyfreq=60         ;Устанавливаем проверку доступности хоста в 60 секунд
;qualifygap=100
;qualifypeers=1
;keepalive=60
;notifymimetype=text/plain
;buggymwi=no
;mwi_from=asterisk
;vmexten=voicemail
;preferred_codec_only=yes
disallow=all          ;Запрещаем все кодеки
allow=alaw            ;Разрешаем Alaw
allow=ulaw    ;Разрешаем Ulaw
;autoframing=yes
;mohinterpret=default
;mohsuggest=default
;parkinglot=plaza
language=ru           ;Делаем русский язык в системе по-умолчанию
tonezone=ru           ;Определяем глобальную тонзону в Ru
relaxdtmf=yes         ;Включим распознавание плохо распознаваемых DTMF сигналов
;trustrpid = no
;sendrpid = yes
rpid_update=yes       ;Немедленное оповещение встречного сервера об изменениях состоянии линии
;trust_id_outbound = no
;prematuremedia=no
;progressinband=no
callerid=CUCM11.5(1)SU3   ;Если у нас где-то не установлен CallerID - делаем его символьным
useragent=Cisco-SIPGateway/IOS-12.x ;А в качестве PBX у нас Cisco-SIPGateway
;promiscredir = no
;usereqphone = no
dtmfmode=rfc2833          ;Устанавливаем тон нажатия кнопок на телефонном аппарате
;compactheaders = yes
videosupport=yes          ;Включаем поддержку видео-вызова
;textsupport=no
maxcallbitrate=2048       ;Максимальный битрейт видеосвязи
authfailureevents=yes    ;Устанавливаем статус Peer, если он не может авторизоваться=rejected
alwaysauthreject=yes     ;Если запрос аутентификации был отклонен, то в ответе НЕ будет написано, что юзер введен неверно, защита перебора имен пользователей
auth_options_requests=yes  ;Требуем авторизацию при посылках OPTION и INVITE
;accept_outofcall_message = no
;outofcall_message_context = messages
auth_message_requests=yes  ;Включаем аутентификацию запросов MESSAGE
;g726nonstandard = yes
;outboundproxy=proxy.provider.domain:8080
;supportpath=yes
;rtsavepath=yes
;matchexternaddrlocally = yes
;dynamic_exclude_static = yes
;contactdeny=0.0.0.0/0.0.0.0
;contactpermit=172.16.0.0/255.255.0.0
;contactacl=named_acl_example
;rtp_engine=asterisk
;regcontext=sipregistrations
regextenonqualify=yes   ;Если включено quality для пира и он выпадает, то * убивает этот экстеншен из regcontext
;legacy_useroption_parsing=yes
;send_diversion=no
;shrinkcallerid=yes
;use_q850_reason = no
;refer_addheaders=yes
autocreatepeer=no   ;Отключаем регистрацию UAC без аутентификации
t1min=200    ;Минимальная задержка прохождения сообщений до хоста и обратно
;timert1=500
;timerb=32000
rtptimeout=600    ;Прерываем вызов если нет активности RTP медиапотоков через 600 секунд
rtpholdtimeout=300   ;Прерываем вызов если нет активности RTP медиапотоков в режиме Hold через 300 секунд
;rtpkeepalive=
;session-timers=originate
;session-expires=600
;session-minse=90
;session-refresher=uac
;sipdebug = yes
;recordhistory=yes
;dumphistory=yes
;allowsubscribe=no
;subscribecontext = default
;notifyringing = no
;notifyhold = yes
;notifycid = yes
callcounter=yes    ;Активируем счетчик вызовов
t38pt_udptl=yes    ;Включаем поддержку T.38 c FEC коррекцией ошибок
faxdetect=yes    ;Включаем определение CNG и T.38
nat=auto_force_rport,auto_comedia ;Находим Nat автоматически и медиаданные на порт с котрого Asterisk их получил а не то что получил в SDP
;media_address = 172.16.42.1
;subscribe_network_change_event = yes
;icesupport = yes
directmedia=no    ;Направляем RTP-трафик напрямую между пирами, минуя Asterisk
;directrtpsetup=yes
;directmediadeny=0.0.0.0/0
;directmediapermit=172.16.0.0/16
;directmediaacl=acl_example
;ignoresdpversion=yes
sdpsession=SIP Call   ;Меняем имя SDP сессии
sdpowner=CiscoSystemsSIP-GW-UserAgent ;Меняем поля пользователя в SDP owner string
;encryption=no
;encryption_taglen=80
;avpf=yes
;force_avp=yes
;rtcachefriends=yes
;rtsavesysname=yes
;rtupdate=yes
;rtautoclear=yes
;ignoreregexpire=yes
;domain=customer.com,customer-context
;allowexternaldomains=no
;allowexternaldomains=no
;fromdomain=mydomain.tld
;snom_aoc_enabled = yes
jbenable=yes    ;Активируем использование RTP буфера для компенсации задержек
;jbforce = no
jbmaxsize=200    ;Устанавливаем максимальный размер RTP буфера 200 мс
;jbresyncthreshold = 1000
;jbimpl = fixed
;jbtargetextra = 40
;jblog = no

Использование нестандартных портов IAX.

Для этого в файле /etc/asterisk/iax.conf в секции [general] меняем параметр bindport=4569 на параметр bindport=9069.

Запуск службы Asterisk.

Служба asterisk.service должна производиться от пользователя (не root), который имеет доступ только к каталогам и файлам Asterisk. О том как это сделать написано в статье.

ACL для SIP Extensions.

Для всех SIP-аккаунтов необходимо устанавливать разрешенные IP-адреса или подсети с помощью файла /etc/asterisk/sip.conf. Пример:

[1XX-SIP](!)
type=friend
context=users
nat=auto_force_rport,auto_comedia
dtmfmode=rfc2833
directmedia=no
host=dynamic
disallow=all
allow=alaw
allow=ulaw
qualify=yes
call-limit=2
deny=0.0.0.0/0.0.0.0
permit=172.20.0.0/255.255.0.0
permit=192.168.0.0/255.255.0.0

[100](1XX-SIP)
secret=Peer_100_Password
callerid="Peer 100" <100>
defaultuser="Peer 100>" <100>

[101](1XX-SIP)
secret=Peer_101_Password
callerid="Peer 101" <101>
defaultuser="Peer 101>" <101>

Также можно контролировать доступ к SIP-аккаунтам с помощью списков контроля доступа /etc/asterisk/acl.conf:

[provoip_acl]
deny=0.0.0.0/0.0.0.0
permit=10.0.0.0/255.0.0.0
permit=172.20.0.0/255.255.0.0
permit=192.168.0.0/16

Далее, созданный ACL подключаем к SIP-аккаунтам:

[1XX-SIP](!)
type=friend
context=users
nat=auto_force_rport,auto_comedia
dtmfmode=rfc2833
directmedia=no
host=dynamic
disallow=all
allow=alaw
allow=ulaw
qualify=yes
call-limit=2

[100](1XX-SIP)
secret=Peer_100_Password
callerid="Peer 100" <100>
defaultuser="Peer 100>" <100>
acl=provoip_acl

[101](1XX-SIP)
secret=Peer_101_Password
callerid="Peer 101" <101>
defaultuser="Peer 101>" <101>
acl=provoip_acl

Лимит вызовов.

Для исходящих вызовов следует ограничивать число одновременно занимаемых каналов с помощью параметра call-limit.

call-limit=2    ;Устанавливаем значение в 2, чтобы пользователь мог сделать transfer

Также для ограничения продолжительности вызова, особенно на международные направления следует использовать функции диалплана:

L(x[:y][:z]) – Ограничить продолжительность вызова до Х миллисекунд. Воспроизвести сообщение, когда Y миллисекунд осталось. Повторять каждые Z миллисекунд, пока не истечет время. Пример:

[to-pstn-mn]
exten => _X.,1,NoOP(Набор с номера ${CALLERID(num)} на абонента ${EXTEN} RDNIS="${CALLERID(rdnis)}" )
exten => _X.,n,Set(GROUP()=mn-limit)
exten => _X.,n,Verbose(1,**** Количество одновременных вызовов ${GROUP_COUNT(mn-limit)})
exten => _X.,n,GotoIf($[${GROUP_COUNT(mn-limit)} > 3]?limit)
exten => _X.,n,Set(CDR(userfield)=unblocked${EXTEN})
exten => _X.,n,Dial(${TRUNK_PSTN}/9${EXTEN},${RING_TIMER},${DIAL_PSTN_OPTIONS}L(120000:100000:10000))
exten => _X.,n(limit),Verbose(**** Количество одновременных вызовов ${GROUP_COUNT(mn-limit)} превышает лимит)
exten => _X.,n,Set(DIALSTATUS=CHANUNAVAIL)
exten => _X.,n,Hangup()

Маршрутизация.

Необходимо убрать все маршруты, используемые по умолчанию и назначить свои собственные с разграничением на контексты:
  • Спецслужбы
  • Локальные наборы
  • Местные вызовы
  • Зоновые вызовы
  • Междугородние вызовы
  • Международные вызовы

Полный перечень кодов ABC, DEF можно взять с официального ресурса Россвязи. Для маршрута по умолчанию сделать:

exten => _X.,1,Hangup()

Использование IPtables

Использование Fail2Ban

Voice VLAN.

IP-телефонию (аппараты и шлюзы) в организации следует “вынести” в отдельный VLAN. А значит данный VLAN конечно же необходимо настраивать с определенными правилами QoS.

Международные направления 8-10.

Устанавливаем только используемые в организации направления и по мере необходимости их добавляем (расширяем). Также делаем оповещение на почту если пользователь или злоумышленник воспользовался неизвестным международным направлением и устанавливаем лимит на каждое соединение и на одновременное число вызовов. Например:
[out-mn]
;============================ Страны СНГ ==========================
;Казахстан
exten => _810[78]XXXXXXXXX,1,Goto(allow-out-mn,${EXTEN},1)
exten => _8107[78]XXXXXXXXX,1,Goto(allow-out-mn,${EXTEN},1)

;Молдова, Армения, Беларусь
exten => _81037[345]XXXXXXX.,1,Goto(allow-out-mn,${EXTEN},1)

;Украина
exten => _810380XXXXXXX.,1,Goto(allow-out-mn,${EXTEN},1)

;Таджикистан, Туркменистан, Азербайджан, Грузия, Кыргыстан, Узбекистан
exten => _81099[234568]XXXXXXX.,1,Goto(allow-out-mn,${EXTEN},1)
;============================ @END Страны СНГ =====================

exten => _810X.,1,System(/usr/bin/sendEmail -f no-replay@pro-voip.ru -s ${MAIL_SERVER} -u 8-10 ALARM GW0.PRO-PBX -m Detected alarm from "${CALLERID(num)}" dialed to "${EXTEN}" -t support@pro-voip.ru)
exten => _810X.,n,Playback(pbx-invalid)
same => n(deny),Hangup(34)

Неиспользуемые каналы и сервисы.

Следует выполнить сканирование системы на предмет открытых портов и служб и прежде всего отключить неиспользуемые. Например, если вы не используете протокол MGCP или Skinny, отключайте эти модули в файле /etc/asterisk/modules.conf:

noload => pbx_gtkconsole.so
noload => chan_alsa.so
noload => chan_console.so
noload => res_ari.so
noload => chan_dahdi.so
noload => codec_dahdi.so
noload => res_ari_device_states.so
noload => res_ari_applications.so
noload => res_ari_channels.so
noload => res_ari_events.so
noload => res_ari_playbacks.so
noload => res_ari_endpoints.so
noload => res_ari_recordings.so
noload => res_ari_bridges.so
noload => res_ari_asterisk.so
noload => res_ari_sounds.so
noload => res_pjsip.so
noload => cdr_mysql.so
noload => res_phoneprov.so
noload => cdr_odbc.so
noload => cdr_pgsql.so
;============================
;  PBX --
noload => pbx_ael.so
;  Channels --
noload => chan_mgcp.so
noload => chan_skinny.so
noload => chan_unistim.so
noload => chan_pjsip.so
noload => chan_modem.so
noload => chan_modem_aopen.so
noload => chan_modem_bestdata.so
noload => chan_modem_i4l.so
noload => chan_alsa.so
noload => chan_oss.so
;  Codecs --
noload => codec_lpc10.so
;  Formats --
noload => format_au.so
noload => format_gsm.so
noload => format_h263.so
noload => format_ilbc.so
noload => format_jpeg.so
;  Applications --
noload => app_image.so
noload => app_zapateller.so
noload => app_zapbarge.so
noload => app_zapscan.so
noload => res_config_ldap.so

Ограничение доступа к IP-АТС.

Если вы планируете предоставлять удалённый доступ для авторизованных сотрудников, лучше всего организовать его при помощи VPN сервера (например, OpenVPN). При необходимости использования Asterisk в публичной сети Интернет, несомненно следует четко проработать правила Firewall (Iptables). Например:
# Generated by iptables-save v1.8.2 on Tue Jan  14 09:00:00 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:VOIP_ACCESS - [0:0]
:blocked_traffic - [0:0]
:f2b-ASTERISK - [0:0]
:f2b-apache-auth - [0:0]
:f2b-apache-badbots - [0:0]
:f2b-apache-botsearch - [0:0]
:f2b-apache-nohome - [0:0]
:f2b-apache-noscript - [0:0]
:f2b-apache-overflows - [0:0]
:f2b-mysqld-auth - [0:0]
:f2b-phpmyadmin-syslog - [0:0]
:f2b-sshd - [0:0]
-A INPUT -j f2b-ASTERISK
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -p tcp -m multiport --dports 80,443 -j f2b-apache-auth
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "eyeBeam" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipcli" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "VaxSIPUserAgent" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "SIVuS" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipvicious" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipsak" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "iWar" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "sundayddr" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "sip-scan" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "friendly-scanner" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "pplsip" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "CSipSimple" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "Gulp" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipv" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "smap" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "friendly-request" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "VaxIPUserAgent" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "siparmyknife" --algo bm --to 65535 -j DROP
-A INPUT -p udp -m udp --dport 5060:5091 -m string --string "Test" --algo bm --to 65535 -j DROP
-A INPUT -m set --match-set badnets src -j blocked_traffic
-A INPUT -m set --match-set badips src -j blocked_traffic
-A INPUT -j LOG
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -p tcp -m conntrack --ctstate INVALID,NEW -m tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j VOIP_ACCESS
-A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 123 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 443 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 1720 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 2000 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 3306 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 4559 -j VOIP_ACCESS
-A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 4569 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5038 -j VOIP_ACCESS
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5060:5091 -j VOIP_ACCESS
-A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 5060:5091 -j VOIP_ACCESS
-A INPUT -p icmp -m conntrack --ctstate NEW -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "DROPPED: " --log-level 7
-A FORWARD -j LOG
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A VOIP_ACCESS -m limit --limit 2/min -j LOG --log-prefix "DROPPED: " --log-level 7
-A VOIP_ACCESS -s 192.168.10.0/24 -j ACCEPT
-A VOIP_ACCESS -j DROP
-A blocked_traffic -j DROP
-A f2b-ASTERISK -j RETURN
-A f2b-apache-auth -j RETURN
-A f2b-apache-badbots -j RETURN
-A f2b-apache-botsearch -j RETURN
-A f2b-apache-nohome -j RETURN
-A f2b-apache-noscript -j RETURN
-A f2b-apache-overflows -j RETURN
-A f2b-mysqld-auth -j RETURN
-A f2b-phpmyadmin-syslog -j RETURN
-A f2b-sshd -j RETURN
COMMIT
# Completed on Tue Jan  14 09:00:00 2020

Современная система телекоммуникаций несомненно основана на взаимодействии большого количества пользователей. Построение сетей связи требует от компаний значительных затрат, разумеется, они ожидают полного возврата своих инвестиций через выручку – плату за услуги. При этом изменение уровня и структуры выручки зависит от многих параметров, во-первых – безопасность Asterisk или используемой IP PBX системы. Алгоритмы и методы работы фродеров бесспорно постоянно эволюционируют. Поэтому ключевой фактор успеха антифрод-деятельности – это непрерывное развитие разумеется с учетом динамики фрод-рынка и выбор надежного технологического партнера, обладающего необходимой экспертизой для пресечения постоянно меняющихся схем работы и новых способов обхода установленных ограничений.


Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.