Настройка сервера с asterisk и Freepbx 14 версии

Июль 20th, 2017 | от | asterisk, freepbx

Июл
20

В прошлой статье была описана процедура установки Asterisk и Freepbx 14 на CentOS 7
В первую очередь после установке нужно озаботиться безопасностью системы

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

1. Создадим администратора и установим для него пароль. Если система доступна через интернет, то желательно устанавливать как можно более сложный пароль администратора FreePBX

Создайте администратора системы FreePBX, установите пароль

Создайте администратора системы FreePBX, установите пароль


2. Выбор языка системы и файлы стандартных звуков. Так как мы собирали asterisk 14 с дополнительными русскими звуковыми файлами - то система уже предлагает их выбрать

Выбор языка системы и звуковых файлов

Выбор языка системы и звуковых файлов

Настройка firewalld

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

3. Сменим стандартный SIP порт

Так сканеры SIP как правило рыщат в интернете в поисках отрытых стандартного SIP-порта 5060, не лишней мерой по увеличению безопасности будет сменить его на какой-то другой
например на 5069
Сделать это можно в Settings->Asterisk SIP settings->Chan PJSIP settings:

FreePBX 14 - сменить стандартный SIP порт

FreePBX 14 - сменить стандартный SIP порт

Добавим правила в firewalld для того, чтобы разрешить доступ к портам, которые использует Asterisk SIP, IAX, RTP

firewall-cmd --zone=public --add-port=5069/udp --permanent
firewall-cmd --zone=public --add-port=5069/tcp --permanent
firewall-cmd --zone=public --add-port=4569/udp --permanent
firewall-cmd --zone=public --add-port=10000-20000/udp --permanent
firewall-cmd --reload

4. Настройка fail2ban

fail2ban - это локальный сервис, который просматривает логи на предмет попытки подобрать пароли. Если такие попытки найдены, fail2ban блокирует ip-адрес источника используя iptables или в нашем случае firewalld
Нам защитить от попыток перебора ssh, sip, apache(веб-интерфейс)
Для этого установим fail2ban

yum install fail2ban

добавим в fail2ban в автостарт

systemctl enable fail2ban

Создадим файл с настройками для всех профилей
/etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8
ignorecommand =
bantime = 3600
findtime = 600
maxretry = 4

bantime - время на которое будет банится адрес
maxretry - количество неудачных попыток залогинится после которых fail2ban будет блокировать адрес
findtime - это время за которое было сделано maxretry

Создадим тюрьму для защиты sshd
/etc/fail2ban/jail.d/sshd.local

[sshd]
enabled = true
port = ssh
#action = firewallcmd-ipset
logpath = %(sshd_log)s
maxretry = 5
bantime = 86400

Чтобы проверить, что все работает попробуйте с сторонего адреса(не с того где вы сейчас установили ssh сессию) 4-5 раз подключиться используя неправильный пароль

fail2ban-client status
Status
|- Number of jail:  1
`- Jail list:   sshd

Чтобы вытащить адрес из тюрьмы можно воспользоваться командой

fail2ban-client set sshd unbanip IPADDRESS

Для того, чтобы freepbx писал файлы с правильной датой необходимо указать php временную зону не только в файле /etc/php.ini, но и чере веб-интерфейс FreePBX
Advanced Settings->PHP Timezone

Установим правильную временную зону для FreePBX

Установим правильную временную зону для FreePBX

Создадим фильтр для бана
filter.d/freepbx-auth.conf

[Definition]
## All Asterisk log messages begin like this:
log_prefix= \[\]\s*
failregex = ^%(log_prefix)s Authentication failure for .* from \<HOST\>
#ignoreregex =

а также тюрьму
jail.d/freepbx-gui.local

[freepbx-gui]
enabled = true
filter = freepbx-auth
logpath = /var/log/asterisk/freepbx_security.log
bantime  = 86400
findtime = 600
maxretry = 3

Чтобы проверить, что наш самописный фильтр работает нужно сделать несколько неудачных попыток входа в веб-интерфейс и выполнить команду

fail2ban-regex /var/log/asterisk/freepbx_security.log /etc/fail2ban/filter.d/freepbx-auth.conf

После нескольких неудачных попыток(более 3 в данном случае) адрес будет заблокирован

ipset list

Теперь создадим правила для попадания в тюрьму адресов различных SIP сканеров
jail.d/asterisk.local

[asterisk]
enabled  = true
filter   = asterisk
logpath  = /var/log/asterisk/fail2ban
findtime = 1800
bantime  = 1800
maxretry = 6

Стандартный фильтр немного дополним
filter.d/asterisk.conf

[INCLUDES]
before = common.conf
[Definition]
_daemon = asterisk
__pid_re = (?:\[\d+\])
iso8601 = \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+[+-]\d{4}
# All Asterisk log messages begin like this:
log_prefix= (?:NOTICE|SECURITY)%(__pid_re)s:?(?:\[C-[\da-f]*\])? \S+:\d*( in \w+:)?
failregex = ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Registration from '[^']*' failed for '<HOST>(:\d+)?' - (Wrong password|Username/auth name mismatch|No matching peer found|Not a local domain|Device does not match ACL|Peer is not supposed to register|ACL error \(permit/deny\)|Not a local domain)$
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Call from '
[^']*' \(<HOST>:\d+\) to extension '[^']*' rejected because extension not found in context
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Request from '
[^']*' failed for '<HOST>:\d+' .+ No matching endpoint found$
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Host <HOST> failed to authenticate as '[^']*'$
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s No registration for peer '
[^']*' \(from <HOST>\)$
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Host <HOST> failed MD5 authentication for '[^']*' \([^)]+\)$
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Failed to authenticate (user|device) [^@]+@<HOST>\S*$
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s hacking attempt detected '
<HOST>'$
            ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s SecurityEvent="(FailedACL|InvalidAccountID|ChallengeResponseFailed|InvalidPassword)",EventTV="([\d-]+|%(iso8601)s)",Severity="[\w]+",Service="[\w]+",EventVersion="\d+",AccountID="(\d*|<unknown>)",SessionID=".+",LocalAddress="IPV[46]/(UDP|TCP|WS)/[\da-fA-F:.]+/\d+",RemoteAddress="IPV[46]/(UDP|TCP|WS)/<HOST>/\d+"(,Challenge="[\w/]+")?(,ReceivedChallenge="\w+")?(,Response="\w+",ExpectedResponse="\w*")?(,ReceivedHash="[\da-f]+")?(,ACLName="\w+")?$
            ^(%(__prefix_line)s|\[\]\s*WARNING%(__pid_re)s:?(?:\[C-[\da-f]*\])? )Ext\. s: "Rejecting unknown SIP connection from <HOST>"$
            ^(%(__prefix_line)s|\[\]\s*WARNING%(__pid_re)s:?(?:\[C-[\da-f]*\])? )Ext\. s: Friendly Scanner from <HOST>$
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>:.*' - Username/auth name mismatch
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>:.*' - Device does not match ACL
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>:.*' - Not a local domain
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>:.*' - Peer is not supposed to register
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>:.*' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>' - Wrong password
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>' - No matching peer found
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>' - Username/auth name mismatch
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>' - Device does not match ACL
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>' - Not a local domain
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>' - Peer is not supposed to register
            NOTICE.* .*: Registration from '
.*' failed for '<HOST>' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '
".*".*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '
".*".*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: Registration from '
".*".*' failed for '<HOST>:.*' - Failed to authenticate
            NOTICE.* .*: Registration from '
".*".*' failed for '<HOST>:.*' - No matching endpoint found
            ^.* NOTICE\[\d+\] res_pjsip/pjsip_distributor\.c: Request from '
"\d+" <sip:\d+@.*>' failed for '<HOST>.* \(callid: .*\) - No matching endpoint found$
            NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: Sending fake auth rejection for device .*\<sip:.*\@<HOST>\>;tag=.*
            NOTICE.* .*: <HOST> tried  to authenticate with nonexistent user '.*'
            ^(%(__prefix_line)s|\[\]\s*WARNING%(__pid_re)s:?(?:\[C-[\da-f]*\])? )Ext\. s: "Rejecting unknown SIP connection from <HOST>"$


ignoreregex =

Далее в файле /etc/fail2ban/jail.conf в разделе [asterisk] нужно закомментировать следующую строку

port = 5060,5061

Теперь нужно в настройках Asterisk настроить запись логов в нужный файл, для этого в файле /etc/asterisk/logger_logfiles_custom.conf

fail2ban => security,notice,warning,error

Для проверки, можно использовать sipsak, чтобы отправить некорректные запросы на авторизацию:
sipsak -U -s sip:s@AsteriskIP:5069
sipsak -U -s sip:s@AsteriskIP:5069
sipsak -U -s sip:s@AsteriskIP:5069

4. Настройка времени
установим ntp

yum install ntp
systemctl start ntpd
systemctl enable ntpd

в /etc/ntp/ntp.conf

server 0.ua.pool.ntp.org
server 1.ua.pool.ntp.org
server 2.ua.pool.ntp.org
server 3.ua.pool.ntp.org

Настройка FreePBX

1. Создание внутренних номеров pjsip FreePBX 14
Application->Extensions->Add new PJSIP extension

Добавить новый внутренний номер FreePBX

Добавить новый внутренний номер FreePBX

Чтобы система писала разговоры - добавим настройку в табе
Advanced->yes

Настройка записи разговоров в FreePBX

Настройка записи разговоров в FreePBX

2. Руссификация звуков asterisk
Admin->Sound Language->Russian (ru)->Download

Руссификация звуков Asterisk

Руссификация звуков Asterisk

Admin->Sound Language->Settings->Global Language->Russian

Выбор языка FreePBX

Выбор языка FreePBX

Для проверки можно с телефона наборать *65, если все прошло нормально - то asterisk на русском языке проиграет:
Ваш эктеншн номер 8001.

3. Установка дополнительных модулей, которые полезны при создании офисной АТС или call-центра
Доустановим следующие модули:

  • Backup & Restore
  • Blacklist
  • Announcements
  • Call Forward
  • Follow Me
  • IVR
  • Queues
  • Set CallerID
  • Calendar
  • Time Conditions
Установка модулей PBX

Установка модулей PBX

Об авторе

Оставить комментарий